diff --git a/.gitignore b/.gitignore index 52fea99c..53164a64 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ target/ Meilisearch v1.14/ +node_modules/ +.turbo/ \ No newline at end of file diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..1679298b --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,132 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, caste, color, religion, or sexual +identity and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +- Demonstrating empathy and kindness toward other people +- Being respectful of differing opinions, viewpoints, and experiences +- Giving and gracefully accepting constructive feedback +- Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +- Focusing on what is best not just for us as individuals, but for the overall + community + +Examples of unacceptable behavior include: + +- The use of sexualized language or imagery, and sexual attention or advances of + any kind +- Trolling, insulting or derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or email address, + without their explicit permission +- Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders 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, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +[GitHub Issues](https://github.com/tsirysndr/rocksky/issues). All +complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series of +actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or permanent +ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within the +community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.1, available at +[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. + +Community Impact Guidelines were inspired by +[Mozilla's code of conduct enforcement ladder][Mozilla CoC]. + +For answers to common questions about this code of conduct, see the FAQ at +[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at +[https://www.contributor-covenant.org/translations][translations]. + +[homepage]: https://www.contributor-covenant.org +[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html +[Mozilla CoC]: https://github.com/mozilla/diversity +[FAQ]: https://www.contributor-covenant.org/faq +[translations]: https://www.contributor-covenant.org/translations diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..e50de724 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,70 @@ +# Contributing Guidelines + +Thank you for your interest in contributing to our project. Whether it's a bug +report, new feature, correction, or additional documentation, we greatly value +feedback and contributions from our community. + +Please read through this document before submitting any issues or pull requests +to ensure we have all the necessary information to effectively respond to your +bug report or contribution. + +## Reporting Bugs/Feature Requests + +We welcome you to use the GitHub issue tracker to report bugs or suggest +features. + +When filing an issue, please check existing open, or recently closed, issues to +make sure somebody else hasn't already reported the issue. Please try to include +as much information as you can. Details like these are incredibly useful: + +- A reproducible test case or series of steps +- The version of our code being used +- Any modifications you've made relevant to the bug +- Anything unusual about your environment or deployment + +## Contributing via Pull Requests + +Contributions via pull requests are much appreciated. Before sending us a pull +request, please ensure that: + +1. You are working against the latest source on the _master_ branch. +2. You check existing open, and recently merged, pull requests to make sure + someone else hasn't addressed the problem already. +3. You open an issue to discuss any significant work - we would hate for your + time to be wasted. + +To send us a pull request, please: + +1. Fork the repository. +2. Modify the source; please focus on the specific change you are contributing. + If you also reformat all the code, it will be hard for us to focus on your + change. +3. Ensure local tests pass. +4. Commit to your fork using clear commit messages. +5. Send us a pull request, answering any default questions in the pull request + interface. +6. Pay attention to any automated CI failures reported in the pull request, and + stay involved in the conversation. + +GitHub provides additional document on +[forking a repository](https://help.github.com/articles/fork-a-repo/) and +[creating a pull request](https://help.github.com/articles/creating-a-pull-request/). + +## Finding contributions to work on + +Looking at the existing issues is a great way to find something to contribute +on. As our projects, by default, use the default GitHub issue labels +(enhancement/bug/duplicate/help wanted/invalid/question/wontfix), looking at any +'help wanted' issues is a great place to start. + +## Code of Conduct + +This project has adopted the +[Contributor Covenant](https://www.contributor-covenant.org/), version 2.1, +available at +https://www.contributor-covenant.org/version/2/1/code_of_conduct.html. + +## Licensing + +See the [LICENSE](LICENSE) file for our project's licensing. We will ask you to +confirm the licensing of your contribution. diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..e7bb4f11 --- /dev/null +++ b/LICENSE @@ -0,0 +1,364 @@ +Copyright (c) 2025 Tsiry Sandratraina + +Mozilla Public License, version 2.0 + +1. Definitions + +1.1. "Contributor" + + means each individual or legal entity that creates, contributes to the + creation of, or owns Covered Software. + +1.2. "Contributor Version" + + means the combination of the Contributions of others (if any) used by a + Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + + means Source Code Form to which the initial Contributor has attached the + notice in Exhibit A, the Executable Form of such Source Code Form, and + Modifications of such Source Code Form, in each case including portions + thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + a. that the initial Contributor has attached the notice described in + Exhibit B to the Covered Software; or + + b. that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the terms of + a Secondary License. + +1.6. "Executable Form" + + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + + means a work that combines Covered Software with other material, in a + separate file or files, that is not Covered Software. + +1.8. "License" + + means this document. + +1.9. "Licensable" + + means having the right to grant, to the maximum extent possible, whether + at the time of the initial grant or subsequently, any and all of the + rights conveyed by this License. + +1.10. "Modifications" + + means any of the following: + + a. any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered Software; or + + b. any new file in Source Code Form that contains any Covered Software. + +1.11. "Patent Claims" of a Contributor + + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the License, + by the making, using, selling, offering for sale, having made, import, + or transfer of either its Contributions or its Contributor Version. + +1.12. "Secondary License" + + means either the GNU General Public License, Version 2.0, the GNU Lesser + General Public License, Version 2.1, the GNU Affero General Public + License, Version 3.0, or any later versions of those licenses. + +1.13. "Source Code Form" + + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that controls, is + controlled by, or is under common control with You. For purposes of this + definition, "control" means (a) the power, direct or indirect, to cause + the direction or management of such entity, whether by contract or + otherwise, or (b) ownership of more than fifty percent (50%) of the + outstanding shares or beneficial ownership of such entity. + + +2. License Grants and Conditions + +2.1. Grants + + Each Contributor hereby grants You a world-wide, royalty-free, + non-exclusive license: + + a. under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + + b. under Patent Claims of such Contributor to make, use, sell, offer for + sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + + The licenses granted in Section 2.1 with respect to any Contribution + become effective for each Contribution on the date the Contributor first + distributes such Contribution. + +2.3. Limitations on Grant Scope + + The licenses granted in this Section 2 are the only rights granted under + this License. No additional rights or licenses will be implied from the + distribution or licensing of Covered Software under this License. + Notwithstanding Section 2.1(b) above, no patent license is granted by a + Contributor: + + a. for any code that a Contributor has removed from Covered Software; or + + b. for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + + c. under Patent Claims infringed by Covered Software in the absence of + its Contributions. + + This License does not grant any rights in the trademarks, service marks, + or logos of any Contributor (except as may be necessary to comply with + the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + + No Contributor makes additional grants as a result of Your choice to + distribute the Covered Software under a subsequent version of this + License (see Section 10.2) or under the terms of a Secondary License (if + permitted under the terms of Section 3.3). + +2.5. Representation + + Each Contributor represents that the Contributor believes its + Contributions are its original creation(s) or it has sufficient rights to + grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + + This License is not intended to limit any rights You have under + applicable copyright doctrines of fair use, fair dealing, or other + equivalents. + +2.7. Conditions + + Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in + Section 2.1. + + +3. Responsibilities + +3.1. Distribution of Source Form + + All distribution of Covered Software in Source Code Form, including any + Modifications that You create or to which You contribute, must be under + the terms of this License. You must inform recipients that the Source + Code Form of the Covered Software is governed by the terms of this + License, and how they can obtain a copy of this License. You may not + attempt to alter or restrict the recipients' rights in the Source Code + Form. + +3.2. Distribution of Executable Form + + If You distribute Covered Software in Executable Form then: + + a. such Covered Software must also be made available in Source Code Form, + as described in Section 3.1, and You must inform recipients of the + Executable Form how they can obtain a copy of such Source Code Form by + reasonable means in a timely manner, at a charge no more than the cost + of distribution to the recipient; and + + b. You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter the + recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + + You may create and distribute a Larger Work under terms of Your choice, + provided that You also comply with the requirements of this License for + the Covered Software. If the Larger Work is a combination of Covered + Software with a work governed by one or more Secondary Licenses, and the + Covered Software is not Incompatible With Secondary Licenses, this + License permits You to additionally distribute such Covered Software + under the terms of such Secondary License(s), so that the recipient of + the Larger Work may, at their option, further distribute the Covered + Software under the terms of either this License or such Secondary + License(s). + +3.4. Notices + + You may not remove or alter the substance of any license notices + (including copyright notices, patent notices, disclaimers of warranty, or + limitations of liability) contained within the Source Code Form of the + Covered Software, except that You may alter any license notices to the + extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + + You may choose to offer, and to charge a fee for, warranty, support, + indemnity or liability obligations to one or more recipients of Covered + Software. However, You may do so only on Your own behalf, and not on + behalf of any Contributor. You must make it absolutely clear that any + such warranty, support, indemnity, or liability obligation is offered by + You alone, and You hereby agree to indemnify every Contributor for any + liability incurred by such Contributor as a result of warranty, support, + indemnity or liability terms You offer. You may include additional + disclaimers of warranty and limitations of liability specific to any + jurisdiction. + +4. Inability to Comply Due to Statute or Regulation + + If it is impossible for You to comply with any of the terms of this License + with respect to some or all of the Covered Software due to statute, + judicial order, or regulation then You must: (a) comply with the terms of + this License to the maximum extent possible; and (b) describe the + limitations and the code they affect. Such description must be placed in a + text file included with all distributions of the Covered Software under + this License. Except to the extent prohibited by statute or regulation, + such description must be sufficiently detailed for a recipient of ordinary + skill to be able to understand it. + +5. Termination + +5.1. The rights granted under this License will terminate automatically if You + fail to comply with any of its terms. However, if You become compliant, + then the rights granted under this License from a particular Contributor + are reinstated (a) provisionally, unless and until such Contributor + explicitly and finally terminates Your grants, and (b) on an ongoing + basis, if such Contributor fails to notify You of the non-compliance by + some reasonable means prior to 60 days after You have come back into + compliance. Moreover, Your grants from a particular Contributor are + reinstated on an ongoing basis if such Contributor notifies You of the + non-compliance by some reasonable means, this is the first time You have + received notice of non-compliance with this License from such + Contributor, and You become compliant prior to 30 days after Your receipt + of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent + infringement claim (excluding declaratory judgment actions, + counter-claims, and cross-claims) alleging that a Contributor Version + directly or indirectly infringes any patent, then the rights granted to + You by any and all Contributors for the Covered Software under Section + 2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user + license agreements (excluding distributors and resellers) which have been + validly granted by You or Your distributors under this License prior to + termination shall survive termination. + +6. Disclaimer of Warranty + + Covered Software is provided under this License on an "as is" basis, + without warranty of any kind, either expressed, implied, or statutory, + including, without limitation, warranties that the Covered Software is free + of defects, merchantable, fit for a particular purpose or non-infringing. + The entire risk as to the quality and performance of the Covered Software + is with You. Should any Covered Software prove defective in any respect, + You (not any Contributor) assume the cost of any necessary servicing, + repair, or correction. This disclaimer of warranty constitutes an essential + part of this License. No use of any Covered Software is authorized under + this License except under this disclaimer. + +7. Limitation of Liability + + Under no circumstances and under no legal theory, whether tort (including + negligence), contract, or otherwise, shall any Contributor, or anyone who + distributes Covered Software as permitted above, be liable to You for any + direct, indirect, special, incidental, or consequential damages of any + character including, without limitation, damages for lost profits, loss of + goodwill, work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses, even if such party shall have been + informed of the possibility of such damages. This limitation of liability + shall not apply to liability for death or personal injury resulting from + such party's negligence to the extent applicable law prohibits such + limitation. Some jurisdictions do not allow the exclusion or limitation of + incidental or consequential damages, so this exclusion and limitation may + not apply to You. + +8. Litigation + + Any litigation relating to this License may be brought only in the courts + of a jurisdiction where the defendant maintains its principal place of + business and such litigation shall be governed by laws of that + jurisdiction, without reference to its conflict-of-law provisions. Nothing + in this Section shall prevent a party's ability to bring cross-claims or + counter-claims. + +9. Miscellaneous + + This License represents the complete agreement concerning the subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. Any law or regulation which provides that + the language of a contract shall be construed against the drafter shall not + be used to construe this License against a Contributor. + + +10. Versions of the License + +10.1. New Versions + + Mozilla Foundation is the license steward. Except as provided in Section + 10.3, no one other than the license steward has the right to modify or + publish new versions of this License. Each version will be given a + distinguishing version number. + +10.2. Effect of New Versions + + You may distribute the Covered Software under the terms of the version + of the License under which You originally received the Covered Software, + or under the terms of any subsequent version published by the license + steward. + +10.3. Modified Versions + + If you create software not governed by this License, and you want to + create a new license for such software, you may create and use a + modified version of this License if you rename the license and remove + any references to the name of the license steward (except to note that + such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary + Licenses If You choose to distribute Source Code Form that is + Incompatible With Secondary Licenses under the terms of this version of + the License, the notice described in Exhibit B of this License must be + attached. + +Exhibit A - Source Code Form License Notice + + This Source Code Form is subject to the + terms of the Mozilla Public License, v. + 2.0. If a copy of the MPL was not + distributed with this file, You can + obtain one at + http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular file, +then You may include the notice in a location (such as a LICENSE file in a +relevant directory) where a recipient would be likely to look for such a +notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice + + This Source Code Form is "Incompatible + With Secondary Licenses", as defined by + the Mozilla Public License, v. 2.0. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 00000000..1fb6479a --- /dev/null +++ b/README.md @@ -0,0 +1,31 @@ +# Rocksky + +A decentralized music tracking and discovery platform built on the AT Protocol 🎵 + +## Prerequisites + +- Node.js (v22 or later) +- Rust +- Turbo +- Docker + +## Getting Started + +1. Clone the repository: + ```bash + git clone https://github.com/tsirysndr/rocksky + cd rocksky + ``` +2. Install dependencies: + ```bash + npm install -g turbo + bun install + ``` +3. Run the database migrations: + ```bash + turbo db:migrate --filter=@rocksky/api + ``` +4. Start the development server: + ```bash + turbo dev + ``` \ No newline at end of file diff --git a/apps/api/.env.example b/apps/api/.env.example new file mode 100644 index 00000000..4f2025fa --- /dev/null +++ b/apps/api/.env.example @@ -0,0 +1,32 @@ +# Environment Configuration +NODE_ENV="development" # Options: 'development', 'production' +PORT="8000" # The port your server will listen on +HOST="localhost" # Hostname for the server +PUBLIC_URL="" # Set when deployed publicly, e.g. "https://mysite.com". Informs OAuth client id. +DB_PATH=":memory:" # The SQLite database path. Leave as ":memory:" to use a temporary in-memory database. +FRONTEND_URL="http://localhost:5174" + +# Secrets +# Must set this in production. May be generated with `openssl rand -base64 33` +# COOKIE_SECRET="" + +XATA_BRANCH=main +XATA_API_KEY="your xata api key" +XATA_POSTGRES_URL="your xata postgres url" + +SPOTIFY_REDIRECT_URI="http://localhost:8000/spotify/callback" +SPOTIFY_CLIENT_ID="your spotify client id" +SPOTIFY_CLIENT_SECRET="your spotify" +SPOTIFY_ENCRYPTION_KEY="your spotify encryption secret" +SPOTIFY_ENCRYPRION_IV="your spotify encryption iv" +ROCKSKY_BETA_TOKEN="your rocksky beta token" + +NATS_URL="nats://localhost:4222" +ANALYTICS_URL="http://localhost:7879" + +DROPBOX_REDIRECT_URI="http://localhost:8000/dropbox/oauth/callback" +DROPBOX_CLIENT_ID="" +DROPBOX_CLIENT_SECRET="" +GOOGLE_REDIRECT_URI="http://localhost:8000/googledrive/oauth/callback" + +POSTGTRES_URL="postgresql://postgres@localhost:5432/rocksky" \ No newline at end of file diff --git a/apps/api/.gitignore b/apps/api/.gitignore new file mode 100644 index 00000000..71b76c01 --- /dev/null +++ b/apps/api/.gitignore @@ -0,0 +1,178 @@ +# Logs + +logs +_.log +npm-debug.log_ +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) + +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# Runtime data + +pids +_.pid +_.seed +\*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover + +lib-cov + +# Coverage directory used by tools like istanbul + +coverage +\*.lcov + +# nyc test coverage + +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) + +.grunt + +# Bower dependency directory (https://bower.io/) + +bower_components + +# node-waf configuration + +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) + +build/Release + +# Dependency directories + +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) + +web_modules/ + +# TypeScript cache + +\*.tsbuildinfo + +# Optional npm cache directory + +.npm + +# Optional eslint cache + +.eslintcache + +# Optional stylelint cache + +.stylelintcache + +# Microbundle cache + +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history + +.node_repl_history + +# Output of 'npm pack' + +\*.tgz + +# Yarn Integrity file + +.yarn-integrity + +# dotenv environment variable files + +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) + +.cache +.parcel-cache + +# Next.js build output + +.next +out + +# Nuxt.js build / generate output + +.nuxt +dist + +# Gatsby files + +.cache/ + +# Comment in the public line in if your project uses Gatsby and not Next.js + +# https://nextjs.org/blog/next-9-1#public-directory-support + +# public + +# vuepress build output + +.vuepress/dist + +# vuepress v2.x temp and cache directory + +.temp +.cache + +# Docusaurus cache and generated files + +.docusaurus + +# Serverless directories + +.serverless/ + +# FuseBox cache + +.fusebox/ + +# DynamoDB Local files + +.dynamodb/ + +# TernJS port file + +.tern-port + +# Stores VSCode versions used for testing VSCode extensions + +.vscode-test + +# yarn v2 + +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.\* + +# wrangler project + +.dev.vars + +.wrangler + +credentials.json +*.sqlite +*.ddb +*.ddb.wal \ No newline at end of file diff --git a/apps/api/.xata/migrations/.ledger b/apps/api/.xata/migrations/.ledger new file mode 100644 index 00000000..4979d3f9 --- /dev/null +++ b/apps/api/.xata/migrations/.ledger @@ -0,0 +1,278 @@ +mig_cuftbae34skj7mihoe00 +mig_cug2aq634skj7mihoeu0 +mig_cug2bcmtrfea4ndapcqg +mig_cug2bt634skj7mihoev0 +mig_cug2c5m34skj7mihof00 +mig_cug2cjm34skj7mihof10 +mig_cug2cmutrfea4ndapcrg +mig_cug2cqmtrfea4ndapcsg +mig_cug2db6trfea4ndapcug +mig_cug2dq634skj7mihof30 +mig_cug2e47lmd4pfs40ps3g +mig_cug2eju34skj7mihof40 +mig_cug2erflmd4pfs40ps4g +mig_cug2f57lmd4pfs40ps5g +mig_cug2fe634skj7mihof50 +mig_cug2g1flmd4pfs40ps7g +mig_cug2g6u34skj7mihof7g +mig_cug2h7634skj7mihofag +mig_cug2hfu34skj7mihofbg +mig_cug2i4634skj7mihofdg +mig_cug2j2mtrfea4ndapd2g +mig_cug2jbetrfea4ndapd3g +mig_cug2jh7lmd4pfs40psgg +mig_cug2joutrfea4ndapd4g +mig_cug2jvvlmd4pfs40pshg +mig_cug2kq6trfea4ndapd5g +mig_cug2m1etrfea4ndapd9g +mig_cug2mi6trfea4ndapdcg +mig_cug2n56trfea4ndapddg +mig_cug2nc6trfea4ndapdfg +mig_cug2npetrfea4ndapdhg +mig_cug2o2634skj7mihofj0 +mig_cug2oj634skj7mihofk0 +mig_cug2oqetrfea4ndapdm0 +mig_cug2p36trfea4ndapdn0 +mig_cug2p8utrfea4ndapdp0 +mig_cug2q0utrfea4ndapdr0 +mig_cug2q7mtrfea4ndapds0 +mig_cug2qcu34skj7mihofm0 +mig_cug2qq634skj7mihofn0 +mig_cug2qv634skj7mihofo0 +mig_cug2rhe34skj7mihofs0 +mig_cug2sum34skj7mihofu0 +mig_cug2tdflmd4pfs40psng +mig_cug2to634skj7mihofv0 +mig_cug2u6m34skj7mihog00 +mig_cug2ude34skj7mihog10 +mig_cug2uom34skj7mihog20 +mig_cug2vgmtrfea4ndapdtg +mig_cug2vq6trfea4ndapdug +mig_cug303utrfea4ndapdvg +mig_cug30h7lmd4pfs40psog +mig_cug31gu34skj7mihog30 +mig_cug324nlmd4pfs40psr0 +mig_cug32gnlmd4pfs40pss0 +mig_cug330utrfea4ndape2g +mig_cug33fm34skj7mihog40 +mig_cug34a6trfea4ndape3g +mig_cug35bmtrfea4ndape4g +mig_cug366mtrfea4ndape5g +mig_cug36s6trfea4ndapeag +mig_cug3786trfea4ndapebg +mig_cug37jmtrfea4ndapecg +mig_cug37r6trfea4ndapedg +mig_cug380utrfea4ndapeeg +mig_cug38cutrfea4ndapefg +mig_cug38netrfea4ndapegg +mig_cug39f6trfea4ndapehg +mig_cug39v6trfea4ndapejg +mig_cug3adetrfea4ndapekg +mig_cug3auutrfea4ndapelg +mig_cug3c27lmd4pfs40psv0 +mig_cug3dautrfea4ndapepg +mig_cug3e6634skj7mihog60 +mig_cug3fle34skj7mihog70 +mig_cug3ssflmd4pfs40pt30 +mig_cug5hue34skj7mihoh2g +mig_cuggu2jiojibbahciro0 +mig_cuggv5pi7viit4iimp30 +mig_cuggvc3rr2giaepagc30 +mig_cuggvhbrr2giaepagc50 +mig_cuggvlpi7viit4iimp40 +mig_cugh01jrr2giaepagc60 +mig_cugh0ahi7viit4iimp50 +mig_cugh0vrrr2giaepagc70 +mig_cugh19hi7viit4iimp60 +mig_cugh8opi7viit4iimpf0 +mig_cugh95pi7viit4iimpi0 +mig_cughff1i7viit4iimpog +mig_cughn8brr2giaepagcdg +mig_cuhrs2biojibbahcj9t0 +mig_cuhsqtjrr2giaepagnj0 +mig_cuhtdmjrr2giaepago90 +mig_cuhte8brr2giaepagoa0 +mig_cuiitohfp08bj5ug83rg +mig_cuiiu1dbcvmcu6qfb6q0 +mig_cuiiu59fp08bj5ug83sg +mig_cuiiuahfp08bj5ug83tg +mig_cuiiuh5bcvmcu6qfb6r0 +mig_cuiiun9fp08bj5ug83ug +mig_cuiiuvdbcvmcu6qfb6s0 +mig_cuiiv41fp08bj5ug83vg +mig_cuj25e1fp08bj5ug89s0 +mig_cuj25mpfp08bj5ug89u0 +mig_cuj25shfp08bj5ug89v0 +mig_cuj26ftbcvmcu6qfbaig +mig_cuj26r1trh7pmg9el6a0 +mig_cuj2709trh7pmg9el6b0 +mig_cuj27c9fp08bj5ug8a10 +mig_cuj27n5bcvmcu6qfbajg +mig_cuj2869fp08bj5ug8a30 +mig_cuj29j5bcvmcu6qfbam0 +mig_cujqfp9trh7pmg9elbdg +mig_cujqg59fp08bj5ug8fgg +mig_cujqhc5bcvmcu6qfbgjg +mig_cuk9in5bcvmcu6qfbjcg +mig_cuk9jjtbcvmcu6qfbjdg +mig_cuk9k1hfp08bj5ug8i50 +mig_cuk9tvhfp08bj5ug8i80 +mig_cuk9uatbcvmcu6qfbjh0 +mig_cuk9udpfp08bj5ug8i90 +mig_cukdg7lbcvmcu6qfbkk0 +mig_cukdglptrh7pmg9elgeg +mig_cukf0v5bcvmcu6qfbkug +mig_cumlpkk27onfu5mm3stg +mig_cumlpo427onfu5mm3sug +mig_cumlrqpoos2v56d5q26g +mig_cumlrvk27onfu5mm3t2g +mig_cumls5427onfu5mm3t3g +mig_cumnjfs27onfu5mm3u8g +mig_cumnmjk27onfu5mm3u9g +mig_cumnoak27onfu5mm3uag +mig_cump9c427onfu5mm3uqg +mig_cump9g9oos2v56d5q2u0 +mig_cump9rk27onfu5mm3urg +mig_cump9vsq7gi7283oko90 +mig_cumpa4kq7gi7283okoa0 +mig_cun3iis27onfu5mm41b0 +mig_cun3j8poos2v56d5q5d0 +mig_cun3jqpoos2v56d5q5e0 +mig_cun3kgcq7gi7283okqo0 +mig_cuo2s4dv5omnnkb7apog +mig_cuo2se1dsuem1m1rhsn0 +mig_cuo2simfvuvgoi6as0g0 +mig_cuo2smpdsuem1m1rhso0 +mig_cuo2sr1dsuem1m1rhsp0 +mig_cuo2t3tv5omnnkb7apqg +mig_cuo3h4ufvuvgoi6as0k0 +mig_cuo3hplv5omnnkb7aq2g +mig_cuo3i75v5omnnkb7aq3g +mig_cuo3j4hdsuem1m1rhsu0 +mig_cuo3jeufvuvgoi6as0ng +mig_cuo3k89dsuem1m1rhsv0 +mig_cuo3kpmfvuvgoi6as0og +mig_cuo3l0mfvuvgoi6as0pg +mig_cuochjufvuvgoi6as2cg +mig_cuocifhdsuem1m1rhusg +mig_cuocio1dsuem1m1rhutg +mig_cuon75lv5omnnkb7av4g +mig_cuood4lv5omnnkb7avhg +mig_cup41k5v5omnnkb7b2s0 +mig_cuq27fufvuvgoi6asfog +mig_cuq2866fvuvgoi6asfpg +mig_cuq28kefvuvgoi6asfqg +mig_cusvclmfvuvgoi6atb2g +mig_cuvv6k1dsuem1m1rk3l0 +mig_cuvvadtv5omnnkb7cs40 +mig_cv3tgjqtb4rhvnj37il0 +mig_cv3tib2tb4rhvnj37io0 +mig_cv3tipd2t0po8jv9t7u0 +mig_cv3tj3itb4rhvnj37ip0 +mig_cv55loqtb4rhvnj37rng +mig_cv55m5o66mqp0v06gpbg +mig_cv55mat2t0po8jv9tkgg +mig_cv55mi066mqp0v06gpcg +mig_cv55mql2t0po8jv9tkhg +mig_cv55n3066mqp0v06gpeg +mig_cv55n7d2t0po8jv9tkig +mig_cv55nf52t0po8jv9tkjg +mig_cv55njg66mqp0v06gpfg +mig_cv55nu2tb4rhvnj37rog +mig_cv55o3d2t0po8jv9tkkg +mig_cv55o952t0po8jv9tklg +sql_7fbe41bfacc536 +mig_cv8tro2glbhgau6cq5j0 +mig_cv8ts6o1g95li4qghh5g +mig_cv8tsfkld6k2hsabcgqg +mig_cv8tt0g1g95li4qghh6g +mig_cv8ttl4ld6k2hsabcgsg +mig_cv8tu7sld6k2hsabcgtg +mig_cv8tufsld6k2hsabcgug +mig_cv8tutiglbhgau6cq5n0 +mig_cv8tv8iglbhgau6cq5p0 +mig_cv8u07aglbhgau6cq5q0 +mig_cv8u0daglbhgau6cq5r0 +mig_cv8u5cqglbhgau6cq61g +mig_cv8u6n01g95li4qghha0 +mig_cv8u7uqglbhgau6cq62g +mig_cv8u8j2glbhgau6cq63g +mig_cv8ub7cld6k2hsabch2g +mig_cv8ue4kld6k2hsabch3g +mig_cv8ueoaglbhgau6cq66g +mig_cv8ufnqglbhgau6cq67g +mig_cv8uh4aglbhgau6cq68g +mig_cv8ujhqglbhgau6cq69g +mig_cv8ukrg1g95li4qghhh0 +mig_cv8ulakld6k2hsabch4g +mig_cv8umjo1g95li4qghhk0 +mig_cv8un7g1g95li4qghhl0 +mig_cv8unpo1g95li4qghhm0 +mig_cv8up2aglbhgau6cq6bg +mig_cv8upbcld6k2hsabch6g +mig_cv8uq1sld6k2hsabch7g +mig_cv8uqh2glbhgau6cq6d0 +mig_cv8ur1kld6k2hsabch8g +mig_cv8urh4ld6k2hsabch9g +mig_cv8us9g1g95li4qghhq0 +mig_cv8usig1g95li4qghhr0 +mig_cv8utv81g95li4qghhs0 +mig_cv8uugqglbhgau6cq6e0 +mig_cv8uv2iglbhgau6cq6f0 +mig_cv8uveiglbhgau6cq6h0 +mig_cv8v8gcld6k2hsabcheg +mig_cv8v92aglbhgau6cq6n0 +mig_cv8v9faglbhgau6cq6o0 +mig_cv8v9sqglbhgau6cq6p0 +mig_cvb8uqsld6k2hsabd54g +mig_cvb8vpsld6k2hsabd55g +mig_cvb902cld6k2hsabd580 +mig_cvb90kiglbhgau6cqsng +mig_cvb915cld6k2hsabd590 +mig_cvbdpcg1g95li4qgi2o0 +mig_cvbdpm2glbhgau6cqu40 +mig_cvbdq601g95li4qgi2p0 +mig_cvbdqi81g95li4qgi2q0 +mig_cvbdqvaglbhgau6cqu50 +mig_cvbdtgaglbhgau6cqu70 +mig_cvbdtq81g95li4qgi2tg +mig_cvbdu401g95li4qgi2ug +mig_cvf4ibaglbhgau6crvn0 +mig_cvlvlviglbhgau6ctmp0 +mig_cvmofkdfchh2dtob7fo0 +mig_cvmognlfchh2dtob7fp0 +mig_cvmoh77o1tkgc98jgemg +mig_cvn0t3tfchh2dtob7hf0 +mig_cvn0traglbhgau6ctu70 +mig_cvn0uano1tkgc98jgg90 +mig_cvn10dvo1tkgc98jgga0 +mig_cvn11aiglbhgau6ctu80 +mig_cvn12paglbhgau6ctubg +mig_cvn1h5qglbhgau6ctuhg +mig_cvn1ke2glbhgau6ctuig +mig_cvn1kqfo1tkgc98jggd0 +mig_cvn1l8iglbhgau6ctujg +mig_cvrt0e5fchh2dtob8q4g +mig_cvsn7hd1cltn5mtppc70 +mig_cvsn81l1cltn5mtppc80 +mig_cvsn8otfchh2dtob919g +mig_cvsn9ad1cltn5mtppc90 +mig_cvsnc0tfchh2dtob91cg +sql_58928c5fa822f6 +sql_525dccb0e69e3a +sql_8b4842daf1e1a9 +mig_cvtnv0d1cltn5mtppjhg +mig_cvtpkbno1tkgc98ji5h0 +mig_cvtpku7o1tkgc98ji5j0 +mig_cvu23dtfchh2dtob9esg +mig_d0h07rqdo80pli9qntig +mig_d0mcdj2r9e9qaqkp2jj0 +mig_d0mcgrir9e9qaqkp2jl0 +mig_d0mchpiunsp1bris7p90 +mig_d0mciaido80pli9qp7r0 +mig_d0mcigar9e9qaqkp2jo0 +mig_d0mcirqr9e9qaqkp2jp0 +mig_d0md042r9e9qaqkp2jug +mig_d0md0k2r9e9qaqkp2jvg +mig_d0md0vido80pli9qp7t0 +mig_d0md192r9e9qaqkp2k0g diff --git a/apps/api/.xata/migrations/mig_cuftbae34skj7mihoe00.json b/apps/api/.xata/migrations/mig_cuftbae34skj7mihoe00.json new file mode 100644 index 00000000..32095404 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuftbae34skj7mihoe00.json @@ -0,0 +1,17 @@ +{ + "done": true, + "migration": { + "name": "mig_cuftbae34skj7mihoe00", + "operations": [ + { + "sql": { + "up": "CREATE SCHEMA \"bb_00000000000000000000000000_000000\";" + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuftbae34skj7mihoe00", + "schema": "public", + "startedAt": "2025-02-02T20:29:29.825275Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2aq634skj7mihoeu0.json b/apps/api/.xata/migrations/mig_cug2aq634skj7mihoeu0.json new file mode 100644 index 00000000..229a2158 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2aq634skj7mihoeu0.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2aq634skj7mihoeu0", + "operations": [ + { + "create_table": { + "name": "users", + "columns": [ + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_id", + "type": "text", + "check": { + "name": "users_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"users\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"users\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2aq634skj7mihoeu0", + "parent": "mig_cuftbae34skj7mihoe00", + "schema": "public", + "startedAt": "2025-02-03T02:09:44.808126Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2bcmtrfea4ndapcqg.json b/apps/api/.xata/migrations/mig_cug2bcmtrfea4ndapcqg.json new file mode 100644 index 00000000..b6a4a0d2 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2bcmtrfea4ndapcqg.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2bcmtrfea4ndapcqg", + "operations": [ + { + "create_table": { + "name": "artists", + "columns": [ + { + "name": "xata_id", + "type": "text", + "check": { + "name": "artists_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + }, + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"artists\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"artists\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2bcmtrfea4ndapcqg", + "parent": "mig_cug2aq634skj7mihoeu0", + "schema": "public", + "startedAt": "2025-02-03T02:10:59.111195Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2bt634skj7mihoev0.json b/apps/api/.xata/migrations/mig_cug2bt634skj7mihoev0.json new file mode 100644 index 00000000..a85668e1 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2bt634skj7mihoev0.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2bt634skj7mihoev0", + "operations": [ + { + "create_table": { + "name": "albums", + "columns": [ + { + "name": "xata_version", + "type": "integer", + "default": "0" + }, + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_id", + "type": "text", + "check": { + "name": "albums_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"albums\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"albums\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2bt634skj7mihoev0", + "parent": "mig_cug2bcmtrfea4ndapcqg", + "schema": "public", + "startedAt": "2025-02-03T02:12:04.410471Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2c5m34skj7mihof00.json b/apps/api/.xata/migrations/mig_cug2c5m34skj7mihof00.json new file mode 100644 index 00000000..60bde4e5 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2c5m34skj7mihof00.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2c5m34skj7mihof00", + "operations": [ + { + "create_table": { + "name": "tracks", + "columns": [ + { + "name": "xata_id", + "type": "text", + "check": { + "name": "tracks_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + }, + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"tracks\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"tracks\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2c5m34skj7mihof00", + "parent": "mig_cug2bt634skj7mihoev0", + "schema": "public", + "startedAt": "2025-02-03T02:12:39.582168Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2cjm34skj7mihof10.json b/apps/api/.xata/migrations/mig_cug2cjm34skj7mihof10.json new file mode 100644 index 00000000..39bafa3f --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2cjm34skj7mihof10.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2cjm34skj7mihof10", + "operations": [ + { + "create_table": { + "name": "playlists", + "columns": [ + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_id", + "type": "text", + "check": { + "name": "playlists_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + }, + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"playlists\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"playlists\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2cjm34skj7mihof10", + "parent": "mig_cug2c5m34skj7mihof00", + "schema": "public", + "startedAt": "2025-02-03T02:13:34.901887Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2cmutrfea4ndapcrg.json b/apps/api/.xata/migrations/mig_cug2cmutrfea4ndapcrg.json new file mode 100644 index 00000000..a40cdd06 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2cmutrfea4ndapcrg.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2cmutrfea4ndapcrg", + "operations": [ + { + "create_table": { + "name": "radios", + "columns": [ + { + "name": "xata_id", + "type": "text", + "check": { + "name": "radios_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + }, + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"radios\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"radios\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2cmutrfea4ndapcrg", + "parent": "mig_cug2cjm34skj7mihof10", + "schema": "public", + "startedAt": "2025-02-03T02:13:47.954922Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2cqmtrfea4ndapcsg.json b/apps/api/.xata/migrations/mig_cug2cqmtrfea4ndapcsg.json new file mode 100644 index 00000000..1e28c29f --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2cqmtrfea4ndapcsg.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2cqmtrfea4ndapcsg", + "operations": [ + { + "create_table": { + "name": "tags", + "columns": [ + { + "name": "xata_id", + "type": "text", + "check": { + "name": "tags_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + }, + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"tags\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"tags\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2cqmtrfea4ndapcsg", + "parent": "mig_cug2cmutrfea4ndapcrg", + "schema": "public", + "startedAt": "2025-02-03T02:14:03.036274Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2db6trfea4ndapcug.json b/apps/api/.xata/migrations/mig_cug2db6trfea4ndapcug.json new file mode 100644 index 00000000..a65f382b --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2db6trfea4ndapcug.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2db6trfea4ndapcug", + "operations": [ + { + "create_table": { + "name": "scrobbles", + "columns": [ + { + "name": "xata_id", + "type": "text", + "check": { + "name": "scrobbles_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + }, + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"scrobbles\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"scrobbles\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2db6trfea4ndapcug", + "parent": "mig_cug2cqmtrfea4ndapcsg", + "schema": "public", + "startedAt": "2025-02-03T02:15:09.387809Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2dq634skj7mihof30.json b/apps/api/.xata/migrations/mig_cug2dq634skj7mihof30.json new file mode 100644 index 00000000..35edd35a --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2dq634skj7mihof30.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2dq634skj7mihof30", + "operations": [ + { + "add_column": { + "up": "''", + "table": "radios", + "column": { + "name": "name", + "type": "text", + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2dq634skj7mihof30", + "parent": "mig_cug2db6trfea4ndapcug", + "schema": "public", + "startedAt": "2025-02-03T02:16:08.807701Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2e47lmd4pfs40ps3g.json b/apps/api/.xata/migrations/mig_cug2e47lmd4pfs40ps3g.json new file mode 100644 index 00000000..03c3b3ac --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2e47lmd4pfs40ps3g.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2e47lmd4pfs40ps3g", + "operations": [ + { + "add_column": { + "table": "radios", + "column": { + "name": "description", + "type": "text", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2e47lmd4pfs40ps3g", + "parent": "mig_cug2dq634skj7mihof30", + "schema": "public", + "startedAt": "2025-02-03T02:16:48.929703Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2eju34skj7mihof40.json b/apps/api/.xata/migrations/mig_cug2eju34skj7mihof40.json new file mode 100644 index 00000000..6b655e3d --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2eju34skj7mihof40.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2eju34skj7mihof40", + "operations": [ + { + "add_column": { + "table": "radios", + "column": { + "name": "genre", + "type": "text", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2eju34skj7mihof40", + "parent": "mig_cug2e47lmd4pfs40ps3g", + "schema": "public", + "startedAt": "2025-02-03T02:17:52.257901Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2erflmd4pfs40ps4g.json b/apps/api/.xata/migrations/mig_cug2erflmd4pfs40ps4g.json new file mode 100644 index 00000000..f6e8b5c0 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2erflmd4pfs40ps4g.json @@ -0,0 +1,25 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2erflmd4pfs40ps4g", + "operations": [ + { + "add_column": { + "up": "''", + "table": "radios", + "column": { + "name": "url", + "type": "text", + "unique": true, + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2erflmd4pfs40ps4g", + "parent": "mig_cug2eju34skj7mihof40", + "schema": "public", + "startedAt": "2025-02-03T02:18:22.35746Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2f57lmd4pfs40ps5g.json b/apps/api/.xata/migrations/mig_cug2f57lmd4pfs40ps5g.json new file mode 100644 index 00000000..de28e07b --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2f57lmd4pfs40ps5g.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2f57lmd4pfs40ps5g", + "operations": [ + { + "add_column": { + "table": "radios", + "column": { + "name": "website", + "type": "text", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2f57lmd4pfs40ps5g", + "parent": "mig_cug2erflmd4pfs40ps4g", + "schema": "public", + "startedAt": "2025-02-03T02:19:01.753034Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2fe634skj7mihof50.json b/apps/api/.xata/migrations/mig_cug2fe634skj7mihof50.json new file mode 100644 index 00000000..e60ec5ef --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2fe634skj7mihof50.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2fe634skj7mihof50", + "operations": [ + { + "add_column": { + "table": "radios", + "column": { + "name": "logo", + "type": "text", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2fe634skj7mihof50", + "parent": "mig_cug2f57lmd4pfs40ps5g", + "schema": "public", + "startedAt": "2025-02-03T02:19:37.797182Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2g1flmd4pfs40ps7g.json b/apps/api/.xata/migrations/mig_cug2g1flmd4pfs40ps7g.json new file mode 100644 index 00000000..6914e0df --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2g1flmd4pfs40ps7g.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2g1flmd4pfs40ps7g", + "operations": [ + { + "add_column": { + "up": "''", + "table": "albums", + "column": { + "name": "title", + "type": "text", + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2g1flmd4pfs40ps7g", + "parent": "mig_cug2fe634skj7mihof50", + "schema": "public", + "startedAt": "2025-02-03T02:20:54.092003Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2g6u34skj7mihof7g.json b/apps/api/.xata/migrations/mig_cug2g6u34skj7mihof7g.json new file mode 100644 index 00000000..3095d58c --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2g6u34skj7mihof7g.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2g6u34skj7mihof7g", + "operations": [ + { + "add_column": { + "up": "''", + "table": "albums", + "column": { + "name": "artist", + "type": "text", + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2g6u34skj7mihof7g", + "parent": "mig_cug2g1flmd4pfs40ps7g", + "schema": "public", + "startedAt": "2025-02-03T02:21:16.161931Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2h7634skj7mihofag.json b/apps/api/.xata/migrations/mig_cug2h7634skj7mihofag.json new file mode 100644 index 00000000..3bab03d4 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2h7634skj7mihofag.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2h7634skj7mihofag", + "operations": [ + { + "add_column": { + "table": "albums", + "column": { + "name": "release_date", + "type": "text", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2h7634skj7mihofag", + "parent": "mig_cug2g6u34skj7mihof7g", + "schema": "public", + "startedAt": "2025-02-03T02:23:24.903596Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2hfu34skj7mihofbg.json b/apps/api/.xata/migrations/mig_cug2hfu34skj7mihofbg.json new file mode 100644 index 00000000..8027e8d6 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2hfu34skj7mihofbg.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2hfu34skj7mihofbg", + "operations": [ + { + "add_column": { + "table": "albums", + "column": { + "name": "year", + "type": "int", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2hfu34skj7mihofbg", + "parent": "mig_cug2h7634skj7mihofag", + "schema": "public", + "startedAt": "2025-02-03T02:24:00.197649Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2i4634skj7mihofdg.json b/apps/api/.xata/migrations/mig_cug2i4634skj7mihofdg.json new file mode 100644 index 00000000..9a419270 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2i4634skj7mihofdg.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2i4634skj7mihofdg", + "operations": [ + { + "add_column": { + "table": "albums", + "column": { + "name": "album_art", + "type": "text", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2i4634skj7mihofdg", + "parent": "mig_cug2hfu34skj7mihofbg", + "schema": "public", + "startedAt": "2025-02-03T02:25:21.438827Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2j2mtrfea4ndapd2g.json b/apps/api/.xata/migrations/mig_cug2j2mtrfea4ndapd2g.json new file mode 100644 index 00000000..27702a4b --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2j2mtrfea4ndapd2g.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2j2mtrfea4ndapd2g", + "operations": [ + { + "add_column": { + "up": "''", + "table": "tracks", + "column": { + "name": "title", + "type": "text", + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2j2mtrfea4ndapd2g", + "parent": "mig_cug2i4634skj7mihofdg", + "schema": "public", + "startedAt": "2025-02-03T02:27:23.036454Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2jbetrfea4ndapd3g.json b/apps/api/.xata/migrations/mig_cug2jbetrfea4ndapd3g.json new file mode 100644 index 00000000..9d0b5bc6 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2jbetrfea4ndapd3g.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2jbetrfea4ndapd3g", + "operations": [ + { + "add_column": { + "up": "''", + "table": "tracks", + "column": { + "name": "artist", + "type": "text", + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2jbetrfea4ndapd3g", + "parent": "mig_cug2j2mtrfea4ndapd2g", + "schema": "public", + "startedAt": "2025-02-03T02:27:58.271051Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2jh7lmd4pfs40psgg.json b/apps/api/.xata/migrations/mig_cug2jh7lmd4pfs40psgg.json new file mode 100644 index 00000000..13ecdcef --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2jh7lmd4pfs40psgg.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2jh7lmd4pfs40psgg", + "operations": [ + { + "add_column": { + "up": "''", + "table": "tracks", + "column": { + "name": "album_artist", + "type": "text", + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2jh7lmd4pfs40psgg", + "parent": "mig_cug2jbetrfea4ndapd3g", + "schema": "public", + "startedAt": "2025-02-03T02:28:21.368777Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2joutrfea4ndapd4g.json b/apps/api/.xata/migrations/mig_cug2joutrfea4ndapd4g.json new file mode 100644 index 00000000..78caeaee --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2joutrfea4ndapd4g.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2joutrfea4ndapd4g", + "operations": [ + { + "add_column": { + "table": "tracks", + "column": { + "name": "album_art", + "type": "text", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2joutrfea4ndapd4g", + "parent": "mig_cug2jh7lmd4pfs40psgg", + "schema": "public", + "startedAt": "2025-02-03T02:28:52.529974Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2jvvlmd4pfs40pshg.json b/apps/api/.xata/migrations/mig_cug2jvvlmd4pfs40pshg.json new file mode 100644 index 00000000..7049a58a --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2jvvlmd4pfs40pshg.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2jvvlmd4pfs40pshg", + "operations": [ + { + "add_column": { + "up": "''", + "table": "tracks", + "column": { + "name": "album", + "type": "text", + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2jvvlmd4pfs40pshg", + "parent": "mig_cug2joutrfea4ndapd4g", + "schema": "public", + "startedAt": "2025-02-03T02:29:20.645832Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2kq6trfea4ndapd5g.json b/apps/api/.xata/migrations/mig_cug2kq6trfea4ndapd5g.json new file mode 100644 index 00000000..173cc029 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2kq6trfea4ndapd5g.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2kq6trfea4ndapd5g", + "operations": [ + { + "add_column": { + "up": "''", + "table": "tracks", + "column": { + "name": "album_id", + "type": "text", + "comment": "{\"xata.link\":\"albums\"}", + "references": { + "name": "album_id_link", + "table": "albums", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2kq6trfea4ndapd5g", + "parent": "mig_cug2jvvlmd4pfs40pshg", + "schema": "public", + "startedAt": "2025-02-03T02:31:06.656554Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2m1etrfea4ndapd9g.json b/apps/api/.xata/migrations/mig_cug2m1etrfea4ndapd9g.json new file mode 100644 index 00000000..38fb98e8 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2m1etrfea4ndapd9g.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2m1etrfea4ndapd9g", + "operations": [ + { + "add_column": { + "up": "''", + "table": "tracks", + "column": { + "name": "artist_id", + "type": "text", + "comment": "{\"xata.link\":\"artists\"}", + "references": { + "name": "artist_id_link", + "table": "artists", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2m1etrfea4ndapd9g", + "parent": "mig_cug2kq6trfea4ndapd5g", + "schema": "public", + "startedAt": "2025-02-03T02:33:42.017777Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2mi6trfea4ndapdcg.json b/apps/api/.xata/migrations/mig_cug2mi6trfea4ndapdcg.json new file mode 100644 index 00000000..6978aae7 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2mi6trfea4ndapdcg.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2mi6trfea4ndapdcg", + "operations": [ + { + "add_column": { + "table": "tracks", + "column": { + "name": "track_number", + "type": "int", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2mi6trfea4ndapdcg", + "parent": "mig_cug2m1etrfea4ndapd9g", + "schema": "public", + "startedAt": "2025-02-03T02:34:49.444796Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2n56trfea4ndapddg.json b/apps/api/.xata/migrations/mig_cug2n56trfea4ndapddg.json new file mode 100644 index 00000000..9be5043f --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2n56trfea4ndapddg.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2n56trfea4ndapddg", + "operations": [ + { + "add_column": { + "table": "tracks", + "column": { + "name": "duration", + "type": "int", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2n56trfea4ndapddg", + "parent": "mig_cug2mi6trfea4ndapdcg", + "schema": "public", + "startedAt": "2025-02-03T02:36:06.540559Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2nc6trfea4ndapdfg.json b/apps/api/.xata/migrations/mig_cug2nc6trfea4ndapdfg.json new file mode 100644 index 00000000..939e43c5 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2nc6trfea4ndapdfg.json @@ -0,0 +1,25 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2nc6trfea4ndapdfg", + "operations": [ + { + "add_column": { + "table": "tracks", + "column": { + "name": "mb_id", + "type": "text", + "unique": true, + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2nc6trfea4ndapdfg", + "parent": "mig_cug2n56trfea4ndapddg", + "schema": "public", + "startedAt": "2025-02-03T02:36:34.000617Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2npetrfea4ndapdhg.json b/apps/api/.xata/migrations/mig_cug2npetrfea4ndapdhg.json new file mode 100644 index 00000000..fa9ac5b5 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2npetrfea4ndapdhg.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2npetrfea4ndapdhg", + "operations": [ + { + "add_column": { + "table": "albums", + "column": { + "name": "youtube_link", + "type": "text", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2npetrfea4ndapdhg", + "parent": "mig_cug2nc6trfea4ndapdfg", + "schema": "public", + "startedAt": "2025-02-03T02:37:26.265832Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2o2634skj7mihofj0.json b/apps/api/.xata/migrations/mig_cug2o2634skj7mihofj0.json new file mode 100644 index 00000000..7d2a5c1c --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2o2634skj7mihofj0.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2o2634skj7mihofj0", + "operations": [ + { + "add_column": { + "table": "albums", + "column": { + "name": "spotify_link", + "type": "text", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2o2634skj7mihofj0", + "parent": "mig_cug2npetrfea4ndapdhg", + "schema": "public", + "startedAt": "2025-02-03T02:38:01.800899Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2oj634skj7mihofk0.json b/apps/api/.xata/migrations/mig_cug2oj634skj7mihofk0.json new file mode 100644 index 00000000..107c04af --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2oj634skj7mihofk0.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2oj634skj7mihofk0", + "operations": [ + { + "add_column": { + "table": "albums", + "column": { + "name": "tidal_link", + "type": "text", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2oj634skj7mihofk0", + "parent": "mig_cug2o2634skj7mihofj0", + "schema": "public", + "startedAt": "2025-02-03T02:39:09.047522Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2oqetrfea4ndapdm0.json b/apps/api/.xata/migrations/mig_cug2oqetrfea4ndapdm0.json new file mode 100644 index 00000000..166521ff --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2oqetrfea4ndapdm0.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2oqetrfea4ndapdm0", + "operations": [ + { + "add_column": { + "table": "tracks", + "column": { + "name": "youtube_link", + "type": "text", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2oqetrfea4ndapdm0", + "parent": "mig_cug2oj634skj7mihofk0", + "schema": "public", + "startedAt": "2025-02-03T02:39:38.071681Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2p36trfea4ndapdn0.json b/apps/api/.xata/migrations/mig_cug2p36trfea4ndapdn0.json new file mode 100644 index 00000000..889b683e --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2p36trfea4ndapdn0.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2p36trfea4ndapdn0", + "operations": [ + { + "add_column": { + "table": "tracks", + "column": { + "name": "spotify_link", + "type": "text", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2p36trfea4ndapdn0", + "parent": "mig_cug2oqetrfea4ndapdm0", + "schema": "public", + "startedAt": "2025-02-03T02:40:13.382185Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2p8utrfea4ndapdp0.json b/apps/api/.xata/migrations/mig_cug2p8utrfea4ndapdp0.json new file mode 100644 index 00000000..02d2ffdf --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2p8utrfea4ndapdp0.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2p8utrfea4ndapdp0", + "operations": [ + { + "add_column": { + "table": "tracks", + "column": { + "name": "tidal_link", + "type": "text", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2p8utrfea4ndapdp0", + "parent": "mig_cug2p36trfea4ndapdn0", + "schema": "public", + "startedAt": "2025-02-03T02:40:36.352163Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2q0utrfea4ndapdr0.json b/apps/api/.xata/migrations/mig_cug2q0utrfea4ndapdr0.json new file mode 100644 index 00000000..e3259645 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2q0utrfea4ndapdr0.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2q0utrfea4ndapdr0", + "operations": [ + { + "create_table": { + "name": "artist_tracks", + "columns": [ + { + "name": "xata_id", + "type": "text", + "check": { + "name": "artist_tracks_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + }, + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"artist_tracks\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"artist_tracks\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2q0utrfea4ndapdr0", + "parent": "mig_cug2p8utrfea4ndapdp0", + "schema": "public", + "startedAt": "2025-02-03T02:42:11.937696Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2q7mtrfea4ndapds0.json b/apps/api/.xata/migrations/mig_cug2q7mtrfea4ndapds0.json new file mode 100644 index 00000000..47d6ec4b --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2q7mtrfea4ndapds0.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2q7mtrfea4ndapds0", + "operations": [ + { + "create_table": { + "name": "album_tracks", + "columns": [ + { + "name": "xata_id", + "type": "text", + "check": { + "name": "album_tracks_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + }, + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"album_tracks\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"album_tracks\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2q7mtrfea4ndapds0", + "parent": "mig_cug2q0utrfea4ndapdr0", + "schema": "public", + "startedAt": "2025-02-03T02:42:39.988507Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2qcu34skj7mihofm0.json b/apps/api/.xata/migrations/mig_cug2qcu34skj7mihofm0.json new file mode 100644 index 00000000..a006342d --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2qcu34skj7mihofm0.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2qcu34skj7mihofm0", + "operations": [ + { + "create_table": { + "name": "playlist_tracks", + "columns": [ + { + "name": "xata_id", + "type": "text", + "check": { + "name": "playlist_tracks_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + }, + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"playlist_tracks\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"playlist_tracks\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2qcu34skj7mihofm0", + "parent": "mig_cug2q7mtrfea4ndapds0", + "schema": "public", + "startedAt": "2025-02-03T02:43:00.092209Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2qq634skj7mihofn0.json b/apps/api/.xata/migrations/mig_cug2qq634skj7mihofn0.json new file mode 100644 index 00000000..be83a622 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2qq634skj7mihofn0.json @@ -0,0 +1,20 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2qq634skj7mihofn0", + "operations": [ + { + "drop_column": { + "down": "''", + "table": "tracks", + "column": "album_id" + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2qq634skj7mihofn0", + "parent": "mig_cug2qcu34skj7mihofm0", + "schema": "public", + "startedAt": "2025-02-03T02:43:53.427187Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2qv634skj7mihofo0.json b/apps/api/.xata/migrations/mig_cug2qv634skj7mihofo0.json new file mode 100644 index 00000000..a66d74ce --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2qv634skj7mihofo0.json @@ -0,0 +1,20 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2qv634skj7mihofo0", + "operations": [ + { + "drop_column": { + "down": "''", + "table": "tracks", + "column": "artist_id" + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2qv634skj7mihofo0", + "parent": "mig_cug2qq634skj7mihofn0", + "schema": "public", + "startedAt": "2025-02-03T02:44:13.490337Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2rhe34skj7mihofs0.json b/apps/api/.xata/migrations/mig_cug2rhe34skj7mihofs0.json new file mode 100644 index 00000000..d93916d8 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2rhe34skj7mihofs0.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2rhe34skj7mihofs0", + "operations": [ + { + "add_column": { + "up": "''", + "table": "album_tracks", + "column": { + "name": "album_id", + "type": "text", + "comment": "{\"xata.link\":\"albums\"}", + "references": { + "name": "album_id_link", + "table": "albums", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2rhe34skj7mihofs0", + "parent": "mig_cug2qv634skj7mihofo0", + "schema": "public", + "startedAt": "2025-02-03T02:45:25.884806Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2sum34skj7mihofu0.json b/apps/api/.xata/migrations/mig_cug2sum34skj7mihofu0.json new file mode 100644 index 00000000..a1305e35 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2sum34skj7mihofu0.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2sum34skj7mihofu0", + "operations": [ + { + "add_column": { + "up": "''", + "table": "album_tracks", + "column": { + "name": "track_id", + "type": "text", + "comment": "{\"xata.link\":\"tracks\"}", + "references": { + "name": "track_id_link", + "table": "tracks", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2sum34skj7mihofu0", + "parent": "mig_cug2rhe34skj7mihofs0", + "schema": "public", + "startedAt": "2025-02-03T02:48:27.855896Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2tdflmd4pfs40psng.json b/apps/api/.xata/migrations/mig_cug2tdflmd4pfs40psng.json new file mode 100644 index 00000000..8d859bff --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2tdflmd4pfs40psng.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2tdflmd4pfs40psng", + "operations": [ + { + "add_column": { + "up": "''", + "table": "artist_tracks", + "column": { + "name": "artist_id", + "type": "text", + "comment": "{\"xata.link\":\"artists\"}", + "references": { + "name": "artist_id_link", + "table": "artists", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2tdflmd4pfs40psng", + "parent": "mig_cug2sum34skj7mihofu0", + "schema": "public", + "startedAt": "2025-02-03T02:49:26.073643Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2to634skj7mihofv0.json b/apps/api/.xata/migrations/mig_cug2to634skj7mihofv0.json new file mode 100644 index 00000000..8998455a --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2to634skj7mihofv0.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2to634skj7mihofv0", + "operations": [ + { + "add_column": { + "up": "''", + "table": "artist_tracks", + "column": { + "name": "track_id", + "type": "text", + "comment": "{\"xata.link\":\"tracks\"}", + "references": { + "name": "track_id_link", + "table": "tracks", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2to634skj7mihofv0", + "parent": "mig_cug2tdflmd4pfs40psng", + "schema": "public", + "startedAt": "2025-02-03T02:50:10.648594Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2u6m34skj7mihog00.json b/apps/api/.xata/migrations/mig_cug2u6m34skj7mihog00.json new file mode 100644 index 00000000..84698877 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2u6m34skj7mihog00.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2u6m34skj7mihog00", + "operations": [ + { + "add_column": { + "up": "''", + "table": "playlists", + "column": { + "name": "name", + "type": "text", + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2u6m34skj7mihog00", + "parent": "mig_cug2to634skj7mihofv0", + "schema": "public", + "startedAt": "2025-02-03T02:51:07.955484Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2ude34skj7mihog10.json b/apps/api/.xata/migrations/mig_cug2ude34skj7mihog10.json new file mode 100644 index 00000000..9e6cb471 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2ude34skj7mihog10.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2ude34skj7mihog10", + "operations": [ + { + "add_column": { + "table": "playlists", + "column": { + "name": "description", + "type": "text", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2ude34skj7mihog10", + "parent": "mig_cug2u6m34skj7mihog00", + "schema": "public", + "startedAt": "2025-02-03T02:51:34.603154Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2uom34skj7mihog20.json b/apps/api/.xata/migrations/mig_cug2uom34skj7mihog20.json new file mode 100644 index 00000000..4c5002fd --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2uom34skj7mihog20.json @@ -0,0 +1,25 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2uom34skj7mihog20", + "operations": [ + { + "add_column": { + "up": "''", + "table": "tags", + "column": { + "name": "name", + "type": "text", + "unique": true, + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2uom34skj7mihog20", + "parent": "mig_cug2ude34skj7mihog10", + "schema": "public", + "startedAt": "2025-02-03T02:52:19.863518Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2vgmtrfea4ndapdtg.json b/apps/api/.xata/migrations/mig_cug2vgmtrfea4ndapdtg.json new file mode 100644 index 00000000..6ad8fd18 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2vgmtrfea4ndapdtg.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2vgmtrfea4ndapdtg", + "operations": [ + { + "create_table": { + "name": "loved_tracks", + "columns": [ + { + "name": "xata_id", + "type": "text", + "check": { + "name": "loved_tracks_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + }, + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"loved_tracks\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"loved_tracks\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2vgmtrfea4ndapdtg", + "parent": "mig_cug2uom34skj7mihog20", + "schema": "public", + "startedAt": "2025-02-03T02:53:55.27031Z" +} diff --git a/apps/api/.xata/migrations/mig_cug2vq6trfea4ndapdug.json b/apps/api/.xata/migrations/mig_cug2vq6trfea4ndapdug.json new file mode 100644 index 00000000..838e8397 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug2vq6trfea4ndapdug.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cug2vq6trfea4ndapdug", + "operations": [ + { + "add_column": { + "up": "''", + "table": "artists", + "column": { + "name": "name", + "type": "text", + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug2vq6trfea4ndapdug", + "parent": "mig_cug2vgmtrfea4ndapdtg", + "schema": "public", + "startedAt": "2025-02-03T02:54:33.426168Z" +} diff --git a/apps/api/.xata/migrations/mig_cug303utrfea4ndapdvg.json b/apps/api/.xata/migrations/mig_cug303utrfea4ndapdvg.json new file mode 100644 index 00000000..43ae6300 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug303utrfea4ndapdvg.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cug303utrfea4ndapdvg", + "operations": [ + { + "add_column": { + "table": "artists", + "column": { + "name": "biography", + "type": "text", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug303utrfea4ndapdvg", + "parent": "mig_cug2vq6trfea4ndapdug", + "schema": "public", + "startedAt": "2025-02-03T02:55:12.609028Z" +} diff --git a/apps/api/.xata/migrations/mig_cug30h7lmd4pfs40psog.json b/apps/api/.xata/migrations/mig_cug30h7lmd4pfs40psog.json new file mode 100644 index 00000000..063d22fd --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug30h7lmd4pfs40psog.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cug30h7lmd4pfs40psog", + "operations": [ + { + "create_table": { + "name": "shouts", + "columns": [ + { + "name": "xata_id", + "type": "text", + "check": { + "name": "shouts_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + }, + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"shouts\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"shouts\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug30h7lmd4pfs40psog", + "parent": "mig_cug303utrfea4ndapdvg", + "schema": "public", + "startedAt": "2025-02-03T02:56:04.895288Z" +} diff --git a/apps/api/.xata/migrations/mig_cug31gu34skj7mihog30.json b/apps/api/.xata/migrations/mig_cug31gu34skj7mihog30.json new file mode 100644 index 00000000..9d957247 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug31gu34skj7mihog30.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cug31gu34skj7mihog30", + "operations": [ + { + "add_column": { + "up": "''", + "table": "shouts", + "column": { + "name": "content", + "type": "text", + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug31gu34skj7mihog30", + "parent": "mig_cug30h7lmd4pfs40psog", + "schema": "public", + "startedAt": "2025-02-03T02:58:12.716929Z" +} diff --git a/apps/api/.xata/migrations/mig_cug324nlmd4pfs40psr0.json b/apps/api/.xata/migrations/mig_cug324nlmd4pfs40psr0.json new file mode 100644 index 00000000..66fdc052 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug324nlmd4pfs40psr0.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cug324nlmd4pfs40psr0", + "operations": [ + { + "add_column": { + "up": "''", + "table": "shouts", + "column": { + "name": "user_id", + "type": "text", + "comment": "{\"xata.link\":\"users\"}", + "references": { + "name": "user_id_link", + "table": "users", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug324nlmd4pfs40psr0", + "parent": "mig_cug31gu34skj7mihog30", + "schema": "public", + "startedAt": "2025-02-03T02:59:31.035013Z" +} diff --git a/apps/api/.xata/migrations/mig_cug32gnlmd4pfs40pss0.json b/apps/api/.xata/migrations/mig_cug32gnlmd4pfs40pss0.json new file mode 100644 index 00000000..83cf1a04 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug32gnlmd4pfs40pss0.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cug32gnlmd4pfs40pss0", + "operations": [ + { + "add_column": { + "up": "''", + "table": "shouts", + "column": { + "name": "track_id", + "type": "text", + "comment": "{\"xata.link\":\"tracks\"}", + "references": { + "name": "track_id_link", + "table": "tracks", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug32gnlmd4pfs40pss0", + "parent": "mig_cug324nlmd4pfs40psr0", + "schema": "public", + "startedAt": "2025-02-03T03:00:19.219088Z" +} diff --git a/apps/api/.xata/migrations/mig_cug330utrfea4ndape2g.json b/apps/api/.xata/migrations/mig_cug330utrfea4ndape2g.json new file mode 100644 index 00000000..d6fd3fa9 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug330utrfea4ndape2g.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cug330utrfea4ndape2g", + "operations": [ + { + "create_table": { + "name": "user_playlists", + "columns": [ + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_id", + "type": "text", + "check": { + "name": "user_playlists_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"user_playlists\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"user_playlists\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug330utrfea4ndape2g", + "parent": "mig_cug32gnlmd4pfs40pss0", + "schema": "public", + "startedAt": "2025-02-03T03:01:24.688954Z" +} diff --git a/apps/api/.xata/migrations/mig_cug33fm34skj7mihog40.json b/apps/api/.xata/migrations/mig_cug33fm34skj7mihog40.json new file mode 100644 index 00000000..6e682b09 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug33fm34skj7mihog40.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cug33fm34skj7mihog40", + "operations": [ + { + "create_table": { + "name": "track_tags", + "columns": [ + { + "name": "xata_id", + "type": "text", + "check": { + "name": "track_tags_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + }, + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"track_tags\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"track_tags\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug33fm34skj7mihog40", + "parent": "mig_cug330utrfea4ndape2g", + "schema": "public", + "startedAt": "2025-02-03T03:02:23.011222Z" +} diff --git a/apps/api/.xata/migrations/mig_cug34a6trfea4ndape3g.json b/apps/api/.xata/migrations/mig_cug34a6trfea4ndape3g.json new file mode 100644 index 00000000..61616ac6 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug34a6trfea4ndape3g.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cug34a6trfea4ndape3g", + "operations": [ + { + "add_column": { + "up": "''", + "table": "track_tags", + "column": { + "name": "track_id", + "type": "text", + "comment": "{\"xata.link\":\"tracks\"}", + "references": { + "name": "track_id_link", + "table": "tracks", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug34a6trfea4ndape3g", + "parent": "mig_cug33fm34skj7mihog40", + "schema": "public", + "startedAt": "2025-02-03T03:04:09.657326Z" +} diff --git a/apps/api/.xata/migrations/mig_cug35bmtrfea4ndape4g.json b/apps/api/.xata/migrations/mig_cug35bmtrfea4ndape4g.json new file mode 100644 index 00000000..9ca99cbd --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug35bmtrfea4ndape4g.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cug35bmtrfea4ndape4g", + "operations": [ + { + "add_column": { + "up": "''", + "table": "track_tags", + "column": { + "name": "tag_id", + "type": "text", + "comment": "{\"xata.link\":\"tags\"}", + "references": { + "name": "tag_id_link", + "table": "tags", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug35bmtrfea4ndape4g", + "parent": "mig_cug34a6trfea4ndape3g", + "schema": "public", + "startedAt": "2025-02-03T03:06:23.160434Z" +} diff --git a/apps/api/.xata/migrations/mig_cug366mtrfea4ndape5g.json b/apps/api/.xata/migrations/mig_cug366mtrfea4ndape5g.json new file mode 100644 index 00000000..782f6e18 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug366mtrfea4ndape5g.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cug366mtrfea4ndape5g", + "operations": [ + { + "create_table": { + "name": "artist_albums", + "columns": [ + { + "name": "xata_id", + "type": "text", + "check": { + "name": "artist_albums_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + }, + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"artist_albums\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"artist_albums\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug366mtrfea4ndape5g", + "parent": "mig_cug35bmtrfea4ndape4g", + "schema": "public", + "startedAt": "2025-02-03T03:08:11.923351Z" +} diff --git a/apps/api/.xata/migrations/mig_cug36s6trfea4ndapeag.json b/apps/api/.xata/migrations/mig_cug36s6trfea4ndapeag.json new file mode 100644 index 00000000..6f644dcb --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug36s6trfea4ndapeag.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cug36s6trfea4ndapeag", + "operations": [ + { + "add_column": { + "up": "''", + "table": "artist_albums", + "column": { + "name": "artist_id", + "type": "text", + "comment": "{\"xata.link\":\"artists\"}", + "references": { + "name": "artist_id_link", + "table": "artists", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug36s6trfea4ndapeag", + "parent": "mig_cug366mtrfea4ndape5g", + "schema": "public", + "startedAt": "2025-02-03T03:09:37.396966Z" +} diff --git a/apps/api/.xata/migrations/mig_cug3786trfea4ndapebg.json b/apps/api/.xata/migrations/mig_cug3786trfea4ndapebg.json new file mode 100644 index 00000000..f8fbcf78 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug3786trfea4ndapebg.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cug3786trfea4ndapebg", + "operations": [ + { + "add_column": { + "up": "''", + "table": "artist_albums", + "column": { + "name": "album_id", + "type": "text", + "comment": "{\"xata.link\":\"albums\"}", + "references": { + "name": "album_id_link", + "table": "albums", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug3786trfea4ndapebg", + "parent": "mig_cug36s6trfea4ndapeag", + "schema": "public", + "startedAt": "2025-02-03T03:10:25.594718Z" +} diff --git a/apps/api/.xata/migrations/mig_cug37jmtrfea4ndapecg.json b/apps/api/.xata/migrations/mig_cug37jmtrfea4ndapecg.json new file mode 100644 index 00000000..efbfb4b7 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug37jmtrfea4ndapecg.json @@ -0,0 +1,25 @@ +{ + "done": true, + "migration": { + "name": "mig_cug37jmtrfea4ndapecg", + "operations": [ + { + "add_column": { + "up": "''", + "table": "users", + "column": { + "name": "did", + "type": "text", + "unique": true, + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug37jmtrfea4ndapecg", + "parent": "mig_cug3786trfea4ndapebg", + "schema": "public", + "startedAt": "2025-02-03T03:11:11.95892Z" +} diff --git a/apps/api/.xata/migrations/mig_cug37r6trfea4ndapedg.json b/apps/api/.xata/migrations/mig_cug37r6trfea4ndapedg.json new file mode 100644 index 00000000..1e6d1c57 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug37r6trfea4ndapedg.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cug37r6trfea4ndapedg", + "operations": [ + { + "add_column": { + "up": "''", + "table": "users", + "column": { + "name": "display_name", + "type": "text", + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug37r6trfea4ndapedg", + "parent": "mig_cug37jmtrfea4ndapecg", + "schema": "public", + "startedAt": "2025-02-03T03:11:41.078547Z" +} diff --git a/apps/api/.xata/migrations/mig_cug380utrfea4ndapeeg.json b/apps/api/.xata/migrations/mig_cug380utrfea4ndapeeg.json new file mode 100644 index 00000000..17e188cd --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug380utrfea4ndapeeg.json @@ -0,0 +1,25 @@ +{ + "done": true, + "migration": { + "name": "mig_cug380utrfea4ndapeeg", + "operations": [ + { + "add_column": { + "up": "''", + "table": "users", + "column": { + "name": "handle", + "type": "text", + "unique": true, + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug380utrfea4ndapeeg", + "parent": "mig_cug37r6trfea4ndapedg", + "schema": "public", + "startedAt": "2025-02-03T03:12:04.199682Z" +} diff --git a/apps/api/.xata/migrations/mig_cug38cutrfea4ndapefg.json b/apps/api/.xata/migrations/mig_cug38cutrfea4ndapefg.json new file mode 100644 index 00000000..10747b6c --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug38cutrfea4ndapefg.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cug38cutrfea4ndapefg", + "operations": [ + { + "add_column": { + "up": "''", + "table": "user_playlists", + "column": { + "name": "user_id", + "type": "text", + "comment": "{\"xata.link\":\"users\"}", + "references": { + "name": "user_id_link", + "table": "users", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug38cutrfea4ndapefg", + "parent": "mig_cug380utrfea4ndapeeg", + "schema": "public", + "startedAt": "2025-02-03T03:12:52.428398Z" +} diff --git a/apps/api/.xata/migrations/mig_cug38netrfea4ndapegg.json b/apps/api/.xata/migrations/mig_cug38netrfea4ndapegg.json new file mode 100644 index 00000000..9563503f --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug38netrfea4ndapegg.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cug38netrfea4ndapegg", + "operations": [ + { + "add_column": { + "up": "''", + "table": "user_playlists", + "column": { + "name": "playlist_id", + "type": "text", + "comment": "{\"xata.link\":\"playlists\"}", + "references": { + "name": "playlist_id_link", + "table": "playlists", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug38netrfea4ndapegg", + "parent": "mig_cug38cutrfea4ndapefg", + "schema": "public", + "startedAt": "2025-02-03T03:13:34.601361Z" +} diff --git a/apps/api/.xata/migrations/mig_cug39f6trfea4ndapehg.json b/apps/api/.xata/migrations/mig_cug39f6trfea4ndapehg.json new file mode 100644 index 00000000..8ba0a0e6 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug39f6trfea4ndapehg.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cug39f6trfea4ndapehg", + "operations": [ + { + "add_column": { + "up": "''", + "table": "playlist_tracks", + "column": { + "name": "track_id", + "type": "text", + "comment": "{\"xata.link\":\"tracks\"}", + "references": { + "name": "track_id_link", + "table": "tracks", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug39f6trfea4ndapehg", + "parent": "mig_cug38netrfea4ndapegg", + "schema": "public", + "startedAt": "2025-02-03T03:15:10.320332Z" +} diff --git a/apps/api/.xata/migrations/mig_cug39v6trfea4ndapejg.json b/apps/api/.xata/migrations/mig_cug39v6trfea4ndapejg.json new file mode 100644 index 00000000..dea271fd --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug39v6trfea4ndapejg.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cug39v6trfea4ndapejg", + "operations": [ + { + "add_column": { + "up": "''", + "table": "playlist_tracks", + "column": { + "name": "playlist_id", + "type": "text", + "comment": "{\"xata.link\":\"playlists\"}", + "references": { + "name": "playlist_id_link", + "table": "playlists", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug39v6trfea4ndapejg", + "parent": "mig_cug39f6trfea4ndapehg", + "schema": "public", + "startedAt": "2025-02-03T03:16:13.709736Z" +} diff --git a/apps/api/.xata/migrations/mig_cug3adetrfea4ndapekg.json b/apps/api/.xata/migrations/mig_cug3adetrfea4ndapekg.json new file mode 100644 index 00000000..a1405ded --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug3adetrfea4ndapekg.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cug3adetrfea4ndapekg", + "operations": [ + { + "add_column": { + "up": "''", + "table": "loved_tracks", + "column": { + "name": "user_id", + "type": "text", + "comment": "{\"xata.link\":\"users\"}", + "references": { + "name": "user_id_link", + "table": "users", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug3adetrfea4ndapekg", + "parent": "mig_cug39v6trfea4ndapejg", + "schema": "public", + "startedAt": "2025-02-03T03:17:10.868116Z" +} diff --git a/apps/api/.xata/migrations/mig_cug3auutrfea4ndapelg.json b/apps/api/.xata/migrations/mig_cug3auutrfea4ndapelg.json new file mode 100644 index 00000000..e2fdfc84 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug3auutrfea4ndapelg.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cug3auutrfea4ndapelg", + "operations": [ + { + "add_column": { + "up": "''", + "table": "loved_tracks", + "column": { + "name": "track_id", + "type": "text", + "comment": "{\"xata.link\":\"tracks\"}", + "references": { + "name": "track_id_link", + "table": "tracks", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug3auutrfea4ndapelg", + "parent": "mig_cug3adetrfea4ndapekg", + "schema": "public", + "startedAt": "2025-02-03T03:18:20.266519Z" +} diff --git a/apps/api/.xata/migrations/mig_cug3c27lmd4pfs40psv0.json b/apps/api/.xata/migrations/mig_cug3c27lmd4pfs40psv0.json new file mode 100644 index 00000000..c5bcf898 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug3c27lmd4pfs40psv0.json @@ -0,0 +1,25 @@ +{ + "done": true, + "migration": { + "name": "mig_cug3c27lmd4pfs40psv0", + "operations": [ + { + "add_column": { + "up": "''", + "table": "tracks", + "column": { + "name": "sha256", + "type": "text", + "unique": true, + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug3c27lmd4pfs40psv0", + "parent": "mig_cug3auutrfea4ndapelg", + "schema": "public", + "startedAt": "2025-02-03T03:20:41.760093Z" +} diff --git a/apps/api/.xata/migrations/mig_cug3dautrfea4ndapepg.json b/apps/api/.xata/migrations/mig_cug3dautrfea4ndapepg.json new file mode 100644 index 00000000..77c50658 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug3dautrfea4ndapepg.json @@ -0,0 +1,25 @@ +{ + "done": true, + "migration": { + "name": "mig_cug3dautrfea4ndapepg", + "operations": [ + { + "add_column": { + "up": "''", + "table": "albums", + "column": { + "name": "sha256", + "type": "text", + "unique": true, + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug3dautrfea4ndapepg", + "parent": "mig_cug3c27lmd4pfs40psv0", + "schema": "public", + "startedAt": "2025-02-03T03:23:23.565038Z" +} diff --git a/apps/api/.xata/migrations/mig_cug3e6634skj7mihog60.json b/apps/api/.xata/migrations/mig_cug3e6634skj7mihog60.json new file mode 100644 index 00000000..59c0eb60 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug3e6634skj7mihog60.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cug3e6634skj7mihog60", + "operations": [ + { + "add_column": { + "up": "''", + "table": "scrobbles", + "column": { + "name": "user_id", + "type": "text", + "comment": "{\"xata.link\":\"users\"}", + "references": { + "name": "user_id_link", + "table": "users", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug3e6634skj7mihog60", + "parent": "mig_cug3dautrfea4ndapepg", + "schema": "public", + "startedAt": "2025-02-03T03:25:13.056353Z" +} diff --git a/apps/api/.xata/migrations/mig_cug3fle34skj7mihog70.json b/apps/api/.xata/migrations/mig_cug3fle34skj7mihog70.json new file mode 100644 index 00000000..bdf5a267 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug3fle34skj7mihog70.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cug3fle34skj7mihog70", + "operations": [ + { + "add_column": { + "up": "''", + "table": "scrobbles", + "column": { + "name": "track_id", + "type": "text", + "comment": "{\"xata.link\":\"tracks\"}", + "references": { + "name": "track_id_link", + "table": "tracks", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug3fle34skj7mihog70", + "parent": "mig_cug3e6634skj7mihog60", + "schema": "public", + "startedAt": "2025-02-03T03:28:22.230544Z" +} diff --git a/apps/api/.xata/migrations/mig_cug3ssflmd4pfs40pt30.json b/apps/api/.xata/migrations/mig_cug3ssflmd4pfs40pt30.json new file mode 100644 index 00000000..d1dda98c --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug3ssflmd4pfs40pt30.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cug3ssflmd4pfs40pt30", + "operations": [ + { + "add_column": { + "up": "''", + "table": "users", + "column": { + "name": "avatar", + "type": "text", + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug3ssflmd4pfs40pt30", + "parent": "mig_cug3fle34skj7mihog70", + "schema": "public", + "startedAt": "2025-02-03T03:56:34.482533Z" +} diff --git a/apps/api/.xata/migrations/mig_cug5hue34skj7mihoh2g.json b/apps/api/.xata/migrations/mig_cug5hue34skj7mihoh2g.json new file mode 100644 index 00000000..54fa8b67 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cug5hue34skj7mihoh2g.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cug5hue34skj7mihoh2g", + "operations": [ + { + "add_column": { + "table": "tracks", + "column": { + "name": "disc_number", + "type": "int", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cug5hue34skj7mihoh2g", + "parent": "mig_cug3ssflmd4pfs40pt30", + "schema": "public", + "startedAt": "2025-02-03T05:49:45.969946Z" +} diff --git a/apps/api/.xata/migrations/mig_cuggu2jiojibbahciro0.json b/apps/api/.xata/migrations/mig_cuggu2jiojibbahciro0.json new file mode 100644 index 00000000..47544086 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuggu2jiojibbahciro0.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cuggu2jiojibbahciro0", + "operations": [ + { + "add_column": { + "table": "tracks", + "column": { + "name": "lyrics", + "type": "text", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuggu2jiojibbahciro0", + "parent": "mig_cug5hue34skj7mihoh2g", + "schema": "public", + "startedAt": "2025-02-03T18:46:35.152454Z" +} diff --git a/apps/api/.xata/migrations/mig_cuggv5pi7viit4iimp30.json b/apps/api/.xata/migrations/mig_cuggv5pi7viit4iimp30.json new file mode 100644 index 00000000..8321c328 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuggv5pi7viit4iimp30.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cuggv5pi7viit4iimp30", + "operations": [ + { + "add_column": { + "table": "artists", + "column": { + "name": "born", + "type": "timestamptz", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuggv5pi7viit4iimp30", + "parent": "mig_cuggu2jiojibbahciro0", + "schema": "public", + "startedAt": "2025-02-03T18:48:55.988665Z" +} diff --git a/apps/api/.xata/migrations/mig_cuggvc3rr2giaepagc30.json b/apps/api/.xata/migrations/mig_cuggvc3rr2giaepagc30.json new file mode 100644 index 00000000..93f56db4 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuggvc3rr2giaepagc30.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cuggvc3rr2giaepagc30", + "operations": [ + { + "add_column": { + "table": "artists", + "column": { + "name": "born_in", + "type": "text", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuggvc3rr2giaepagc30", + "parent": "mig_cuggv5pi7viit4iimp30", + "schema": "public", + "startedAt": "2025-02-03T18:49:21.178114Z" +} diff --git a/apps/api/.xata/migrations/mig_cuggvhbrr2giaepagc50.json b/apps/api/.xata/migrations/mig_cuggvhbrr2giaepagc50.json new file mode 100644 index 00000000..304bdc7b --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuggvhbrr2giaepagc50.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cuggvhbrr2giaepagc50", + "operations": [ + { + "create_table": { + "name": "artist_tags", + "columns": [ + { + "name": "xata_version", + "type": "integer", + "default": "0" + }, + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_id", + "type": "text", + "check": { + "name": "artist_tags_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"artist_tags\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"artist_tags\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuggvhbrr2giaepagc50", + "parent": "mig_cuggvc3rr2giaepagc30", + "schema": "public", + "startedAt": "2025-02-03T18:49:42.291596Z" +} diff --git a/apps/api/.xata/migrations/mig_cuggvlpi7viit4iimp40.json b/apps/api/.xata/migrations/mig_cuggvlpi7viit4iimp40.json new file mode 100644 index 00000000..7996bcd8 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuggvlpi7viit4iimp40.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cuggvlpi7viit4iimp40", + "operations": [ + { + "create_table": { + "name": "album_tags", + "columns": [ + { + "name": "xata_id", + "type": "text", + "check": { + "name": "album_tags_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + }, + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"album_tags\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"album_tags\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuggvlpi7viit4iimp40", + "parent": "mig_cuggvhbrr2giaepagc50", + "schema": "public", + "startedAt": "2025-02-03T18:50:00.456776Z" +} diff --git a/apps/api/.xata/migrations/mig_cugh01jrr2giaepagc60.json b/apps/api/.xata/migrations/mig_cugh01jrr2giaepagc60.json new file mode 100644 index 00000000..07d1f314 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cugh01jrr2giaepagc60.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cugh01jrr2giaepagc60", + "operations": [ + { + "add_column": { + "up": "''", + "table": "artist_tags", + "column": { + "name": "artist_id", + "type": "text", + "comment": "{\"xata.link\":\"artists\"}", + "references": { + "name": "artist_id_link", + "table": "artists", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cugh01jrr2giaepagc60", + "parent": "mig_cuggvlpi7viit4iimp40", + "schema": "public", + "startedAt": "2025-02-03T18:50:47.758327Z" +} diff --git a/apps/api/.xata/migrations/mig_cugh0ahi7viit4iimp50.json b/apps/api/.xata/migrations/mig_cugh0ahi7viit4iimp50.json new file mode 100644 index 00000000..cdc6bd49 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cugh0ahi7viit4iimp50.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cugh0ahi7viit4iimp50", + "operations": [ + { + "add_column": { + "up": "''", + "table": "artist_tags", + "column": { + "name": "tag_id", + "type": "text", + "comment": "{\"xata.link\":\"tags\"}", + "references": { + "name": "tag_id_link", + "table": "tags", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cugh0ahi7viit4iimp50", + "parent": "mig_cugh01jrr2giaepagc60", + "schema": "public", + "startedAt": "2025-02-03T18:51:24.134905Z" +} diff --git a/apps/api/.xata/migrations/mig_cugh0vrrr2giaepagc70.json b/apps/api/.xata/migrations/mig_cugh0vrrr2giaepagc70.json new file mode 100644 index 00000000..49b98409 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cugh0vrrr2giaepagc70.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cugh0vrrr2giaepagc70", + "operations": [ + { + "add_column": { + "up": "''", + "table": "album_tags", + "column": { + "name": "album_id", + "type": "text", + "comment": "{\"xata.link\":\"albums\"}", + "references": { + "name": "album_id_link", + "table": "albums", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cugh0vrrr2giaepagc70", + "parent": "mig_cugh0ahi7viit4iimp50", + "schema": "public", + "startedAt": "2025-02-03T18:52:47.663724Z" +} diff --git a/apps/api/.xata/migrations/mig_cugh19hi7viit4iimp60.json b/apps/api/.xata/migrations/mig_cugh19hi7viit4iimp60.json new file mode 100644 index 00000000..0fdcadff --- /dev/null +++ b/apps/api/.xata/migrations/mig_cugh19hi7viit4iimp60.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cugh19hi7viit4iimp60", + "operations": [ + { + "add_column": { + "up": "''", + "table": "album_tags", + "column": { + "name": "tag_id", + "type": "text", + "comment": "{\"xata.link\":\"tags\"}", + "references": { + "name": "tag_id_link", + "table": "tags", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cugh19hi7viit4iimp60", + "parent": "mig_cugh0vrrr2giaepagc70", + "schema": "public", + "startedAt": "2025-02-03T18:53:26.948822Z" +} diff --git a/apps/api/.xata/migrations/mig_cugh8opi7viit4iimpf0.json b/apps/api/.xata/migrations/mig_cugh8opi7viit4iimpf0.json new file mode 100644 index 00000000..a044b7b1 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cugh8opi7viit4iimpf0.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cugh8opi7viit4iimpf0", + "operations": [ + { + "add_column": { + "table": "tracks", + "column": { + "name": "composer", + "type": "text", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cugh8opi7viit4iimpf0", + "parent": "mig_cugh19hi7viit4iimp60", + "schema": "public", + "startedAt": "2025-02-03T19:09:24.312237Z" +} diff --git a/apps/api/.xata/migrations/mig_cugh95pi7viit4iimpi0.json b/apps/api/.xata/migrations/mig_cugh95pi7viit4iimpi0.json new file mode 100644 index 00000000..5004e55c --- /dev/null +++ b/apps/api/.xata/migrations/mig_cugh95pi7viit4iimpi0.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cugh95pi7viit4iimpi0", + "operations": [ + { + "add_column": { + "table": "artists", + "column": { + "name": "died", + "type": "timestamptz", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cugh95pi7viit4iimpi0", + "parent": "mig_cugh8opi7viit4iimpf0", + "schema": "public", + "startedAt": "2025-02-03T19:10:16.629755Z" +} diff --git a/apps/api/.xata/migrations/mig_cughff1i7viit4iimpog.json b/apps/api/.xata/migrations/mig_cughff1i7viit4iimpog.json new file mode 100644 index 00000000..3a8c0961 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cughff1i7viit4iimpog.json @@ -0,0 +1,24 @@ +{ + "done": false, + "migration": { + "name": "mig_cughff1i7viit4iimpog", + "operations": [ + { + "add_column": { + "table": "tracks", + "column": { + "name": "genre", + "type": "text", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cughff1i7viit4iimpog", + "parent": "mig_cugh95pi7viit4iimpi0", + "schema": "public", + "startedAt": "2025-02-03T19:23:40.931321Z" +} diff --git a/apps/api/.xata/migrations/mig_cughn8brr2giaepagcdg.json b/apps/api/.xata/migrations/mig_cughn8brr2giaepagcdg.json new file mode 100644 index 00000000..fbb1b44d --- /dev/null +++ b/apps/api/.xata/migrations/mig_cughn8brr2giaepagcdg.json @@ -0,0 +1,25 @@ +{ + "done": true, + "migration": { + "name": "mig_cughn8brr2giaepagcdg", + "operations": [ + { + "add_column": { + "up": "''", + "table": "artists", + "column": { + "name": "sha256", + "type": "text", + "unique": true, + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cughn8brr2giaepagcdg", + "parent": "mig_cughff1i7viit4iimpog", + "schema": "public", + "startedAt": "2025-02-03T19:40:18.886357Z" +} diff --git a/apps/api/.xata/migrations/mig_cuhrs2biojibbahcj9t0.json b/apps/api/.xata/migrations/mig_cuhrs2biojibbahcj9t0.json new file mode 100644 index 00000000..72db8db3 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuhrs2biojibbahcj9t0.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cuhrs2biojibbahcj9t0", + "operations": [ + { + "add_column": { + "table": "tracks", + "column": { + "name": "copyright_message", + "type": "text", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuhrs2biojibbahcj9t0", + "parent": "mig_cughn8brr2giaepagcdg", + "schema": "public", + "startedAt": "2025-02-05T19:37:45.794245Z" +} diff --git a/apps/api/.xata/migrations/mig_cuhsqtjrr2giaepagnj0.json b/apps/api/.xata/migrations/mig_cuhsqtjrr2giaepagnj0.json new file mode 100644 index 00000000..993a8336 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuhsqtjrr2giaepagnj0.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cuhsqtjrr2giaepagnj0", + "operations": [ + { + "add_column": { + "table": "artists", + "column": { + "name": "picture", + "type": "text", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuhsqtjrr2giaepagnj0", + "parent": "mig_cuhrs2biojibbahcj9t0", + "schema": "public", + "startedAt": "2025-02-05T20:43:34.480393Z" +} diff --git a/apps/api/.xata/migrations/mig_cuhtdmjrr2giaepago90.json b/apps/api/.xata/migrations/mig_cuhtdmjrr2giaepago90.json new file mode 100644 index 00000000..9a61af00 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuhtdmjrr2giaepago90.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cuhtdmjrr2giaepago90", + "operations": [ + { + "add_column": { + "table": "scrobbles", + "column": { + "name": "album_id", + "type": "text", + "comment": "{\"xata.link\":\"albums\"}", + "nullable": true, + "references": { + "name": "album_id_link", + "table": "albums", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuhtdmjrr2giaepago90", + "parent": "mig_cuhsqtjrr2giaepagnj0", + "schema": "public", + "startedAt": "2025-02-05T21:23:38.655799Z" +} diff --git a/apps/api/.xata/migrations/mig_cuhte8brr2giaepagoa0.json b/apps/api/.xata/migrations/mig_cuhte8brr2giaepagoa0.json new file mode 100644 index 00000000..96283497 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuhte8brr2giaepagoa0.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cuhte8brr2giaepagoa0", + "operations": [ + { + "add_column": { + "table": "scrobbles", + "column": { + "name": "artist_id", + "type": "text", + "comment": "{\"xata.link\":\"artists\"}", + "nullable": true, + "references": { + "name": "artist_id_link", + "table": "artists", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuhte8brr2giaepagoa0", + "parent": "mig_cuhtdmjrr2giaepago90", + "schema": "public", + "startedAt": "2025-02-05T21:24:51.118697Z" +} diff --git a/apps/api/.xata/migrations/mig_cuiitohfp08bj5ug83rg.json b/apps/api/.xata/migrations/mig_cuiitohfp08bj5ug83rg.json new file mode 100644 index 00000000..7a5d393e --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuiitohfp08bj5ug83rg.json @@ -0,0 +1,25 @@ +{ + "done": true, + "migration": { + "name": "mig_cuiitohfp08bj5ug83rg", + "operations": [ + { + "add_column": { + "table": "scrobbles", + "column": { + "name": "uri", + "type": "text", + "unique": true, + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuiitohfp08bj5ug83rg", + "parent": "mig_cuhte8brr2giaepagoa0", + "schema": "public", + "startedAt": "2025-02-06T21:51:31.681752Z" +} diff --git a/apps/api/.xata/migrations/mig_cuiiu1dbcvmcu6qfb6q0.json b/apps/api/.xata/migrations/mig_cuiiu1dbcvmcu6qfb6q0.json new file mode 100644 index 00000000..fccd250b --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuiiu1dbcvmcu6qfb6q0.json @@ -0,0 +1,25 @@ +{ + "done": true, + "migration": { + "name": "mig_cuiiu1dbcvmcu6qfb6q0", + "operations": [ + { + "add_column": { + "table": "artists", + "column": { + "name": "uri", + "type": "text", + "unique": true, + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuiiu1dbcvmcu6qfb6q0", + "parent": "mig_cuiitohfp08bj5ug83rg", + "schema": "public", + "startedAt": "2025-02-06T21:52:05.789103Z" +} diff --git a/apps/api/.xata/migrations/mig_cuiiu59fp08bj5ug83sg.json b/apps/api/.xata/migrations/mig_cuiiu59fp08bj5ug83sg.json new file mode 100644 index 00000000..b3f2def6 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuiiu59fp08bj5ug83sg.json @@ -0,0 +1,25 @@ +{ + "done": true, + "migration": { + "name": "mig_cuiiu59fp08bj5ug83sg", + "operations": [ + { + "add_column": { + "table": "albums", + "column": { + "name": "uri", + "type": "text", + "unique": true, + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuiiu59fp08bj5ug83sg", + "parent": "mig_cuiiu1dbcvmcu6qfb6q0", + "schema": "public", + "startedAt": "2025-02-06T21:52:21.897412Z" +} diff --git a/apps/api/.xata/migrations/mig_cuiiuahfp08bj5ug83tg.json b/apps/api/.xata/migrations/mig_cuiiuahfp08bj5ug83tg.json new file mode 100644 index 00000000..fb46503a --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuiiuahfp08bj5ug83tg.json @@ -0,0 +1,25 @@ +{ + "done": true, + "migration": { + "name": "mig_cuiiuahfp08bj5ug83tg", + "operations": [ + { + "add_column": { + "table": "tracks", + "column": { + "name": "uri", + "type": "text", + "unique": true, + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuiiuahfp08bj5ug83tg", + "parent": "mig_cuiiu59fp08bj5ug83sg", + "schema": "public", + "startedAt": "2025-02-06T21:52:43.04035Z" +} diff --git a/apps/api/.xata/migrations/mig_cuiiuh5bcvmcu6qfb6r0.json b/apps/api/.xata/migrations/mig_cuiiuh5bcvmcu6qfb6r0.json new file mode 100644 index 00000000..e5ed3a45 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuiiuh5bcvmcu6qfb6r0.json @@ -0,0 +1,25 @@ +{ + "done": true, + "migration": { + "name": "mig_cuiiuh5bcvmcu6qfb6r0", + "operations": [ + { + "add_column": { + "table": "loved_tracks", + "column": { + "name": "uri", + "type": "text", + "unique": true, + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuiiuh5bcvmcu6qfb6r0", + "parent": "mig_cuiiuahfp08bj5ug83tg", + "schema": "public", + "startedAt": "2025-02-06T21:53:09.117768Z" +} diff --git a/apps/api/.xata/migrations/mig_cuiiun9fp08bj5ug83ug.json b/apps/api/.xata/migrations/mig_cuiiun9fp08bj5ug83ug.json new file mode 100644 index 00000000..7eeced2e --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuiiun9fp08bj5ug83ug.json @@ -0,0 +1,25 @@ +{ + "done": true, + "migration": { + "name": "mig_cuiiun9fp08bj5ug83ug", + "operations": [ + { + "add_column": { + "table": "radios", + "column": { + "name": "uri", + "type": "text", + "unique": true, + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuiiun9fp08bj5ug83ug", + "parent": "mig_cuiiuh5bcvmcu6qfb6r0", + "schema": "public", + "startedAt": "2025-02-06T21:53:33.361528Z" +} diff --git a/apps/api/.xata/migrations/mig_cuiiuvdbcvmcu6qfb6s0.json b/apps/api/.xata/migrations/mig_cuiiuvdbcvmcu6qfb6s0.json new file mode 100644 index 00000000..a72523b8 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuiiuvdbcvmcu6qfb6s0.json @@ -0,0 +1,25 @@ +{ + "done": true, + "migration": { + "name": "mig_cuiiuvdbcvmcu6qfb6s0", + "operations": [ + { + "add_column": { + "table": "shouts", + "column": { + "name": "uri", + "type": "text", + "unique": true, + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuiiuvdbcvmcu6qfb6s0", + "parent": "mig_cuiiun9fp08bj5ug83ug", + "schema": "public", + "startedAt": "2025-02-06T21:54:06.635636Z" +} diff --git a/apps/api/.xata/migrations/mig_cuiiv41fp08bj5ug83vg.json b/apps/api/.xata/migrations/mig_cuiiv41fp08bj5ug83vg.json new file mode 100644 index 00000000..a455394d --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuiiv41fp08bj5ug83vg.json @@ -0,0 +1,25 @@ +{ + "done": true, + "migration": { + "name": "mig_cuiiv41fp08bj5ug83vg", + "operations": [ + { + "add_column": { + "table": "playlists", + "column": { + "name": "uri", + "type": "text", + "unique": true, + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuiiv41fp08bj5ug83vg", + "parent": "mig_cuiiuvdbcvmcu6qfb6s0", + "schema": "public", + "startedAt": "2025-02-06T21:54:24.514396Z" +} diff --git a/apps/api/.xata/migrations/mig_cuj25e1fp08bj5ug89s0.json b/apps/api/.xata/migrations/mig_cuj25e1fp08bj5ug89s0.json new file mode 100644 index 00000000..e5a6aa77 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuj25e1fp08bj5ug89s0.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cuj25e1fp08bj5ug89s0", + "operations": [ + { + "create_table": { + "name": "user_tracks", + "columns": [ + { + "name": "xata_id", + "type": "text", + "check": { + "name": "user_tracks_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + }, + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"user_tracks\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"user_tracks\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuj25e1fp08bj5ug89s0", + "parent": "mig_cuiiv41fp08bj5ug83vg", + "schema": "public", + "startedAt": "2025-02-07T15:11:53.013139Z" +} diff --git a/apps/api/.xata/migrations/mig_cuj25mpfp08bj5ug89u0.json b/apps/api/.xata/migrations/mig_cuj25mpfp08bj5ug89u0.json new file mode 100644 index 00000000..1ea74671 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuj25mpfp08bj5ug89u0.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cuj25mpfp08bj5ug89u0", + "operations": [ + { + "create_table": { + "name": "user_albums", + "columns": [ + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_id", + "type": "text", + "check": { + "name": "user_albums_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"user_albums\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"user_albums\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuj25mpfp08bj5ug89u0", + "parent": "mig_cuj25e1fp08bj5ug89s0", + "schema": "public", + "startedAt": "2025-02-07T15:12:27.988396Z" +} diff --git a/apps/api/.xata/migrations/mig_cuj25shfp08bj5ug89v0.json b/apps/api/.xata/migrations/mig_cuj25shfp08bj5ug89v0.json new file mode 100644 index 00000000..761d0d55 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuj25shfp08bj5ug89v0.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cuj25shfp08bj5ug89v0", + "operations": [ + { + "create_table": { + "name": "user_artists", + "columns": [ + { + "name": "xata_id", + "type": "text", + "check": { + "name": "user_artists_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + }, + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"user_artists\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"user_artists\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuj25shfp08bj5ug89v0", + "parent": "mig_cuj25mpfp08bj5ug89u0", + "schema": "public", + "startedAt": "2025-02-07T15:12:52.086934Z" +} diff --git a/apps/api/.xata/migrations/mig_cuj26ftbcvmcu6qfbaig.json b/apps/api/.xata/migrations/mig_cuj26ftbcvmcu6qfbaig.json new file mode 100644 index 00000000..2c6297ca --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuj26ftbcvmcu6qfbaig.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cuj26ftbcvmcu6qfbaig", + "operations": [ + { + "add_column": { + "up": "''", + "table": "user_tracks", + "column": { + "name": "user_id", + "type": "text", + "comment": "{\"xata.link\":\"users\"}", + "references": { + "name": "user_id_link", + "table": "users", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuj26ftbcvmcu6qfbaig", + "parent": "mig_cuj25shfp08bj5ug89v0", + "schema": "public", + "startedAt": "2025-02-07T15:14:08.525983Z" +} diff --git a/apps/api/.xata/migrations/mig_cuj26r1trh7pmg9el6a0.json b/apps/api/.xata/migrations/mig_cuj26r1trh7pmg9el6a0.json new file mode 100644 index 00000000..9f26f08e --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuj26r1trh7pmg9el6a0.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cuj26r1trh7pmg9el6a0", + "operations": [ + { + "add_column": { + "up": "''", + "table": "user_tracks", + "column": { + "name": "track_id", + "type": "text", + "comment": "{\"xata.link\":\"tracks\"}", + "references": { + "name": "track_id_link", + "table": "tracks", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuj26r1trh7pmg9el6a0", + "parent": "mig_cuj26ftbcvmcu6qfbaig", + "schema": "public", + "startedAt": "2025-02-07T15:14:53.723138Z" +} diff --git a/apps/api/.xata/migrations/mig_cuj2709trh7pmg9el6b0.json b/apps/api/.xata/migrations/mig_cuj2709trh7pmg9el6b0.json new file mode 100644 index 00000000..ff3df0e1 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuj2709trh7pmg9el6b0.json @@ -0,0 +1,25 @@ +{ + "done": true, + "migration": { + "name": "mig_cuj2709trh7pmg9el6b0", + "operations": [ + { + "add_column": { + "table": "user_tracks", + "column": { + "name": "uri", + "type": "text", + "unique": true, + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuj2709trh7pmg9el6b0", + "parent": "mig_cuj26r1trh7pmg9el6a0", + "schema": "public", + "startedAt": "2025-02-07T15:15:15.036973Z" +} diff --git a/apps/api/.xata/migrations/mig_cuj27c9fp08bj5ug8a10.json b/apps/api/.xata/migrations/mig_cuj27c9fp08bj5ug8a10.json new file mode 100644 index 00000000..64e627fd --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuj27c9fp08bj5ug8a10.json @@ -0,0 +1,25 @@ +{ + "done": true, + "migration": { + "name": "mig_cuj27c9fp08bj5ug8a10", + "operations": [ + { + "add_column": { + "table": "user_albums", + "column": { + "name": "uri", + "type": "text", + "unique": true, + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuj27c9fp08bj5ug8a10", + "parent": "mig_cuj2709trh7pmg9el6b0", + "schema": "public", + "startedAt": "2025-02-07T15:16:02.139307Z" +} diff --git a/apps/api/.xata/migrations/mig_cuj27n5bcvmcu6qfbajg.json b/apps/api/.xata/migrations/mig_cuj27n5bcvmcu6qfbajg.json new file mode 100644 index 00000000..22d2cd87 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuj27n5bcvmcu6qfbajg.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cuj27n5bcvmcu6qfbajg", + "operations": [ + { + "add_column": { + "up": "''", + "table": "user_albums", + "column": { + "name": "user_id", + "type": "text", + "comment": "{\"xata.link\":\"users\"}", + "references": { + "name": "user_id_link", + "table": "users", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuj27n5bcvmcu6qfbajg", + "parent": "mig_cuj27c9fp08bj5ug8a10", + "schema": "public", + "startedAt": "2025-02-07T15:16:44.422111Z" +} diff --git a/apps/api/.xata/migrations/mig_cuj2869fp08bj5ug8a30.json b/apps/api/.xata/migrations/mig_cuj2869fp08bj5ug8a30.json new file mode 100644 index 00000000..085f25a1 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuj2869fp08bj5ug8a30.json @@ -0,0 +1,25 @@ +{ + "done": true, + "migration": { + "name": "mig_cuj2869fp08bj5ug8a30", + "operations": [ + { + "add_column": { + "table": "user_playlists", + "column": { + "name": "uri", + "type": "text", + "unique": true, + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuj2869fp08bj5ug8a30", + "parent": "mig_cuj27n5bcvmcu6qfbajg", + "schema": "public", + "startedAt": "2025-02-07T15:17:46.6356Z" +} diff --git a/apps/api/.xata/migrations/mig_cuj29j5bcvmcu6qfbam0.json b/apps/api/.xata/migrations/mig_cuj29j5bcvmcu6qfbam0.json new file mode 100644 index 00000000..a26f98aa --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuj29j5bcvmcu6qfbam0.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cuj29j5bcvmcu6qfbam0", + "operations": [ + { + "add_column": { + "up": "''", + "table": "user_albums", + "column": { + "name": "album_id", + "type": "text", + "comment": "{\"xata.link\":\"albums\"}", + "references": { + "name": "album_id_link", + "table": "albums", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuj29j5bcvmcu6qfbam0", + "parent": "mig_cuj2869fp08bj5ug8a30", + "schema": "public", + "startedAt": "2025-02-07T15:20:46.154514Z" +} diff --git a/apps/api/.xata/migrations/mig_cujqfp9trh7pmg9elbdg.json b/apps/api/.xata/migrations/mig_cujqfp9trh7pmg9elbdg.json new file mode 100644 index 00000000..d7d6a089 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cujqfp9trh7pmg9elbdg.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cujqfp9trh7pmg9elbdg", + "operations": [ + { + "add_column": { + "up": "''", + "table": "user_artists", + "column": { + "name": "user_id", + "type": "text", + "comment": "{\"xata.link\":\"users\"}", + "references": { + "name": "user_id_link", + "table": "users", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cujqfp9trh7pmg9elbdg", + "parent": "mig_cuj29j5bcvmcu6qfbam0", + "schema": "public", + "startedAt": "2025-02-08T18:52:22.489214Z" +} diff --git a/apps/api/.xata/migrations/mig_cujqg59fp08bj5ug8fgg.json b/apps/api/.xata/migrations/mig_cujqg59fp08bj5ug8fgg.json new file mode 100644 index 00000000..33d6c4a0 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cujqg59fp08bj5ug8fgg.json @@ -0,0 +1,25 @@ +{ + "done": true, + "migration": { + "name": "mig_cujqg59fp08bj5ug8fgg", + "operations": [ + { + "add_column": { + "up": "''", + "table": "user_artists", + "column": { + "name": "uri", + "type": "text", + "unique": true, + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cujqg59fp08bj5ug8fgg", + "parent": "mig_cujqfp9trh7pmg9elbdg", + "schema": "public", + "startedAt": "2025-02-08T18:53:10.710739Z" +} diff --git a/apps/api/.xata/migrations/mig_cujqhc5bcvmcu6qfbgjg.json b/apps/api/.xata/migrations/mig_cujqhc5bcvmcu6qfbgjg.json new file mode 100644 index 00000000..d7be1b4a --- /dev/null +++ b/apps/api/.xata/migrations/mig_cujqhc5bcvmcu6qfbgjg.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cujqhc5bcvmcu6qfbgjg", + "operations": [ + { + "add_column": { + "up": "''", + "table": "user_artists", + "column": { + "name": "artist_id", + "type": "text", + "comment": "{\"xata.link\":\"artists\"}", + "references": { + "name": "artist_id_link", + "table": "artists", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cujqhc5bcvmcu6qfbgjg", + "parent": "mig_cujqg59fp08bj5ug8fgg", + "schema": "public", + "startedAt": "2025-02-08T18:55:44.458178Z" +} diff --git a/apps/api/.xata/migrations/mig_cuk9in5bcvmcu6qfbjcg.json b/apps/api/.xata/migrations/mig_cuk9in5bcvmcu6qfbjcg.json new file mode 100644 index 00000000..eac106a2 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuk9in5bcvmcu6qfbjcg.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cuk9in5bcvmcu6qfbjcg", + "operations": [ + { + "add_column": { + "table": "user_albums", + "column": { + "name": "score", + "type": "int", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuk9in5bcvmcu6qfbjcg", + "parent": "mig_cujqhc5bcvmcu6qfbgjg", + "schema": "public", + "startedAt": "2025-02-09T12:02:37.10244Z" +} diff --git a/apps/api/.xata/migrations/mig_cuk9jjtbcvmcu6qfbjdg.json b/apps/api/.xata/migrations/mig_cuk9jjtbcvmcu6qfbjdg.json new file mode 100644 index 00000000..172c5e62 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuk9jjtbcvmcu6qfbjdg.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cuk9jjtbcvmcu6qfbjdg", + "operations": [ + { + "add_column": { + "table": "user_artists", + "column": { + "name": "score", + "type": "int", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuk9jjtbcvmcu6qfbjdg", + "parent": "mig_cuk9in5bcvmcu6qfbjcg", + "schema": "public", + "startedAt": "2025-02-09T12:04:31.735909Z" +} diff --git a/apps/api/.xata/migrations/mig_cuk9k1hfp08bj5ug8i50.json b/apps/api/.xata/migrations/mig_cuk9k1hfp08bj5ug8i50.json new file mode 100644 index 00000000..b25d74c0 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuk9k1hfp08bj5ug8i50.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cuk9k1hfp08bj5ug8i50", + "operations": [ + { + "add_column": { + "table": "user_tracks", + "column": { + "name": "score", + "type": "int", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuk9k1hfp08bj5ug8i50", + "parent": "mig_cuk9jjtbcvmcu6qfbjdg", + "schema": "public", + "startedAt": "2025-02-09T12:05:26.99782Z" +} diff --git a/apps/api/.xata/migrations/mig_cuk9tvhfp08bj5ug8i80.json b/apps/api/.xata/migrations/mig_cuk9tvhfp08bj5ug8i80.json new file mode 100644 index 00000000..e341f3f8 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuk9tvhfp08bj5ug8i80.json @@ -0,0 +1,20 @@ +{ + "done": true, + "migration": { + "name": "mig_cuk9tvhfp08bj5ug8i80", + "operations": [ + { + "alter_column": { + "name": "scrobbles", + "table": "user_tracks", + "column": "score" + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuk9tvhfp08bj5ug8i80", + "parent": "mig_cuk9k1hfp08bj5ug8i50", + "schema": "public", + "startedAt": "2025-02-09T12:26:39.218981Z" +} diff --git a/apps/api/.xata/migrations/mig_cuk9uatbcvmcu6qfbjh0.json b/apps/api/.xata/migrations/mig_cuk9uatbcvmcu6qfbjh0.json new file mode 100644 index 00000000..d9c3ffe3 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuk9uatbcvmcu6qfbjh0.json @@ -0,0 +1,20 @@ +{ + "done": true, + "migration": { + "name": "mig_cuk9uatbcvmcu6qfbjh0", + "operations": [ + { + "alter_column": { + "name": "scrobbles", + "table": "user_artists", + "column": "score" + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuk9uatbcvmcu6qfbjh0", + "parent": "mig_cuk9tvhfp08bj5ug8i80", + "schema": "public", + "startedAt": "2025-02-09T12:27:23.442044Z" +} diff --git a/apps/api/.xata/migrations/mig_cuk9udpfp08bj5ug8i90.json b/apps/api/.xata/migrations/mig_cuk9udpfp08bj5ug8i90.json new file mode 100644 index 00000000..073f8ba4 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuk9udpfp08bj5ug8i90.json @@ -0,0 +1,20 @@ +{ + "done": true, + "migration": { + "name": "mig_cuk9udpfp08bj5ug8i90", + "operations": [ + { + "alter_column": { + "name": "scrobbles", + "table": "user_albums", + "column": "score" + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuk9udpfp08bj5ug8i90", + "parent": "mig_cuk9uatbcvmcu6qfbjh0", + "schema": "public", + "startedAt": "2025-02-09T12:27:36.51911Z" +} diff --git a/apps/api/.xata/migrations/mig_cukdg7lbcvmcu6qfbkk0.json b/apps/api/.xata/migrations/mig_cukdg7lbcvmcu6qfbkk0.json new file mode 100644 index 00000000..5bc94ac4 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cukdg7lbcvmcu6qfbkk0.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cukdg7lbcvmcu6qfbkk0", + "operations": [ + { + "add_column": { + "table": "tracks", + "column": { + "name": "album_uri", + "type": "text", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cukdg7lbcvmcu6qfbkk0", + "parent": "mig_cuk9udpfp08bj5ug8i90", + "schema": "public", + "startedAt": "2025-02-09T16:30:23.749148Z" +} diff --git a/apps/api/.xata/migrations/mig_cukdglptrh7pmg9elgeg.json b/apps/api/.xata/migrations/mig_cukdglptrh7pmg9elgeg.json new file mode 100644 index 00000000..a5342a56 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cukdglptrh7pmg9elgeg.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cukdglptrh7pmg9elgeg", + "operations": [ + { + "add_column": { + "table": "tracks", + "column": { + "name": "artist_uri", + "type": "text", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cukdglptrh7pmg9elgeg", + "parent": "mig_cukdg7lbcvmcu6qfbkk0", + "schema": "public", + "startedAt": "2025-02-09T16:31:20.041681Z" +} diff --git a/apps/api/.xata/migrations/mig_cukf0v5bcvmcu6qfbkug.json b/apps/api/.xata/migrations/mig_cukf0v5bcvmcu6qfbkug.json new file mode 100644 index 00000000..68869de1 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cukf0v5bcvmcu6qfbkug.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cukf0v5bcvmcu6qfbkug", + "operations": [ + { + "add_column": { + "table": "albums", + "column": { + "name": "artist_uri", + "type": "text", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cukf0v5bcvmcu6qfbkug", + "parent": "mig_cukdglptrh7pmg9elgeg", + "schema": "public", + "startedAt": "2025-02-09T18:14:20.768511Z" +} diff --git a/apps/api/.xata/migrations/mig_cumlpkk27onfu5mm3stg.json b/apps/api/.xata/migrations/mig_cumlpkk27onfu5mm3stg.json new file mode 100644 index 00000000..484aaa10 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cumlpkk27onfu5mm3stg.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cumlpkk27onfu5mm3stg", + "operations": [ + { + "create_table": { + "name": "spotify_token", + "columns": [ + { + "name": "xata_id", + "type": "text", + "check": { + "name": "spotify_token_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + }, + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"spotify_token\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"spotify_token\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cumlpkk27onfu5mm3stg", + "parent": "mig_cukf0v5bcvmcu6qfbkug", + "schema": "public", + "startedAt": "2025-02-13T02:45:38.830459Z" +} diff --git a/apps/api/.xata/migrations/mig_cumlpo427onfu5mm3sug.json b/apps/api/.xata/migrations/mig_cumlpo427onfu5mm3sug.json new file mode 100644 index 00000000..05469655 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cumlpo427onfu5mm3sug.json @@ -0,0 +1,19 @@ +{ + "done": true, + "migration": { + "name": "mig_cumlpo427onfu5mm3sug", + "operations": [ + { + "rename_table": { + "to": "spotify_tokens", + "from": "spotify_token" + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cumlpo427onfu5mm3sug", + "parent": "mig_cumlpkk27onfu5mm3stg", + "schema": "public", + "startedAt": "2025-02-13T02:45:52.924985Z" +} diff --git a/apps/api/.xata/migrations/mig_cumlrqpoos2v56d5q26g.json b/apps/api/.xata/migrations/mig_cumlrqpoos2v56d5q26g.json new file mode 100644 index 00000000..7ec7031c --- /dev/null +++ b/apps/api/.xata/migrations/mig_cumlrqpoos2v56d5q26g.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cumlrqpoos2v56d5q26g", + "operations": [ + { + "add_column": { + "table": "spotify_tokens", + "column": { + "name": "access_token", + "type": "text", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cumlrqpoos2v56d5q26g", + "parent": "mig_cumlpo427onfu5mm3sug", + "schema": "public", + "startedAt": "2025-02-13T02:50:20.116678Z" +} diff --git a/apps/api/.xata/migrations/mig_cumlrvk27onfu5mm3t2g.json b/apps/api/.xata/migrations/mig_cumlrvk27onfu5mm3t2g.json new file mode 100644 index 00000000..f78a9775 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cumlrvk27onfu5mm3t2g.json @@ -0,0 +1,22 @@ +{ + "done": true, + "migration": { + "name": "mig_cumlrvk27onfu5mm3t2g", + "operations": [ + { + "alter_column": { + "up": "(SELECT CASE WHEN \"access_token\" IS NULL THEN '' ELSE \"access_token\" END)", + "down": "(SELECT CASE WHEN \"access_token\" IS NULL THEN '' ELSE \"access_token\" END)", + "table": "spotify_tokens", + "column": "access_token", + "nullable": false + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cumlrvk27onfu5mm3t2g", + "parent": "mig_cumlrqpoos2v56d5q26g", + "schema": "public", + "startedAt": "2025-02-13T02:50:39.355194Z" +} diff --git a/apps/api/.xata/migrations/mig_cumls5427onfu5mm3t3g.json b/apps/api/.xata/migrations/mig_cumls5427onfu5mm3t3g.json new file mode 100644 index 00000000..8a8e041e --- /dev/null +++ b/apps/api/.xata/migrations/mig_cumls5427onfu5mm3t3g.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cumls5427onfu5mm3t3g", + "operations": [ + { + "add_column": { + "up": "''", + "table": "spotify_tokens", + "column": { + "name": "refresh_token", + "type": "text", + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cumls5427onfu5mm3t3g", + "parent": "mig_cumlrvk27onfu5mm3t2g", + "schema": "public", + "startedAt": "2025-02-13T02:51:00.639743Z" +} diff --git a/apps/api/.xata/migrations/mig_cumnjfs27onfu5mm3u8g.json b/apps/api/.xata/migrations/mig_cumnjfs27onfu5mm3u8g.json new file mode 100644 index 00000000..c4aec5f5 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cumnjfs27onfu5mm3u8g.json @@ -0,0 +1,31 @@ +{ + "done": true, + "migration": { + "name": "mig_cumnjfs27onfu5mm3u8g", + "operations": [ + { + "add_column": { + "up": "''", + "table": "spotify_tokens", + "column": { + "name": "user_id", + "type": "text", + "unique": true, + "comment": "{\"xata.link\":\"users\"}", + "references": { + "name": "user_id_link", + "table": "users", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cumnjfs27onfu5mm3u8g", + "parent": "mig_cumls5427onfu5mm3t3g", + "schema": "public", + "startedAt": "2025-02-13T04:49:04.430237Z" +} diff --git a/apps/api/.xata/migrations/mig_cumnmjk27onfu5mm3u9g.json b/apps/api/.xata/migrations/mig_cumnmjk27onfu5mm3u9g.json new file mode 100644 index 00000000..2b6cd370 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cumnmjk27onfu5mm3u9g.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cumnmjk27onfu5mm3u9g", + "operations": [ + { + "add_column": { + "up": "''", + "table": "spotify_tokens", + "column": { + "name": "iv", + "type": "text", + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cumnmjk27onfu5mm3u9g", + "parent": "mig_cumnjfs27onfu5mm3u8g", + "schema": "public", + "startedAt": "2025-02-13T04:55:43.571464Z" +} diff --git a/apps/api/.xata/migrations/mig_cumnoak27onfu5mm3uag.json b/apps/api/.xata/migrations/mig_cumnoak27onfu5mm3uag.json new file mode 100644 index 00000000..1c1c4705 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cumnoak27onfu5mm3uag.json @@ -0,0 +1,20 @@ +{ + "done": true, + "migration": { + "name": "mig_cumnoak27onfu5mm3uag", + "operations": [ + { + "drop_column": { + "down": "''", + "table": "spotify_tokens", + "column": "iv" + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cumnoak27onfu5mm3uag", + "parent": "mig_cumnmjk27onfu5mm3u9g", + "schema": "public", + "startedAt": "2025-02-13T04:59:23.071125Z" +} diff --git a/apps/api/.xata/migrations/mig_cump9c427onfu5mm3uqg.json b/apps/api/.xata/migrations/mig_cump9c427onfu5mm3uqg.json new file mode 100644 index 00000000..b9975ab3 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cump9c427onfu5mm3uqg.json @@ -0,0 +1,18 @@ +{ + "done": true, + "migration": { + "name": "mig_cump9c427onfu5mm3uqg", + "operations": [ + { + "drop_table": { + "name": "spotify_tokens" + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cump9c427onfu5mm3uqg", + "parent": "mig_cumnoak27onfu5mm3uag", + "schema": "public", + "startedAt": "2025-02-13T06:44:01.066562Z" +} diff --git a/apps/api/.xata/migrations/mig_cump9g9oos2v56d5q2u0.json b/apps/api/.xata/migrations/mig_cump9g9oos2v56d5q2u0.json new file mode 100644 index 00000000..fdbb1c41 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cump9g9oos2v56d5q2u0.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cump9g9oos2v56d5q2u0", + "operations": [ + { + "create_table": { + "name": "spotify_tokens", + "columns": [ + { + "name": "xata_id", + "type": "text", + "check": { + "name": "spotify_tokens_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + }, + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"spotify_tokens\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"spotify_tokens\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cump9g9oos2v56d5q2u0", + "parent": "mig_cump9c427onfu5mm3uqg", + "schema": "public", + "startedAt": "2025-02-13T06:44:18.276685Z" +} diff --git a/apps/api/.xata/migrations/mig_cump9rk27onfu5mm3urg.json b/apps/api/.xata/migrations/mig_cump9rk27onfu5mm3urg.json new file mode 100644 index 00000000..33926f13 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cump9rk27onfu5mm3urg.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cump9rk27onfu5mm3urg", + "operations": [ + { + "add_column": { + "up": "''", + "table": "spotify_tokens", + "column": { + "name": "user_id", + "type": "text", + "comment": "{\"xata.link\":\"users\"}", + "references": { + "name": "user_id_link", + "table": "users", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cump9rk27onfu5mm3urg", + "parent": "mig_cump9g9oos2v56d5q2u0", + "schema": "public", + "startedAt": "2025-02-13T06:45:02.791307Z" +} diff --git a/apps/api/.xata/migrations/mig_cump9vsq7gi7283oko90.json b/apps/api/.xata/migrations/mig_cump9vsq7gi7283oko90.json new file mode 100644 index 00000000..eb8d6a5f --- /dev/null +++ b/apps/api/.xata/migrations/mig_cump9vsq7gi7283oko90.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cump9vsq7gi7283oko90", + "operations": [ + { + "add_column": { + "up": "''", + "table": "spotify_tokens", + "column": { + "name": "access_token", + "type": "text", + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cump9vsq7gi7283oko90", + "parent": "mig_cump9rk27onfu5mm3urg", + "schema": "public", + "startedAt": "2025-02-13T06:45:20.016577Z" +} diff --git a/apps/api/.xata/migrations/mig_cumpa4kq7gi7283okoa0.json b/apps/api/.xata/migrations/mig_cumpa4kq7gi7283okoa0.json new file mode 100644 index 00000000..093ed9cf --- /dev/null +++ b/apps/api/.xata/migrations/mig_cumpa4kq7gi7283okoa0.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cumpa4kq7gi7283okoa0", + "operations": [ + { + "add_column": { + "up": "''", + "table": "spotify_tokens", + "column": { + "name": "refresh_token", + "type": "text", + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cumpa4kq7gi7283okoa0", + "parent": "mig_cump9vsq7gi7283oko90", + "schema": "public", + "startedAt": "2025-02-13T06:45:39.249533Z" +} diff --git a/apps/api/.xata/migrations/mig_cun3iis27onfu5mm41b0.json b/apps/api/.xata/migrations/mig_cun3iis27onfu5mm41b0.json new file mode 100644 index 00000000..ed06ad13 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cun3iis27onfu5mm41b0.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cun3iis27onfu5mm41b0", + "operations": [ + { + "create_table": { + "name": "spotify_accounts", + "columns": [ + { + "name": "xata_id", + "type": "text", + "check": { + "name": "spotify_accounts_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + }, + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"spotify_accounts\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"spotify_accounts\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cun3iis27onfu5mm41b0", + "parent": "mig_cumpa4kq7gi7283okoa0", + "schema": "public", + "startedAt": "2025-02-13T18:26:20.621934Z" +} diff --git a/apps/api/.xata/migrations/mig_cun3j8poos2v56d5q5d0.json b/apps/api/.xata/migrations/mig_cun3j8poos2v56d5q5d0.json new file mode 100644 index 00000000..90c54507 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cun3j8poos2v56d5q5d0.json @@ -0,0 +1,25 @@ +{ + "done": true, + "migration": { + "name": "mig_cun3j8poos2v56d5q5d0", + "operations": [ + { + "add_column": { + "up": "''", + "table": "spotify_accounts", + "column": { + "name": "email", + "type": "text", + "unique": true, + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cun3j8poos2v56d5q5d0", + "parent": "mig_cun3iis27onfu5mm41b0", + "schema": "public", + "startedAt": "2025-02-13T18:27:47.773649Z" +} diff --git a/apps/api/.xata/migrations/mig_cun3jqpoos2v56d5q5e0.json b/apps/api/.xata/migrations/mig_cun3jqpoos2v56d5q5e0.json new file mode 100644 index 00000000..5e6340c1 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cun3jqpoos2v56d5q5e0.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cun3jqpoos2v56d5q5e0", + "operations": [ + { + "add_column": { + "up": "''", + "table": "spotify_accounts", + "column": { + "name": "user_id", + "type": "text", + "comment": "{\"xata.link\":\"users\"}", + "references": { + "name": "user_id_link", + "table": "users", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cun3jqpoos2v56d5q5e0", + "parent": "mig_cun3j8poos2v56d5q5d0", + "schema": "public", + "startedAt": "2025-02-13T18:28:59.614215Z" +} diff --git a/apps/api/.xata/migrations/mig_cun3kgcq7gi7283okqo0.json b/apps/api/.xata/migrations/mig_cun3kgcq7gi7283okqo0.json new file mode 100644 index 00000000..aaa422c1 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cun3kgcq7gi7283okqo0.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cun3kgcq7gi7283okqo0", + "operations": [ + { + "add_column": { + "table": "spotify_accounts", + "column": { + "name": "is_beta_user", + "type": "bool", + "comment": "", + "default": "'false'" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cun3kgcq7gi7283okqo0", + "parent": "mig_cun3jqpoos2v56d5q5e0", + "schema": "public", + "startedAt": "2025-02-13T18:30:26.903658Z" +} diff --git a/apps/api/.xata/migrations/mig_cuo2s4dv5omnnkb7apog.json b/apps/api/.xata/migrations/mig_cuo2s4dv5omnnkb7apog.json new file mode 100644 index 00000000..51a3fd38 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuo2s4dv5omnnkb7apog.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cuo2s4dv5omnnkb7apog", + "operations": [ + { + "add_column": { + "table": "tracks", + "column": { + "name": "apple_music_link", + "type": "text", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuo2s4dv5omnnkb7apog", + "parent": "mig_cun3kgcq7gi7283okqo0", + "schema": "public", + "startedAt": "2025-02-15T06:02:58.761264Z" +} diff --git a/apps/api/.xata/migrations/mig_cuo2se1dsuem1m1rhsn0.json b/apps/api/.xata/migrations/mig_cuo2se1dsuem1m1rhsn0.json new file mode 100644 index 00000000..2b3f22e4 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuo2se1dsuem1m1rhsn0.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cuo2se1dsuem1m1rhsn0", + "operations": [ + { + "add_column": { + "table": "albums", + "column": { + "name": "apple_music_link", + "type": "text", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuo2se1dsuem1m1rhsn0", + "parent": "mig_cuo2s4dv5omnnkb7apog", + "schema": "public", + "startedAt": "2025-02-15T06:03:37.145949Z" +} diff --git a/apps/api/.xata/migrations/mig_cuo2simfvuvgoi6as0g0.json b/apps/api/.xata/migrations/mig_cuo2simfvuvgoi6as0g0.json new file mode 100644 index 00000000..21c0db35 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuo2simfvuvgoi6as0g0.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cuo2simfvuvgoi6as0g0", + "operations": [ + { + "add_column": { + "table": "artists", + "column": { + "name": "apple_music_link", + "type": "text", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuo2simfvuvgoi6as0g0", + "parent": "mig_cuo2se1dsuem1m1rhsn0", + "schema": "public", + "startedAt": "2025-02-15T06:03:55.379945Z" +} diff --git a/apps/api/.xata/migrations/mig_cuo2smpdsuem1m1rhso0.json b/apps/api/.xata/migrations/mig_cuo2smpdsuem1m1rhso0.json new file mode 100644 index 00000000..01754a8e --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuo2smpdsuem1m1rhso0.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cuo2smpdsuem1m1rhso0", + "operations": [ + { + "add_column": { + "table": "artists", + "column": { + "name": "spotify_link", + "type": "text", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuo2smpdsuem1m1rhso0", + "parent": "mig_cuo2simfvuvgoi6as0g0", + "schema": "public", + "startedAt": "2025-02-15T06:04:11.630689Z" +} diff --git a/apps/api/.xata/migrations/mig_cuo2sr1dsuem1m1rhsp0.json b/apps/api/.xata/migrations/mig_cuo2sr1dsuem1m1rhsp0.json new file mode 100644 index 00000000..1faaa895 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuo2sr1dsuem1m1rhsp0.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cuo2sr1dsuem1m1rhsp0", + "operations": [ + { + "add_column": { + "table": "artists", + "column": { + "name": "tidal_link", + "type": "text", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuo2sr1dsuem1m1rhsp0", + "parent": "mig_cuo2smpdsuem1m1rhso0", + "schema": "public", + "startedAt": "2025-02-15T06:04:28.851886Z" +} diff --git a/apps/api/.xata/migrations/mig_cuo2t3tv5omnnkb7apqg.json b/apps/api/.xata/migrations/mig_cuo2t3tv5omnnkb7apqg.json new file mode 100644 index 00000000..fa6af23b --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuo2t3tv5omnnkb7apqg.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cuo2t3tv5omnnkb7apqg", + "operations": [ + { + "add_column": { + "table": "artists", + "column": { + "name": "youtube_link", + "type": "text", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuo2t3tv5omnnkb7apqg", + "parent": "mig_cuo2sr1dsuem1m1rhsp0", + "schema": "public", + "startedAt": "2025-02-15T06:05:04.272435Z" +} diff --git a/apps/api/.xata/migrations/mig_cuo3h4ufvuvgoi6as0k0.json b/apps/api/.xata/migrations/mig_cuo3h4ufvuvgoi6as0k0.json new file mode 100644 index 00000000..96a6685b --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuo3h4ufvuvgoi6as0k0.json @@ -0,0 +1,20 @@ +{ + "done": true, + "migration": { + "name": "mig_cuo3h4ufvuvgoi6as0k0", + "operations": [ + { + "alter_column": { + "name": "author_id", + "table": "shouts", + "column": "user_id" + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuo3h4ufvuvgoi6as0k0", + "parent": "mig_cuo2t3tv5omnnkb7apqg", + "schema": "public", + "startedAt": "2025-02-15T06:47:48.142052Z" +} diff --git a/apps/api/.xata/migrations/mig_cuo3hplv5omnnkb7aq2g.json b/apps/api/.xata/migrations/mig_cuo3hplv5omnnkb7aq2g.json new file mode 100644 index 00000000..ad24dc4a --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuo3hplv5omnnkb7aq2g.json @@ -0,0 +1,22 @@ +{ + "done": true, + "migration": { + "name": "mig_cuo3hplv5omnnkb7aq2g", + "operations": [ + { + "alter_column": { + "up": "\"track_id\"", + "down": "\"track_id\"", + "table": "shouts", + "column": "track_id", + "nullable": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuo3hplv5omnnkb7aq2g", + "parent": "mig_cuo3h4ufvuvgoi6as0k0", + "schema": "public", + "startedAt": "2025-02-15T06:49:11.045066Z" +} diff --git a/apps/api/.xata/migrations/mig_cuo3i75v5omnnkb7aq3g.json b/apps/api/.xata/migrations/mig_cuo3i75v5omnnkb7aq3g.json new file mode 100644 index 00000000..b4a1ee0c --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuo3i75v5omnnkb7aq3g.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cuo3i75v5omnnkb7aq3g", + "operations": [ + { + "add_column": { + "table": "shouts", + "column": { + "name": "album_id", + "type": "text", + "comment": "{\"xata.link\":\"albums\"}", + "nullable": true, + "references": { + "name": "album_id_link", + "table": "albums", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuo3i75v5omnnkb7aq3g", + "parent": "mig_cuo3hplv5omnnkb7aq2g", + "schema": "public", + "startedAt": "2025-02-15T06:50:04.640395Z" +} diff --git a/apps/api/.xata/migrations/mig_cuo3j4hdsuem1m1rhsu0.json b/apps/api/.xata/migrations/mig_cuo3j4hdsuem1m1rhsu0.json new file mode 100644 index 00000000..9d15559b --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuo3j4hdsuem1m1rhsu0.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cuo3j4hdsuem1m1rhsu0", + "operations": [ + { + "add_column": { + "table": "shouts", + "column": { + "name": "parent_id", + "type": "text", + "comment": "{\"xata.link\":\"shouts\"}", + "nullable": true, + "references": { + "name": "parent_id_link", + "table": "shouts", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuo3j4hdsuem1m1rhsu0", + "parent": "mig_cuo3i75v5omnnkb7aq3g", + "schema": "public", + "startedAt": "2025-02-15T06:52:03.02162Z" +} diff --git a/apps/api/.xata/migrations/mig_cuo3jeufvuvgoi6as0ng.json b/apps/api/.xata/migrations/mig_cuo3jeufvuvgoi6as0ng.json new file mode 100644 index 00000000..3a25f363 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuo3jeufvuvgoi6as0ng.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cuo3jeufvuvgoi6as0ng", + "operations": [ + { + "create_table": { + "name": "profile_shouts", + "columns": [ + { + "name": "xata_id", + "type": "text", + "check": { + "name": "profile_shouts_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + }, + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"profile_shouts\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"profile_shouts\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuo3jeufvuvgoi6as0ng", + "parent": "mig_cuo3j4hdsuem1m1rhsu0", + "schema": "public", + "startedAt": "2025-02-15T06:52:43.424184Z" +} diff --git a/apps/api/.xata/migrations/mig_cuo3k89dsuem1m1rhsv0.json b/apps/api/.xata/migrations/mig_cuo3k89dsuem1m1rhsv0.json new file mode 100644 index 00000000..40191532 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuo3k89dsuem1m1rhsv0.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cuo3k89dsuem1m1rhsv0", + "operations": [ + { + "add_column": { + "table": "profile_shouts", + "column": { + "name": "shout_id", + "type": "text", + "comment": "{\"xata.link\":\"shouts\"}", + "nullable": true, + "references": { + "name": "shout_id_link", + "table": "shouts", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuo3k89dsuem1m1rhsv0", + "parent": "mig_cuo3jeufvuvgoi6as0ng", + "schema": "public", + "startedAt": "2025-02-15T06:54:26.703193Z" +} diff --git a/apps/api/.xata/migrations/mig_cuo3kpmfvuvgoi6as0og.json b/apps/api/.xata/migrations/mig_cuo3kpmfvuvgoi6as0og.json new file mode 100644 index 00000000..6cdb2900 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuo3kpmfvuvgoi6as0og.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cuo3kpmfvuvgoi6as0og", + "operations": [ + { + "add_column": { + "up": "''", + "table": "profile_shouts", + "column": { + "name": "user_id", + "type": "text", + "comment": "{\"xata.link\":\"users\"}", + "references": { + "name": "user_id_link", + "table": "users", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuo3kpmfvuvgoi6as0og", + "parent": "mig_cuo3k89dsuem1m1rhsv0", + "schema": "public", + "startedAt": "2025-02-15T06:55:35.429558Z" +} diff --git a/apps/api/.xata/migrations/mig_cuo3l0mfvuvgoi6as0pg.json b/apps/api/.xata/migrations/mig_cuo3l0mfvuvgoi6as0pg.json new file mode 100644 index 00000000..90cf7c4e --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuo3l0mfvuvgoi6as0pg.json @@ -0,0 +1,22 @@ +{ + "done": true, + "migration": { + "name": "mig_cuo3l0mfvuvgoi6as0pg", + "operations": [ + { + "alter_column": { + "up": "(SELECT CASE WHEN \"shout_id\" IS NULL THEN '' ELSE \"shout_id\" END)", + "down": "(SELECT CASE WHEN \"shout_id\" IS NULL THEN '' ELSE \"shout_id\" END)", + "table": "profile_shouts", + "column": "shout_id", + "nullable": false + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuo3l0mfvuvgoi6as0pg", + "parent": "mig_cuo3kpmfvuvgoi6as0og", + "schema": "public", + "startedAt": "2025-02-15T06:56:02.842286Z" +} diff --git a/apps/api/.xata/migrations/mig_cuochjufvuvgoi6as2cg.json b/apps/api/.xata/migrations/mig_cuochjufvuvgoi6as2cg.json new file mode 100644 index 00000000..64e71ade --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuochjufvuvgoi6as2cg.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cuochjufvuvgoi6as2cg", + "operations": [ + { + "create_table": { + "name": "shout_likes", + "columns": [ + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_id", + "type": "text", + "check": { + "name": "shout_likes_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"shout_likes\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"shout_likes\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuochjufvuvgoi6as2cg", + "parent": "mig_cuo3l0mfvuvgoi6as0pg", + "schema": "public", + "startedAt": "2025-02-15T17:03:12.00718Z" +} diff --git a/apps/api/.xata/migrations/mig_cuocifhdsuem1m1rhusg.json b/apps/api/.xata/migrations/mig_cuocifhdsuem1m1rhusg.json new file mode 100644 index 00000000..4f0f48ba --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuocifhdsuem1m1rhusg.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cuocifhdsuem1m1rhusg", + "operations": [ + { + "add_column": { + "up": "''", + "table": "shout_likes", + "column": { + "name": "user_id", + "type": "text", + "comment": "{\"xata.link\":\"users\"}", + "references": { + "name": "user_id_link", + "table": "users", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuocifhdsuem1m1rhusg", + "parent": "mig_cuochjufvuvgoi6as2cg", + "schema": "public", + "startedAt": "2025-02-15T17:05:02.497302Z" +} diff --git a/apps/api/.xata/migrations/mig_cuocio1dsuem1m1rhutg.json b/apps/api/.xata/migrations/mig_cuocio1dsuem1m1rhutg.json new file mode 100644 index 00000000..591e8483 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuocio1dsuem1m1rhutg.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cuocio1dsuem1m1rhutg", + "operations": [ + { + "add_column": { + "up": "''", + "table": "shout_likes", + "column": { + "name": "shout_id", + "type": "text", + "comment": "{\"xata.link\":\"shouts\"}", + "references": { + "name": "shout_id_link", + "table": "shouts", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuocio1dsuem1m1rhutg", + "parent": "mig_cuocifhdsuem1m1rhusg", + "schema": "public", + "startedAt": "2025-02-15T17:05:36.734675Z" +} diff --git a/apps/api/.xata/migrations/mig_cuon75lv5omnnkb7av4g.json b/apps/api/.xata/migrations/mig_cuon75lv5omnnkb7av4g.json new file mode 100644 index 00000000..a087049c --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuon75lv5omnnkb7av4g.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cuon75lv5omnnkb7av4g", + "operations": [ + { + "add_column": { + "table": "shouts", + "column": { + "name": "artist_id", + "type": "text", + "comment": "{\"xata.link\":\"artists\"}", + "nullable": true, + "references": { + "name": "artist_id_link", + "table": "artists", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuon75lv5omnnkb7av4g", + "parent": "mig_cuocio1dsuem1m1rhutg", + "schema": "public", + "startedAt": "2025-02-16T05:11:50.632602Z" +} diff --git a/apps/api/.xata/migrations/mig_cuood4lv5omnnkb7avhg.json b/apps/api/.xata/migrations/mig_cuood4lv5omnnkb7avhg.json new file mode 100644 index 00000000..dbbe4ae9 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuood4lv5omnnkb7avhg.json @@ -0,0 +1,25 @@ +{ + "done": true, + "migration": { + "name": "mig_cuood4lv5omnnkb7avhg", + "operations": [ + { + "add_column": { + "up": "''", + "table": "shout_likes", + "column": { + "name": "uri", + "type": "text", + "unique": true, + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuood4lv5omnnkb7avhg", + "parent": "mig_cuon75lv5omnnkb7av4g", + "schema": "public", + "startedAt": "2025-02-16T06:32:51.748322Z" +} diff --git a/apps/api/.xata/migrations/mig_cup41k5v5omnnkb7b2s0.json b/apps/api/.xata/migrations/mig_cup41k5v5omnnkb7b2s0.json new file mode 100644 index 00000000..6b6fe2c5 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cup41k5v5omnnkb7b2s0.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cup41k5v5omnnkb7b2s0", + "operations": [ + { + "add_column": { + "table": "shouts", + "column": { + "name": "scrobble_id", + "type": "text", + "comment": "{\"xata.link\":\"scrobbles\"}", + "nullable": true, + "references": { + "name": "scrobble_id_link", + "table": "scrobbles", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cup41k5v5omnnkb7b2s0", + "parent": "mig_cuood4lv5omnnkb7avhg", + "schema": "public", + "startedAt": "2025-02-16T19:47:29.529601Z" +} diff --git a/apps/api/.xata/migrations/mig_cuq27fufvuvgoi6asfog.json b/apps/api/.xata/migrations/mig_cuq27fufvuvgoi6asfog.json new file mode 100644 index 00000000..3b6d314d --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuq27fufvuvgoi6asfog.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cuq27fufvuvgoi6asfog", + "operations": [ + { + "create_table": { + "name": "shout_reports", + "columns": [ + { + "name": "xata_id", + "type": "text", + "check": { + "name": "shout_reports_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + }, + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"shout_reports\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"shout_reports\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuq27fufvuvgoi6asfog", + "parent": "mig_cup41k5v5omnnkb7b2s0", + "schema": "public", + "startedAt": "2025-02-18T06:08:00.464342Z" +} diff --git a/apps/api/.xata/migrations/mig_cuq2866fvuvgoi6asfpg.json b/apps/api/.xata/migrations/mig_cuq2866fvuvgoi6asfpg.json new file mode 100644 index 00000000..fe4974e2 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuq2866fvuvgoi6asfpg.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cuq2866fvuvgoi6asfpg", + "operations": [ + { + "add_column": { + "up": "''", + "table": "shout_reports", + "column": { + "name": "user_id", + "type": "text", + "comment": "{\"xata.link\":\"users\"}", + "references": { + "name": "user_id_link", + "table": "users", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuq2866fvuvgoi6asfpg", + "parent": "mig_cuq27fufvuvgoi6asfog", + "schema": "public", + "startedAt": "2025-02-18T06:09:28.408632Z" +} diff --git a/apps/api/.xata/migrations/mig_cuq28kefvuvgoi6asfqg.json b/apps/api/.xata/migrations/mig_cuq28kefvuvgoi6asfqg.json new file mode 100644 index 00000000..25d8aa95 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuq28kefvuvgoi6asfqg.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cuq28kefvuvgoi6asfqg", + "operations": [ + { + "add_column": { + "up": "''", + "table": "shout_reports", + "column": { + "name": "shout_id", + "type": "text", + "comment": "{\"xata.link\":\"shouts\"}", + "references": { + "name": "shout_id_link", + "table": "shouts", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuq28kefvuvgoi6asfqg", + "parent": "mig_cuq2866fvuvgoi6asfpg", + "schema": "public", + "startedAt": "2025-02-18T06:10:26.069337Z" +} diff --git a/apps/api/.xata/migrations/mig_cusvclmfvuvgoi6atb2g.json b/apps/api/.xata/migrations/mig_cusvclmfvuvgoi6atb2g.json new file mode 100644 index 00000000..ba591d68 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cusvclmfvuvgoi6atb2g.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cusvclmfvuvgoi6atb2g", + "operations": [ + { + "add_column": { + "table": "tracks", + "column": { + "name": "label", + "type": "text", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cusvclmfvuvgoi6atb2g", + "parent": "mig_cuq28kefvuvgoi6asfqg", + "schema": "public", + "startedAt": "2025-02-22T16:07:51.020874Z" +} diff --git a/apps/api/.xata/migrations/mig_cuvv6k1dsuem1m1rk3l0.json b/apps/api/.xata/migrations/mig_cuvv6k1dsuem1m1rk3l0.json new file mode 100644 index 00000000..a81ac569 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuvv6k1dsuem1m1rk3l0.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cuvv6k1dsuem1m1rk3l0", + "operations": [ + { + "add_column": { + "up": "''", + "table": "playlists", + "column": { + "name": "created_by", + "type": "text", + "comment": "{\"xata.link\":\"users\"}", + "references": { + "name": "created_by_link", + "table": "users", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuvv6k1dsuem1m1rk3l0", + "parent": "mig_cusvclmfvuvgoi6atb2g", + "schema": "public", + "startedAt": "2025-02-27T05:08:32.597847Z" +} diff --git a/apps/api/.xata/migrations/mig_cuvvadtv5omnnkb7cs40.json b/apps/api/.xata/migrations/mig_cuvvadtv5omnnkb7cs40.json new file mode 100644 index 00000000..91a7979f --- /dev/null +++ b/apps/api/.xata/migrations/mig_cuvvadtv5omnnkb7cs40.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cuvvadtv5omnnkb7cs40", + "operations": [ + { + "add_column": { + "table": "playlists", + "column": { + "name": "picture", + "type": "text", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cuvvadtv5omnnkb7cs40", + "parent": "mig_cuvv6k1dsuem1m1rk3l0", + "schema": "public", + "startedAt": "2025-02-27T05:16:39.402596Z" +} diff --git a/apps/api/.xata/migrations/mig_cv3tgjqtb4rhvnj37il0.json b/apps/api/.xata/migrations/mig_cv3tgjqtb4rhvnj37il0.json new file mode 100644 index 00000000..47ee2360 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv3tgjqtb4rhvnj37il0.json @@ -0,0 +1,25 @@ +{ + "done": true, + "migration": { + "name": "mig_cv3tgjqtb4rhvnj37il0", + "operations": [ + { + "add_column": { + "table": "playlists", + "column": { + "name": "spotify_link", + "type": "text", + "unique": true, + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv3tgjqtb4rhvnj37il0", + "parent": "mig_cuvvadtv5omnnkb7cs40", + "schema": "public", + "startedAt": "2025-03-05T04:51:28.013325Z" +} diff --git a/apps/api/.xata/migrations/mig_cv3tib2tb4rhvnj37io0.json b/apps/api/.xata/migrations/mig_cv3tib2tb4rhvnj37io0.json new file mode 100644 index 00000000..0fcdb31f --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv3tib2tb4rhvnj37io0.json @@ -0,0 +1,21 @@ +{ + "done": true, + "migration": { + "name": "mig_cv3tib2tb4rhvnj37io0", + "operations": [ + { + "drop_constraint": { + "up": "\"spotify_link\"", + "down": "\"spotify_link\"", + "name": "playlists__pgroll_new_spotify_link_key", + "table": "playlists" + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv3tib2tb4rhvnj37io0", + "parent": "mig_cv3tgjqtb4rhvnj37il0", + "schema": "public", + "startedAt": "2025-03-05T04:55:09.2563Z" +} diff --git a/apps/api/.xata/migrations/mig_cv3tipd2t0po8jv9t7u0.json b/apps/api/.xata/migrations/mig_cv3tipd2t0po8jv9t7u0.json new file mode 100644 index 00000000..9f742ec6 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv3tipd2t0po8jv9t7u0.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cv3tipd2t0po8jv9t7u0", + "operations": [ + { + "add_column": { + "table": "playlists", + "column": { + "name": "tidal_link", + "type": "text", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv3tipd2t0po8jv9t7u0", + "parent": "mig_cv3tib2tb4rhvnj37io0", + "schema": "public", + "startedAt": "2025-03-05T04:56:06.432882Z" +} diff --git a/apps/api/.xata/migrations/mig_cv3tj3itb4rhvnj37ip0.json b/apps/api/.xata/migrations/mig_cv3tj3itb4rhvnj37ip0.json new file mode 100644 index 00000000..a3ff0116 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv3tj3itb4rhvnj37ip0.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cv3tj3itb4rhvnj37ip0", + "operations": [ + { + "add_column": { + "table": "playlists", + "column": { + "name": "apple_music_link", + "type": "text", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv3tj3itb4rhvnj37ip0", + "parent": "mig_cv3tipd2t0po8jv9t7u0", + "schema": "public", + "startedAt": "2025-03-05T04:56:47.661823Z" +} diff --git a/apps/api/.xata/migrations/mig_cv55loqtb4rhvnj37rng.json b/apps/api/.xata/migrations/mig_cv55loqtb4rhvnj37rng.json new file mode 100644 index 00000000..c550785b --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv55loqtb4rhvnj37rng.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cv55loqtb4rhvnj37rng", + "operations": [ + { + "alter_column": { + "up": "\"spotify_link\"", + "down": "\"spotify_link\"", + "table": "playlists", + "column": "spotify_link", + "unique": { + "name": "playlists_spotify_link_unique" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv55loqtb4rhvnj37rng", + "parent": "mig_cv3tj3itb4rhvnj37ip0", + "schema": "public", + "startedAt": "2025-03-07T02:33:08.663091Z" +} diff --git a/apps/api/.xata/migrations/mig_cv55m5o66mqp0v06gpbg.json b/apps/api/.xata/migrations/mig_cv55m5o66mqp0v06gpbg.json new file mode 100644 index 00000000..3943fbab --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv55m5o66mqp0v06gpbg.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cv55m5o66mqp0v06gpbg", + "operations": [ + { + "alter_column": { + "up": "\"tidal_link\"", + "down": "\"tidal_link\"", + "table": "playlists", + "column": "tidal_link", + "unique": { + "name": "playlists_tidal_link_unique" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv55m5o66mqp0v06gpbg", + "parent": "mig_cv55loqtb4rhvnj37rng", + "schema": "public", + "startedAt": "2025-03-07T02:34:00.176168Z" +} diff --git a/apps/api/.xata/migrations/mig_cv55mat2t0po8jv9tkgg.json b/apps/api/.xata/migrations/mig_cv55mat2t0po8jv9tkgg.json new file mode 100644 index 00000000..dbca5317 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv55mat2t0po8jv9tkgg.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cv55mat2t0po8jv9tkgg", + "operations": [ + { + "alter_column": { + "up": "\"apple_music_link\"", + "down": "\"apple_music_link\"", + "table": "playlists", + "column": "apple_music_link", + "unique": { + "name": "playlists_apple_music_link_unique" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv55mat2t0po8jv9tkgg", + "parent": "mig_cv55m5o66mqp0v06gpbg", + "schema": "public", + "startedAt": "2025-03-07T02:34:19.996787Z" +} diff --git a/apps/api/.xata/migrations/mig_cv55mi066mqp0v06gpcg.json b/apps/api/.xata/migrations/mig_cv55mi066mqp0v06gpcg.json new file mode 100644 index 00000000..5e75967d --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv55mi066mqp0v06gpcg.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cv55mi066mqp0v06gpcg", + "operations": [ + { + "alter_column": { + "up": "\"spotify_link\"", + "down": "\"spotify_link\"", + "table": "albums", + "column": "spotify_link", + "unique": { + "name": "albums_spotify_link_unique" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv55mi066mqp0v06gpcg", + "parent": "mig_cv55mat2t0po8jv9tkgg", + "schema": "public", + "startedAt": "2025-03-07T02:34:49.528087Z" +} diff --git a/apps/api/.xata/migrations/mig_cv55mql2t0po8jv9tkhg.json b/apps/api/.xata/migrations/mig_cv55mql2t0po8jv9tkhg.json new file mode 100644 index 00000000..3f0981e7 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv55mql2t0po8jv9tkhg.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cv55mql2t0po8jv9tkhg", + "operations": [ + { + "alter_column": { + "up": "\"apple_music_link\"", + "down": "\"apple_music_link\"", + "table": "albums", + "column": "apple_music_link", + "unique": { + "name": "albums_apple_music_link_unique" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv55mql2t0po8jv9tkhg", + "parent": "mig_cv55mi066mqp0v06gpcg", + "schema": "public", + "startedAt": "2025-03-07T02:35:23.576723Z" +} diff --git a/apps/api/.xata/migrations/mig_cv55n3066mqp0v06gpeg.json b/apps/api/.xata/migrations/mig_cv55n3066mqp0v06gpeg.json new file mode 100644 index 00000000..4d55b724 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv55n3066mqp0v06gpeg.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cv55n3066mqp0v06gpeg", + "operations": [ + { + "alter_column": { + "up": "\"spotify_link\"", + "down": "\"spotify_link\"", + "table": "artists", + "column": "spotify_link", + "unique": { + "name": "artists_spotify_link_unique" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv55n3066mqp0v06gpeg", + "parent": "mig_cv55mql2t0po8jv9tkhg", + "schema": "public", + "startedAt": "2025-03-07T02:35:56.764132Z" +} diff --git a/apps/api/.xata/migrations/mig_cv55n7d2t0po8jv9tkig.json b/apps/api/.xata/migrations/mig_cv55n7d2t0po8jv9tkig.json new file mode 100644 index 00000000..9ae56071 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv55n7d2t0po8jv9tkig.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cv55n7d2t0po8jv9tkig", + "operations": [ + { + "alter_column": { + "up": "\"tidal_link\"", + "down": "\"tidal_link\"", + "table": "artists", + "column": "tidal_link", + "unique": { + "name": "artists_tidal_link_unique" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv55n7d2t0po8jv9tkig", + "parent": "mig_cv55n3066mqp0v06gpeg", + "schema": "public", + "startedAt": "2025-03-07T02:36:13.866904Z" +} diff --git a/apps/api/.xata/migrations/mig_cv55nf52t0po8jv9tkjg.json b/apps/api/.xata/migrations/mig_cv55nf52t0po8jv9tkjg.json new file mode 100644 index 00000000..0818998a --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv55nf52t0po8jv9tkjg.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cv55nf52t0po8jv9tkjg", + "operations": [ + { + "alter_column": { + "up": "\"youtube_link\"", + "down": "\"youtube_link\"", + "table": "artists", + "column": "youtube_link", + "unique": { + "name": "artists_youtube_link_unique" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv55nf52t0po8jv9tkjg", + "parent": "mig_cv55n7d2t0po8jv9tkig", + "schema": "public", + "startedAt": "2025-03-07T02:36:44.990769Z" +} diff --git a/apps/api/.xata/migrations/mig_cv55njg66mqp0v06gpfg.json b/apps/api/.xata/migrations/mig_cv55njg66mqp0v06gpfg.json new file mode 100644 index 00000000..47f0b430 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv55njg66mqp0v06gpfg.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cv55njg66mqp0v06gpfg", + "operations": [ + { + "alter_column": { + "up": "\"apple_music_link\"", + "down": "\"apple_music_link\"", + "table": "artists", + "column": "apple_music_link", + "unique": { + "name": "artists_apple_music_link_unique" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv55njg66mqp0v06gpfg", + "parent": "mig_cv55nf52t0po8jv9tkjg", + "schema": "public", + "startedAt": "2025-03-07T02:37:03.149101Z" +} diff --git a/apps/api/.xata/migrations/mig_cv55nu2tb4rhvnj37rog.json b/apps/api/.xata/migrations/mig_cv55nu2tb4rhvnj37rog.json new file mode 100644 index 00000000..9a89a05d --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv55nu2tb4rhvnj37rog.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cv55nu2tb4rhvnj37rog", + "operations": [ + { + "alter_column": { + "up": "\"spotify_link\"", + "down": "\"spotify_link\"", + "table": "tracks", + "column": "spotify_link", + "unique": { + "name": "tracks_spotify_link_unique" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv55nu2tb4rhvnj37rog", + "parent": "mig_cv55njg66mqp0v06gpfg", + "schema": "public", + "startedAt": "2025-03-07T02:37:44.390222Z" +} diff --git a/apps/api/.xata/migrations/mig_cv55o3d2t0po8jv9tkkg.json b/apps/api/.xata/migrations/mig_cv55o3d2t0po8jv9tkkg.json new file mode 100644 index 00000000..2246bbc0 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv55o3d2t0po8jv9tkkg.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cv55o3d2t0po8jv9tkkg", + "operations": [ + { + "alter_column": { + "up": "\"tidal_link\"", + "down": "\"tidal_link\"", + "table": "tracks", + "column": "tidal_link", + "unique": { + "name": "tracks_tidal_link_unique" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv55o3d2t0po8jv9tkkg", + "parent": "mig_cv55nu2tb4rhvnj37rog", + "schema": "public", + "startedAt": "2025-03-07T02:38:06.483745Z" +} diff --git a/apps/api/.xata/migrations/mig_cv55o952t0po8jv9tklg.json b/apps/api/.xata/migrations/mig_cv55o952t0po8jv9tklg.json new file mode 100644 index 00000000..76b422d0 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv55o952t0po8jv9tklg.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cv55o952t0po8jv9tklg", + "operations": [ + { + "alter_column": { + "up": "\"youtube_link\"", + "down": "\"youtube_link\"", + "table": "tracks", + "column": "youtube_link", + "unique": { + "name": "tracks_youtube_link_unique" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv55o952t0po8jv9tklg", + "parent": "mig_cv55o3d2t0po8jv9tkkg", + "schema": "public", + "startedAt": "2025-03-07T02:38:28.708265Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8tro2glbhgau6cq5j0.json b/apps/api/.xata/migrations/mig_cv8tro2glbhgau6cq5j0.json new file mode 100644 index 00000000..84aca390 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8tro2glbhgau6cq5j0.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8tro2glbhgau6cq5j0", + "operations": [ + { + "create_table": { + "name": "dropbox", + "columns": [ + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_id", + "type": "text", + "check": { + "name": "dropbox_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"dropbox\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"dropbox\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8tro2glbhgau6cq5j0", + "parent": "sql_7fbe41bfacc536", + "schema": "public", + "startedAt": "2025-03-12T19:17:53.182563Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8ts6o1g95li4qghh5g.json b/apps/api/.xata/migrations/mig_cv8ts6o1g95li4qghh5g.json new file mode 100644 index 00000000..ffaa026c --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8ts6o1g95li4qghh5g.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8ts6o1g95li4qghh5g", + "operations": [ + { + "create_table": { + "name": "google_drive", + "columns": [ + { + "name": "xata_id", + "type": "text", + "check": { + "name": "google_drive_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + }, + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"google_drive\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"google_drive\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8ts6o1g95li4qghh5g", + "parent": "mig_cv8tro2glbhgau6cq5j0", + "schema": "public", + "startedAt": "2025-03-12T19:18:52.959323Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8tsfkld6k2hsabcgqg.json b/apps/api/.xata/migrations/mig_cv8tsfkld6k2hsabcgqg.json new file mode 100644 index 00000000..bacbf043 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8tsfkld6k2hsabcgqg.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8tsfkld6k2hsabcgqg", + "operations": [ + { + "create_table": { + "name": "s3", + "columns": [ + { + "name": "xata_version", + "type": "integer", + "default": "0" + }, + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_id", + "type": "text", + "check": { + "name": "s3_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"s3\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"s3\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8tsfkld6k2hsabcgqg", + "parent": "mig_cv8ts6o1g95li4qghh5g", + "schema": "public", + "startedAt": "2025-03-12T19:19:27.411041Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8tt0g1g95li4qghh6g.json b/apps/api/.xata/migrations/mig_cv8tt0g1g95li4qghh6g.json new file mode 100644 index 00000000..a241ed26 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8tt0g1g95li4qghh6g.json @@ -0,0 +1,19 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8tt0g1g95li4qghh6g", + "operations": [ + { + "rename_table": { + "to": "s3_bucket", + "from": "s3" + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8tt0g1g95li4qghh6g", + "parent": "mig_cv8tsfkld6k2hsabcgqg", + "schema": "public", + "startedAt": "2025-03-12T19:20:35.26839Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8ttl4ld6k2hsabcgsg.json b/apps/api/.xata/migrations/mig_cv8ttl4ld6k2hsabcgsg.json new file mode 100644 index 00000000..ae639af8 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8ttl4ld6k2hsabcgsg.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8ttl4ld6k2hsabcgsg", + "operations": [ + { + "create_table": { + "name": "gcs_bucket", + "columns": [ + { + "name": "xata_id", + "type": "text", + "check": { + "name": "gcs_bucket_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + }, + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"gcs_bucket\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"gcs_bucket\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8ttl4ld6k2hsabcgsg", + "parent": "mig_cv8tt0g1g95li4qghh6g", + "schema": "public", + "startedAt": "2025-03-12T19:21:56.287049Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8tu7sld6k2hsabcgtg.json b/apps/api/.xata/migrations/mig_cv8tu7sld6k2hsabcgtg.json new file mode 100644 index 00000000..78b10e92 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8tu7sld6k2hsabcgtg.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8tu7sld6k2hsabcgtg", + "operations": [ + { + "create_table": { + "name": "google_drive_tokens", + "columns": [ + { + "name": "xata_id", + "type": "text", + "check": { + "name": "google_drive_tokens_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + }, + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"google_drive_tokens\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"google_drive_tokens\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8tu7sld6k2hsabcgtg", + "parent": "mig_cv8ttl4ld6k2hsabcgsg", + "schema": "public", + "startedAt": "2025-03-12T19:23:12.701215Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8tufsld6k2hsabcgug.json b/apps/api/.xata/migrations/mig_cv8tufsld6k2hsabcgug.json new file mode 100644 index 00000000..86a51449 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8tufsld6k2hsabcgug.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8tufsld6k2hsabcgug", + "operations": [ + { + "create_table": { + "name": "s3_tokens", + "columns": [ + { + "name": "xata_id", + "type": "text", + "check": { + "name": "s3_tokens_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + }, + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"s3_tokens\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"s3_tokens\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8tufsld6k2hsabcgug", + "parent": "mig_cv8tu7sld6k2hsabcgtg", + "schema": "public", + "startedAt": "2025-03-12T19:23:44.838476Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8tutiglbhgau6cq5n0.json b/apps/api/.xata/migrations/mig_cv8tutiglbhgau6cq5n0.json new file mode 100644 index 00000000..3eed10b8 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8tutiglbhgau6cq5n0.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8tutiglbhgau6cq5n0", + "operations": [ + { + "create_table": { + "name": "dropbox_tokens", + "columns": [ + { + "name": "xata_id", + "type": "text", + "check": { + "name": "dropbox_tokens_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + }, + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"dropbox_tokens\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"dropbox_tokens\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8tutiglbhgau6cq5n0", + "parent": "mig_cv8tufsld6k2hsabcgug", + "schema": "public", + "startedAt": "2025-03-12T19:24:39.515532Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8tv8iglbhgau6cq5p0.json b/apps/api/.xata/migrations/mig_cv8tv8iglbhgau6cq5p0.json new file mode 100644 index 00000000..c1db6342 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8tv8iglbhgau6cq5p0.json @@ -0,0 +1,18 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8tv8iglbhgau6cq5p0", + "operations": [ + { + "drop_table": { + "name": "gcs_bucket" + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8tv8iglbhgau6cq5p0", + "parent": "mig_cv8tutiglbhgau6cq5n0", + "schema": "public", + "startedAt": "2025-03-12T19:25:23.135657Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8u07aglbhgau6cq5q0.json b/apps/api/.xata/migrations/mig_cv8u07aglbhgau6cq5q0.json new file mode 100644 index 00000000..793fe00b --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8u07aglbhgau6cq5q0.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8u07aglbhgau6cq5q0", + "operations": [ + { + "create_table": { + "name": "dropbox_paths", + "columns": [ + { + "name": "xata_id", + "type": "text", + "check": { + "name": "dropbox_paths_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + }, + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"dropbox_paths\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"dropbox_paths\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8u07aglbhgau6cq5q0", + "parent": "mig_cv8tv8iglbhgau6cq5p0", + "schema": "public", + "startedAt": "2025-03-12T19:27:25.612995Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8u0daglbhgau6cq5r0.json b/apps/api/.xata/migrations/mig_cv8u0daglbhgau6cq5r0.json new file mode 100644 index 00000000..64061355 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8u0daglbhgau6cq5r0.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8u0daglbhgau6cq5r0", + "operations": [ + { + "create_table": { + "name": "s3_paths", + "columns": [ + { + "name": "xata_id", + "type": "text", + "check": { + "name": "s3_paths_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + }, + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"s3_paths\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"s3_paths\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8u0daglbhgau6cq5r0", + "parent": "mig_cv8u07aglbhgau6cq5q0", + "schema": "public", + "startedAt": "2025-03-12T19:27:49.903669Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8u5cqglbhgau6cq61g.json b/apps/api/.xata/migrations/mig_cv8u5cqglbhgau6cq61g.json new file mode 100644 index 00000000..80df49c0 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8u5cqglbhgau6cq61g.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8u5cqglbhgau6cq61g", + "operations": [ + { + "add_column": { + "up": "''", + "table": "dropbox_tokens", + "column": { + "name": "refresh_token", + "type": "text", + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8u5cqglbhgau6cq61g", + "parent": "mig_cv8u0daglbhgau6cq5r0", + "schema": "public", + "startedAt": "2025-03-12T19:38:28.311152Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8u6n01g95li4qghha0.json b/apps/api/.xata/migrations/mig_cv8u6n01g95li4qghha0.json new file mode 100644 index 00000000..3e319031 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8u6n01g95li4qghha0.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8u6n01g95li4qghha0", + "operations": [ + { + "add_column": { + "up": "''", + "table": "google_drive_tokens", + "column": { + "name": "refresh_token", + "type": "text", + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8u6n01g95li4qghha0", + "parent": "mig_cv8u5cqglbhgau6cq61g", + "schema": "public", + "startedAt": "2025-03-12T19:41:16.419896Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8u7uqglbhgau6cq62g.json b/apps/api/.xata/migrations/mig_cv8u7uqglbhgau6cq62g.json new file mode 100644 index 00000000..4a7b1fad --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8u7uqglbhgau6cq62g.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8u7uqglbhgau6cq62g", + "operations": [ + { + "add_column": { + "up": "''", + "table": "s3_bucket", + "column": { + "name": "name", + "type": "text", + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8u7uqglbhgau6cq62g", + "parent": "mig_cv8u6n01g95li4qghha0", + "schema": "public", + "startedAt": "2025-03-12T19:43:56.410523Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8u8j2glbhgau6cq63g.json b/apps/api/.xata/migrations/mig_cv8u8j2glbhgau6cq63g.json new file mode 100644 index 00000000..33d648cd --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8u8j2glbhgau6cq63g.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8u8j2glbhgau6cq63g", + "operations": [ + { + "add_column": { + "up": "''", + "table": "s3_bucket", + "column": { + "name": "user_id", + "type": "text", + "comment": "{\"xata.link\":\"users\"}", + "references": { + "name": "user_id_link", + "table": "users", + "column": "xata_id", + "on_delete": "CASCADE" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8u8j2glbhgau6cq63g", + "parent": "mig_cv8u7uqglbhgau6cq62g", + "schema": "public", + "startedAt": "2025-03-12T19:45:17.407227Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8ub7cld6k2hsabch2g.json b/apps/api/.xata/migrations/mig_cv8ub7cld6k2hsabch2g.json new file mode 100644 index 00000000..d36c8949 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8ub7cld6k2hsabch2g.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8ub7cld6k2hsabch2g", + "operations": [ + { + "add_column": { + "up": "''", + "table": "s3_bucket", + "column": { + "name": "s3_token_id", + "type": "text", + "comment": "{\"xata.link\":\"s3_tokens\"}", + "references": { + "name": "s3_token_id_link", + "table": "s3_tokens", + "column": "xata_id", + "on_delete": "CASCADE" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8ub7cld6k2hsabch2g", + "parent": "mig_cv8u8j2glbhgau6cq63g", + "schema": "public", + "startedAt": "2025-03-12T19:50:53.634179Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8ue4kld6k2hsabch3g.json b/apps/api/.xata/migrations/mig_cv8ue4kld6k2hsabch3g.json new file mode 100644 index 00000000..8a248def --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8ue4kld6k2hsabch3g.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8ue4kld6k2hsabch3g", + "operations": [ + { + "add_column": { + "up": "''", + "table": "dropbox", + "column": { + "name": "dropbox_token_id", + "type": "text", + "comment": "{\"xata.link\":\"dropbox_tokens\"}", + "references": { + "name": "dropbox_token_id_link", + "table": "dropbox_tokens", + "column": "xata_id", + "on_delete": "CASCADE" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8ue4kld6k2hsabch3g", + "parent": "mig_cv8ub7cld6k2hsabch2g", + "schema": "public", + "startedAt": "2025-03-12T19:57:06.582548Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8ueoaglbhgau6cq66g.json b/apps/api/.xata/migrations/mig_cv8ueoaglbhgau6cq66g.json new file mode 100644 index 00000000..3460b541 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8ueoaglbhgau6cq66g.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8ueoaglbhgau6cq66g", + "operations": [ + { + "add_column": { + "up": "''", + "table": "dropbox", + "column": { + "name": "user_id", + "type": "text", + "comment": "{\"xata.link\":\"users\"}", + "references": { + "name": "user_id_link", + "table": "users", + "column": "xata_id", + "on_delete": "CASCADE" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8ueoaglbhgau6cq66g", + "parent": "mig_cv8ue4kld6k2hsabch3g", + "schema": "public", + "startedAt": "2025-03-12T19:58:26.520533Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8ufnqglbhgau6cq67g.json b/apps/api/.xata/migrations/mig_cv8ufnqglbhgau6cq67g.json new file mode 100644 index 00000000..a8599ab6 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8ufnqglbhgau6cq67g.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8ufnqglbhgau6cq67g", + "operations": [ + { + "add_column": { + "up": "''", + "table": "google_drive", + "column": { + "name": "google_drive_token_id", + "type": "text", + "comment": "{\"xata.link\":\"google_drive_tokens\"}", + "references": { + "name": "google_drive_token_id_link", + "table": "google_drive_tokens", + "column": "xata_id", + "on_delete": "CASCADE" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8ufnqglbhgau6cq67g", + "parent": "mig_cv8ueoaglbhgau6cq66g", + "schema": "public", + "startedAt": "2025-03-12T20:00:32.127974Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8uh4aglbhgau6cq68g.json b/apps/api/.xata/migrations/mig_cv8uh4aglbhgau6cq68g.json new file mode 100644 index 00000000..02608f0a --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8uh4aglbhgau6cq68g.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8uh4aglbhgau6cq68g", + "operations": [ + { + "add_column": { + "up": "''", + "table": "google_drive", + "column": { + "name": "user_id", + "type": "text", + "comment": "{\"xata.link\":\"users\"}", + "references": { + "name": "user_id_link", + "table": "users", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8uh4aglbhgau6cq68g", + "parent": "mig_cv8ufnqglbhgau6cq67g", + "schema": "public", + "startedAt": "2025-03-12T20:03:29.416183Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8ujhqglbhgau6cq69g.json b/apps/api/.xata/migrations/mig_cv8ujhqglbhgau6cq69g.json new file mode 100644 index 00000000..500ece7f --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8ujhqglbhgau6cq69g.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8ujhqglbhgau6cq69g", + "operations": [ + { + "add_column": { + "up": "''", + "table": "dropbox_paths", + "column": { + "name": "dropbox_id", + "type": "text", + "comment": "{\"xata.link\":\"dropbox\"}", + "references": { + "name": "dropbox_id_link", + "table": "dropbox", + "column": "xata_id", + "on_delete": "CASCADE" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8ujhqglbhgau6cq69g", + "parent": "mig_cv8uh4aglbhgau6cq68g", + "schema": "public", + "startedAt": "2025-03-12T20:08:40.286709Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8ukrg1g95li4qghhh0.json b/apps/api/.xata/migrations/mig_cv8ukrg1g95li4qghhh0.json new file mode 100644 index 00000000..cab3f9df --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8ukrg1g95li4qghhh0.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8ukrg1g95li4qghhh0", + "operations": [ + { + "add_column": { + "up": "''", + "table": "dropbox_paths", + "column": { + "name": "track_id", + "type": "text", + "comment": "{\"xata.link\":\"tracks\"}", + "references": { + "name": "track_id_link", + "table": "tracks", + "column": "xata_id", + "on_delete": "CASCADE" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8ukrg1g95li4qghhh0", + "parent": "mig_cv8ujhqglbhgau6cq69g", + "schema": "public", + "startedAt": "2025-03-12T20:11:27.367833Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8ulakld6k2hsabch4g.json b/apps/api/.xata/migrations/mig_cv8ulakld6k2hsabch4g.json new file mode 100644 index 00000000..d3c42369 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8ulakld6k2hsabch4g.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8ulakld6k2hsabch4g", + "operations": [ + { + "add_column": { + "up": "''", + "table": "dropbox_paths", + "column": { + "name": "path", + "type": "text", + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8ulakld6k2hsabch4g", + "parent": "mig_cv8ukrg1g95li4qghhh0", + "schema": "public", + "startedAt": "2025-03-12T20:12:27.123143Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8umjo1g95li4qghhk0.json b/apps/api/.xata/migrations/mig_cv8umjo1g95li4qghhk0.json new file mode 100644 index 00000000..3979d683 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8umjo1g95li4qghhk0.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8umjo1g95li4qghhk0", + "operations": [ + { + "create_table": { + "name": "google_drive_paths", + "columns": [ + { + "name": "xata_id", + "type": "text", + "check": { + "name": "google_drive_paths_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + }, + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"google_drive_paths\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"google_drive_paths\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8umjo1g95li4qghhk0", + "parent": "mig_cv8ulakld6k2hsabch4g", + "schema": "public", + "startedAt": "2025-03-12T20:15:12.130883Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8un7g1g95li4qghhl0.json b/apps/api/.xata/migrations/mig_cv8un7g1g95li4qghhl0.json new file mode 100644 index 00000000..3f5df94e --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8un7g1g95li4qghhl0.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8un7g1g95li4qghhl0", + "operations": [ + { + "add_column": { + "up": "''", + "table": "google_drive_paths", + "column": { + "name": "google_drive_id", + "type": "text", + "comment": "{\"xata.link\":\"google_drive\"}", + "references": { + "name": "google_drive_id_link", + "table": "google_drive", + "column": "xata_id", + "on_delete": "CASCADE" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8un7g1g95li4qghhl0", + "parent": "mig_cv8umjo1g95li4qghhk0", + "schema": "public", + "startedAt": "2025-03-12T20:16:31.074898Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8unpo1g95li4qghhm0.json b/apps/api/.xata/migrations/mig_cv8unpo1g95li4qghhm0.json new file mode 100644 index 00000000..41d6152d --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8unpo1g95li4qghhm0.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8unpo1g95li4qghhm0", + "operations": [ + { + "add_column": { + "up": "''", + "table": "google_drive_paths", + "column": { + "name": "track_id", + "type": "text", + "comment": "{\"xata.link\":\"tracks\"}", + "references": { + "name": "track_id_link", + "table": "tracks", + "column": "xata_id", + "on_delete": "CASCADE" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8unpo1g95li4qghhm0", + "parent": "mig_cv8un7g1g95li4qghhl0", + "schema": "public", + "startedAt": "2025-03-12T20:17:44.010057Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8up2aglbhgau6cq6bg.json b/apps/api/.xata/migrations/mig_cv8up2aglbhgau6cq6bg.json new file mode 100644 index 00000000..63fa82f1 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8up2aglbhgau6cq6bg.json @@ -0,0 +1,25 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8up2aglbhgau6cq6bg", + "operations": [ + { + "add_column": { + "up": "''", + "table": "google_drive_paths", + "column": { + "name": "google_drive_file_id", + "type": "text", + "unique": true, + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8up2aglbhgau6cq6bg", + "parent": "mig_cv8unpo1g95li4qghhm0", + "schema": "public", + "startedAt": "2025-03-12T20:20:26.129287Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8upbcld6k2hsabch6g.json b/apps/api/.xata/migrations/mig_cv8upbcld6k2hsabch6g.json new file mode 100644 index 00000000..56016f94 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8upbcld6k2hsabch6g.json @@ -0,0 +1,20 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8upbcld6k2hsabch6g", + "operations": [ + { + "alter_column": { + "name": "file_id", + "table": "google_drive_paths", + "column": "google_drive_file_id" + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8upbcld6k2hsabch6g", + "parent": "mig_cv8up2aglbhgau6cq6bg", + "schema": "public", + "startedAt": "2025-03-12T20:21:01.574135Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8uq1sld6k2hsabch7g.json b/apps/api/.xata/migrations/mig_cv8uq1sld6k2hsabch7g.json new file mode 100644 index 00000000..e47439a0 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8uq1sld6k2hsabch7g.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8uq1sld6k2hsabch7g", + "operations": [ + { + "add_column": { + "up": "''", + "table": "s3_paths", + "column": { + "name": "track_id", + "type": "text", + "comment": "{\"xata.link\":\"tracks\"}", + "references": { + "name": "track_id_link", + "table": "tracks", + "column": "xata_id", + "on_delete": "CASCADE" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8uq1sld6k2hsabch7g", + "parent": "mig_cv8upbcld6k2hsabch6g", + "schema": "public", + "startedAt": "2025-03-12T20:22:31.736456Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8uqh2glbhgau6cq6d0.json b/apps/api/.xata/migrations/mig_cv8uqh2glbhgau6cq6d0.json new file mode 100644 index 00000000..81a429cc --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8uqh2glbhgau6cq6d0.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8uqh2glbhgau6cq6d0", + "operations": [ + { + "add_column": { + "up": "''", + "table": "s3_paths", + "column": { + "name": "s3_bucket_id", + "type": "text", + "comment": "{\"xata.link\":\"s3_bucket\"}", + "references": { + "name": "s3_bucket_id_link", + "table": "s3_bucket", + "column": "xata_id", + "on_delete": "CASCADE" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8uqh2glbhgau6cq6d0", + "parent": "mig_cv8uq1sld6k2hsabch7g", + "schema": "public", + "startedAt": "2025-03-12T20:23:32.674866Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8ur1kld6k2hsabch8g.json b/apps/api/.xata/migrations/mig_cv8ur1kld6k2hsabch8g.json new file mode 100644 index 00000000..e2b4b491 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8ur1kld6k2hsabch8g.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8ur1kld6k2hsabch8g", + "operations": [ + { + "add_column": { + "up": "''", + "table": "s3_tokens", + "column": { + "name": "secret_access_key", + "type": "text", + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8ur1kld6k2hsabch8g", + "parent": "mig_cv8uqh2glbhgau6cq6d0", + "schema": "public", + "startedAt": "2025-03-12T20:24:39.513081Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8urh4ld6k2hsabch9g.json b/apps/api/.xata/migrations/mig_cv8urh4ld6k2hsabch9g.json new file mode 100644 index 00000000..fccc6492 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8urh4ld6k2hsabch9g.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8urh4ld6k2hsabch9g", + "operations": [ + { + "add_column": { + "up": "''", + "table": "s3_tokens", + "column": { + "name": "client_access_key", + "type": "text", + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8urh4ld6k2hsabch9g", + "parent": "mig_cv8ur1kld6k2hsabch8g", + "schema": "public", + "startedAt": "2025-03-12T20:25:41.248772Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8us9g1g95li4qghhq0.json b/apps/api/.xata/migrations/mig_cv8us9g1g95li4qghhq0.json new file mode 100644 index 00000000..cef2101b --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8us9g1g95li4qghhq0.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8us9g1g95li4qghhq0", + "operations": [ + { + "create_table": { + "name": "sftp", + "columns": [ + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_id", + "type": "text", + "check": { + "name": "sftp_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + }, + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"sftp\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"sftp\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8us9g1g95li4qghhq0", + "parent": "mig_cv8urh4ld6k2hsabch9g", + "schema": "public", + "startedAt": "2025-03-12T20:27:19.422672Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8usig1g95li4qghhr0.json b/apps/api/.xata/migrations/mig_cv8usig1g95li4qghhr0.json new file mode 100644 index 00000000..c3aa44a2 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8usig1g95li4qghhr0.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8usig1g95li4qghhr0", + "operations": [ + { + "create_table": { + "name": "sftp_access", + "columns": [ + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_id", + "type": "text", + "check": { + "name": "sftp_access_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + }, + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"sftp_access\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"sftp_access\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8usig1g95li4qghhr0", + "parent": "mig_cv8us9g1g95li4qghhq0", + "schema": "public", + "startedAt": "2025-03-12T20:27:55.896177Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8utv81g95li4qghhs0.json b/apps/api/.xata/migrations/mig_cv8utv81g95li4qghhs0.json new file mode 100644 index 00000000..6b2b6842 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8utv81g95li4qghhs0.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8utv81g95li4qghhs0", + "operations": [ + { + "create_table": { + "name": "builtin_storage_paths", + "columns": [ + { + "name": "xata_id", + "type": "text", + "check": { + "name": "builtin_storage_paths_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + }, + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"builtin_storage_paths\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"builtin_storage_paths\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8utv81g95li4qghhs0", + "parent": "mig_cv8usig1g95li4qghhr0", + "schema": "public", + "startedAt": "2025-03-12T20:30:54.210263Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8uugqglbhgau6cq6e0.json b/apps/api/.xata/migrations/mig_cv8uugqglbhgau6cq6e0.json new file mode 100644 index 00000000..7c2a569b --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8uugqglbhgau6cq6e0.json @@ -0,0 +1,25 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8uugqglbhgau6cq6e0", + "operations": [ + { + "add_column": { + "up": "''", + "table": "builtin_storage_paths", + "column": { + "name": "path", + "type": "text", + "unique": true, + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8uugqglbhgau6cq6e0", + "parent": "mig_cv8utv81g95li4qghhs0", + "schema": "public", + "startedAt": "2025-03-12T20:32:05.065795Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8uv2iglbhgau6cq6f0.json b/apps/api/.xata/migrations/mig_cv8uv2iglbhgau6cq6f0.json new file mode 100644 index 00000000..c0166efc --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8uv2iglbhgau6cq6f0.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8uv2iglbhgau6cq6f0", + "operations": [ + { + "add_column": { + "up": "''", + "table": "builtin_storage_paths", + "column": { + "name": "track_id", + "type": "text", + "comment": "{\"xata.link\":\"tracks\"}", + "references": { + "name": "track_id_link", + "table": "tracks", + "column": "xata_id", + "on_delete": "CASCADE" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8uv2iglbhgau6cq6f0", + "parent": "mig_cv8uugqglbhgau6cq6e0", + "schema": "public", + "startedAt": "2025-03-12T20:33:15.916373Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8uveiglbhgau6cq6h0.json b/apps/api/.xata/migrations/mig_cv8uveiglbhgau6cq6h0.json new file mode 100644 index 00000000..a02a352a --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8uveiglbhgau6cq6h0.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8uveiglbhgau6cq6h0", + "operations": [ + { + "add_column": { + "up": "''", + "table": "builtin_storage_paths", + "column": { + "name": "user_id", + "type": "text", + "comment": "{\"xata.link\":\"users\"}", + "references": { + "name": "user_id_link", + "table": "users", + "column": "xata_id", + "on_delete": "CASCADE" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8uveiglbhgau6cq6h0", + "parent": "mig_cv8uv2iglbhgau6cq6f0", + "schema": "public", + "startedAt": "2025-03-12T20:34:03.576836Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8v8gcld6k2hsabcheg.json b/apps/api/.xata/migrations/mig_cv8v8gcld6k2hsabcheg.json new file mode 100644 index 00000000..bc138151 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8v8gcld6k2hsabcheg.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8v8gcld6k2hsabcheg", + "operations": [ + { + "create_table": { + "name": "sftp_path", + "columns": [ + { + "name": "xata_id", + "type": "text", + "check": { + "name": "sftp_path_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + }, + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"sftp_path\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"sftp_path\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8v8gcld6k2hsabcheg", + "parent": "mig_cv8uveiglbhgau6cq6h0", + "schema": "public", + "startedAt": "2025-03-12T20:53:21.873024Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8v92aglbhgau6cq6n0.json b/apps/api/.xata/migrations/mig_cv8v92aglbhgau6cq6n0.json new file mode 100644 index 00000000..124ea28a --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8v92aglbhgau6cq6n0.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8v92aglbhgau6cq6n0", + "operations": [ + { + "add_column": { + "up": "''", + "table": "sftp_path", + "column": { + "name": "track_id", + "type": "text", + "comment": "{\"xata.link\":\"tracks\"}", + "references": { + "name": "track_id_link", + "table": "tracks", + "column": "xata_id", + "on_delete": "CASCADE" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8v92aglbhgau6cq6n0", + "parent": "mig_cv8v8gcld6k2hsabcheg", + "schema": "public", + "startedAt": "2025-03-12T20:54:33.889601Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8v9faglbhgau6cq6o0.json b/apps/api/.xata/migrations/mig_cv8v9faglbhgau6cq6o0.json new file mode 100644 index 00000000..6bf49fe5 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8v9faglbhgau6cq6o0.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8v9faglbhgau6cq6o0", + "operations": [ + { + "add_column": { + "up": "''", + "table": "sftp_path", + "column": { + "name": "path", + "type": "text", + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8v9faglbhgau6cq6o0", + "parent": "mig_cv8v92aglbhgau6cq6n0", + "schema": "public", + "startedAt": "2025-03-12T20:55:26.567965Z" +} diff --git a/apps/api/.xata/migrations/mig_cv8v9sqglbhgau6cq6p0.json b/apps/api/.xata/migrations/mig_cv8v9sqglbhgau6cq6p0.json new file mode 100644 index 00000000..1a54fc25 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cv8v9sqglbhgau6cq6p0.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cv8v9sqglbhgau6cq6p0", + "operations": [ + { + "add_column": { + "up": "''", + "table": "sftp_path", + "column": { + "name": "sftp_id", + "type": "text", + "comment": "{\"xata.link\":\"sftp\"}", + "references": { + "name": "sftp_id_link", + "table": "sftp", + "column": "xata_id", + "on_delete": "CASCADE" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cv8v9sqglbhgau6cq6p0", + "parent": "mig_cv8v9faglbhgau6cq6o0", + "schema": "public", + "startedAt": "2025-03-12T20:56:20.296301Z" +} diff --git a/apps/api/.xata/migrations/mig_cvb8uqsld6k2hsabd54g.json b/apps/api/.xata/migrations/mig_cvb8uqsld6k2hsabd54g.json new file mode 100644 index 00000000..ec07861e --- /dev/null +++ b/apps/api/.xata/migrations/mig_cvb8uqsld6k2hsabd54g.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cvb8uqsld6k2hsabd54g", + "operations": [ + { + "add_column": { + "up": "''", + "table": "google_drive_paths", + "column": { + "name": "name", + "type": "text", + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cvb8uqsld6k2hsabd54g", + "parent": "mig_cv8v9sqglbhgau6cq6p0", + "schema": "public", + "startedAt": "2025-03-16T08:44:27.455514Z" +} diff --git a/apps/api/.xata/migrations/mig_cvb8vpsld6k2hsabd55g.json b/apps/api/.xata/migrations/mig_cvb8vpsld6k2hsabd55g.json new file mode 100644 index 00000000..ea3a7da0 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cvb8vpsld6k2hsabd55g.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cvb8vpsld6k2hsabd55g", + "operations": [ + { + "add_column": { + "up": "''", + "table": "s3_paths", + "column": { + "name": "name", + "type": "text", + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cvb8vpsld6k2hsabd55g", + "parent": "mig_cvb8uqsld6k2hsabd54g", + "schema": "public", + "startedAt": "2025-03-16T08:46:32.299475Z" +} diff --git a/apps/api/.xata/migrations/mig_cvb902cld6k2hsabd580.json b/apps/api/.xata/migrations/mig_cvb902cld6k2hsabd580.json new file mode 100644 index 00000000..f0509dea --- /dev/null +++ b/apps/api/.xata/migrations/mig_cvb902cld6k2hsabd580.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cvb902cld6k2hsabd580", + "operations": [ + { + "add_column": { + "up": "''", + "table": "s3_paths", + "column": { + "name": "path", + "type": "text", + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cvb902cld6k2hsabd580", + "parent": "mig_cvb8vpsld6k2hsabd55g", + "schema": "public", + "startedAt": "2025-03-16T08:47:06.501691Z" +} diff --git a/apps/api/.xata/migrations/mig_cvb90kiglbhgau6cqsng.json b/apps/api/.xata/migrations/mig_cvb90kiglbhgau6cqsng.json new file mode 100644 index 00000000..e602a311 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cvb90kiglbhgau6cqsng.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cvb90kiglbhgau6cqsng", + "operations": [ + { + "add_column": { + "up": "''", + "table": "sftp_path", + "column": { + "name": "name", + "type": "text", + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cvb90kiglbhgau6cqsng", + "parent": "mig_cvb902cld6k2hsabd580", + "schema": "public", + "startedAt": "2025-03-16T08:48:18.49289Z" +} diff --git a/apps/api/.xata/migrations/mig_cvb915cld6k2hsabd590.json b/apps/api/.xata/migrations/mig_cvb915cld6k2hsabd590.json new file mode 100644 index 00000000..da11bc4b --- /dev/null +++ b/apps/api/.xata/migrations/mig_cvb915cld6k2hsabd590.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cvb915cld6k2hsabd590", + "operations": [ + { + "add_column": { + "up": "''", + "table": "dropbox_paths", + "column": { + "name": "name", + "type": "text", + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cvb915cld6k2hsabd590", + "parent": "mig_cvb90kiglbhgau6cqsng", + "schema": "public", + "startedAt": "2025-03-16T08:49:26.358794Z" +} diff --git a/apps/api/.xata/migrations/mig_cvbdpcg1g95li4qgi2o0.json b/apps/api/.xata/migrations/mig_cvbdpcg1g95li4qgi2o0.json new file mode 100644 index 00000000..eb213c53 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cvbdpcg1g95li4qgi2o0.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cvbdpcg1g95li4qgi2o0", + "operations": [ + { + "create_table": { + "name": "dropbox_accounts", + "columns": [ + { + "name": "xata_id", + "type": "text", + "check": { + "name": "dropbox_accounts_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + }, + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"dropbox_accounts\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"dropbox_accounts\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cvbdpcg1g95li4qgi2o0", + "parent": "mig_cvb915cld6k2hsabd590", + "schema": "public", + "startedAt": "2025-03-16T14:14:11.113926Z" +} diff --git a/apps/api/.xata/migrations/mig_cvbdpm2glbhgau6cqu40.json b/apps/api/.xata/migrations/mig_cvbdpm2glbhgau6cqu40.json new file mode 100644 index 00000000..fa65c74c --- /dev/null +++ b/apps/api/.xata/migrations/mig_cvbdpm2glbhgau6cqu40.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cvbdpm2glbhgau6cqu40", + "operations": [ + { + "create_table": { + "name": "google_drive_accounts", + "columns": [ + { + "name": "xata_id", + "type": "text", + "check": { + "name": "google_drive_accounts_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + }, + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"google_drive_accounts\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"google_drive_accounts\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cvbdpm2glbhgau6cqu40", + "parent": "mig_cvbdpcg1g95li4qgi2o0", + "schema": "public", + "startedAt": "2025-03-16T14:14:48.5652Z" +} diff --git a/apps/api/.xata/migrations/mig_cvbdq601g95li4qgi2p0.json b/apps/api/.xata/migrations/mig_cvbdq601g95li4qgi2p0.json new file mode 100644 index 00000000..2ab60b2a --- /dev/null +++ b/apps/api/.xata/migrations/mig_cvbdq601g95li4qgi2p0.json @@ -0,0 +1,25 @@ +{ + "done": true, + "migration": { + "name": "mig_cvbdq601g95li4qgi2p0", + "operations": [ + { + "add_column": { + "up": "''", + "table": "dropbox_accounts", + "column": { + "name": "email", + "type": "text", + "unique": true, + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cvbdq601g95li4qgi2p0", + "parent": "mig_cvbdpm2glbhgau6cqu40", + "schema": "public", + "startedAt": "2025-03-16T14:15:53.355537Z" +} diff --git a/apps/api/.xata/migrations/mig_cvbdqi81g95li4qgi2q0.json b/apps/api/.xata/migrations/mig_cvbdqi81g95li4qgi2q0.json new file mode 100644 index 00000000..9ffff3c1 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cvbdqi81g95li4qgi2q0.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cvbdqi81g95li4qgi2q0", + "operations": [ + { + "add_column": { + "up": "false", + "table": "dropbox_accounts", + "column": { + "name": "is_beta_user", + "type": "bool", + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cvbdqi81g95li4qgi2q0", + "parent": "mig_cvbdq601g95li4qgi2p0", + "schema": "public", + "startedAt": "2025-03-16T14:16:41.939981Z" +} diff --git a/apps/api/.xata/migrations/mig_cvbdqvaglbhgau6cqu50.json b/apps/api/.xata/migrations/mig_cvbdqvaglbhgau6cqu50.json new file mode 100644 index 00000000..3f199f6c --- /dev/null +++ b/apps/api/.xata/migrations/mig_cvbdqvaglbhgau6cqu50.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cvbdqvaglbhgau6cqu50", + "operations": [ + { + "add_column": { + "up": "''", + "table": "dropbox_accounts", + "column": { + "name": "user_id", + "type": "text", + "comment": "{\"xata.link\":\"users\"}", + "references": { + "name": "user_id_link", + "table": "users", + "column": "xata_id", + "on_delete": "CASCADE" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cvbdqvaglbhgau6cqu50", + "parent": "mig_cvbdqi81g95li4qgi2q0", + "schema": "public", + "startedAt": "2025-03-16T14:17:33.624392Z" +} diff --git a/apps/api/.xata/migrations/mig_cvbdtgaglbhgau6cqu70.json b/apps/api/.xata/migrations/mig_cvbdtgaglbhgau6cqu70.json new file mode 100644 index 00000000..7e011dfc --- /dev/null +++ b/apps/api/.xata/migrations/mig_cvbdtgaglbhgau6cqu70.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cvbdtgaglbhgau6cqu70", + "operations": [ + { + "add_column": { + "up": "''", + "table": "google_drive_accounts", + "column": { + "name": "user_id", + "type": "text", + "comment": "{\"xata.link\":\"users\"}", + "references": { + "name": "user_id_link", + "table": "users", + "column": "xata_id", + "on_delete": "CASCADE" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cvbdtgaglbhgau6cqu70", + "parent": "mig_cvbdqvaglbhgau6cqu50", + "schema": "public", + "startedAt": "2025-03-16T14:22:57.996635Z" +} diff --git a/apps/api/.xata/migrations/mig_cvbdtq81g95li4qgi2tg.json b/apps/api/.xata/migrations/mig_cvbdtq81g95li4qgi2tg.json new file mode 100644 index 00000000..24ac7400 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cvbdtq81g95li4qgi2tg.json @@ -0,0 +1,25 @@ +{ + "done": true, + "migration": { + "name": "mig_cvbdtq81g95li4qgi2tg", + "operations": [ + { + "add_column": { + "up": "''", + "table": "google_drive_accounts", + "column": { + "name": "email", + "type": "text", + "unique": true, + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cvbdtq81g95li4qgi2tg", + "parent": "mig_cvbdtgaglbhgau6cqu70", + "schema": "public", + "startedAt": "2025-03-16T14:23:38.591098Z" +} diff --git a/apps/api/.xata/migrations/mig_cvbdu401g95li4qgi2ug.json b/apps/api/.xata/migrations/mig_cvbdu401g95li4qgi2ug.json new file mode 100644 index 00000000..06f47101 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cvbdu401g95li4qgi2ug.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cvbdu401g95li4qgi2ug", + "operations": [ + { + "add_column": { + "up": "false", + "table": "google_drive_accounts", + "column": { + "name": "is_beta_user", + "type": "bool", + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cvbdu401g95li4qgi2ug", + "parent": "mig_cvbdtq81g95li4qgi2tg", + "schema": "public", + "startedAt": "2025-03-16T14:24:16.999127Z" +} diff --git a/apps/api/.xata/migrations/mig_cvf4ibaglbhgau6crvn0.json b/apps/api/.xata/migrations/mig_cvf4ibaglbhgau6crvn0.json new file mode 100644 index 00000000..b653fb1e --- /dev/null +++ b/apps/api/.xata/migrations/mig_cvf4ibaglbhgau6crvn0.json @@ -0,0 +1,25 @@ +{ + "done": true, + "migration": { + "name": "mig_cvf4ibaglbhgau6crvn0", + "operations": [ + { + "add_column": { + "up": "''", + "table": "dropbox_paths", + "column": { + "name": "file_id", + "type": "text", + "unique": true, + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cvf4ibaglbhgau6crvn0", + "parent": "mig_cvbdu401g95li4qgi2ug", + "schema": "public", + "startedAt": "2025-03-22T05:22:53.560297Z" +} diff --git a/apps/api/.xata/migrations/mig_cvlvlviglbhgau6ctmp0.json b/apps/api/.xata/migrations/mig_cvlvlviglbhgau6ctmp0.json new file mode 100644 index 00000000..d611688e --- /dev/null +++ b/apps/api/.xata/migrations/mig_cvlvlviglbhgau6ctmp0.json @@ -0,0 +1,21 @@ +{ + "done": true, + "migration": { + "name": "mig_cvlvlviglbhgau6ctmp0", + "operations": [ + { + "drop_constraint": { + "up": "\"uri\"", + "down": "\"uri\"", + "name": "scrobbles__pgroll_new_uri_key", + "table": "scrobbles" + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cvlvlviglbhgau6ctmp0", + "parent": "mig_cvf4ibaglbhgau6crvn0", + "schema": "public", + "startedAt": "2025-04-01T14:41:03.612996Z" +} diff --git a/apps/api/.xata/migrations/mig_cvmofkdfchh2dtob7fo0.json b/apps/api/.xata/migrations/mig_cvmofkdfchh2dtob7fo0.json new file mode 100644 index 00000000..2154102f --- /dev/null +++ b/apps/api/.xata/migrations/mig_cvmofkdfchh2dtob7fo0.json @@ -0,0 +1,21 @@ +{ + "done": true, + "migration": { + "name": "mig_cvmofkdfchh2dtob7fo0", + "operations": [ + { + "drop_constraint": { + "up": "\"uri\"", + "down": "\"uri\"", + "name": "user_artists__pgroll_new_uri_key", + "table": "user_artists" + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cvmofkdfchh2dtob7fo0", + "parent": "mig_cvlvlviglbhgau6ctmp0", + "schema": "public", + "startedAt": "2025-04-02T18:54:09.918722Z" +} diff --git a/apps/api/.xata/migrations/mig_cvmognlfchh2dtob7fp0.json b/apps/api/.xata/migrations/mig_cvmognlfchh2dtob7fp0.json new file mode 100644 index 00000000..ac0f7332 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cvmognlfchh2dtob7fp0.json @@ -0,0 +1,21 @@ +{ + "done": true, + "migration": { + "name": "mig_cvmognlfchh2dtob7fp0", + "operations": [ + { + "drop_constraint": { + "up": "\"uri\"", + "down": "\"uri\"", + "name": "user_albums__pgroll_new_uri_key", + "table": "user_albums" + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cvmognlfchh2dtob7fp0", + "parent": "mig_cvmofkdfchh2dtob7fo0", + "schema": "public", + "startedAt": "2025-04-02T18:56:31.602306Z" +} diff --git a/apps/api/.xata/migrations/mig_cvmoh77o1tkgc98jgemg.json b/apps/api/.xata/migrations/mig_cvmoh77o1tkgc98jgemg.json new file mode 100644 index 00000000..719d4a78 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cvmoh77o1tkgc98jgemg.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cvmoh77o1tkgc98jgemg", + "operations": [ + { + "alter_column": { + "up": "\"uri\"", + "down": "\"uri\"", + "table": "scrobbles", + "column": "uri", + "unique": { + "name": "scrobbles_uri_unique" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cvmoh77o1tkgc98jgemg", + "parent": "mig_cvmognlfchh2dtob7fp0", + "schema": "public", + "startedAt": "2025-04-02T18:57:33.44412Z" +} diff --git a/apps/api/.xata/migrations/mig_cvn0t3tfchh2dtob7hf0.json b/apps/api/.xata/migrations/mig_cvn0t3tfchh2dtob7hf0.json new file mode 100644 index 00000000..fe7b6134 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cvn0t3tfchh2dtob7hf0.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cvn0t3tfchh2dtob7hf0", + "operations": [ + { + "create_table": { + "name": "queue_tracks", + "columns": [ + { + "name": "xata_id", + "type": "text", + "check": { + "name": "queue_tracks_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + }, + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"queue_tracks\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"queue_tracks\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cvn0t3tfchh2dtob7hf0", + "parent": "mig_cvmoh77o1tkgc98jgemg", + "schema": "public", + "startedAt": "2025-04-03T04:29:03.404336Z" +} diff --git a/apps/api/.xata/migrations/mig_cvn0traglbhgau6ctu70.json b/apps/api/.xata/migrations/mig_cvn0traglbhgau6ctu70.json new file mode 100644 index 00000000..db375493 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cvn0traglbhgau6ctu70.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cvn0traglbhgau6ctu70", + "operations": [ + { + "create_table": { + "name": "playback_states", + "columns": [ + { + "name": "xata_id", + "type": "text", + "check": { + "name": "playback_states_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + }, + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"playback_states\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"playback_states\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cvn0traglbhgau6ctu70", + "parent": "mig_cvn0t3tfchh2dtob7hf0", + "schema": "public", + "startedAt": "2025-04-03T04:30:37.854276Z" +} diff --git a/apps/api/.xata/migrations/mig_cvn0uano1tkgc98jgg90.json b/apps/api/.xata/migrations/mig_cvn0uano1tkgc98jgg90.json new file mode 100644 index 00000000..1724f65e --- /dev/null +++ b/apps/api/.xata/migrations/mig_cvn0uano1tkgc98jgg90.json @@ -0,0 +1,19 @@ +{ + "done": true, + "migration": { + "name": "mig_cvn0uano1tkgc98jgg90", + "operations": [ + { + "rename_table": { + "to": "playback_state", + "from": "playback_states" + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cvn0uano1tkgc98jgg90", + "parent": "mig_cvn0traglbhgau6ctu70", + "schema": "public", + "startedAt": "2025-04-03T04:31:39.747349Z" +} diff --git a/apps/api/.xata/migrations/mig_cvn10dvo1tkgc98jgga0.json b/apps/api/.xata/migrations/mig_cvn10dvo1tkgc98jgga0.json new file mode 100644 index 00000000..cc5b8468 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cvn10dvo1tkgc98jgga0.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cvn10dvo1tkgc98jgga0", + "operations": [ + { + "add_column": { + "up": "''", + "table": "playback_state", + "column": { + "name": "user_id", + "type": "text", + "comment": "{\"xata.link\":\"users\"}", + "references": { + "name": "user_id_link", + "table": "users", + "column": "xata_id", + "on_delete": "CASCADE" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cvn10dvo1tkgc98jgga0", + "parent": "mig_cvn0uano1tkgc98jgg90", + "schema": "public", + "startedAt": "2025-04-03T04:36:07.949435Z" +} diff --git a/apps/api/.xata/migrations/mig_cvn11aiglbhgau6ctu80.json b/apps/api/.xata/migrations/mig_cvn11aiglbhgau6ctu80.json new file mode 100644 index 00000000..54679942 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cvn11aiglbhgau6ctu80.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cvn11aiglbhgau6ctu80", + "operations": [ + { + "add_column": { + "up": "''", + "table": "playback_state", + "column": { + "name": "track_id", + "type": "text", + "comment": "{\"xata.link\":\"tracks\"}", + "references": { + "name": "track_id_link", + "table": "tracks", + "column": "xata_id", + "on_delete": "CASCADE" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cvn11aiglbhgau6ctu80", + "parent": "mig_cvn10dvo1tkgc98jgga0", + "schema": "public", + "startedAt": "2025-04-03T04:38:03.591622Z" +} diff --git a/apps/api/.xata/migrations/mig_cvn12paglbhgau6ctubg.json b/apps/api/.xata/migrations/mig_cvn12paglbhgau6ctubg.json new file mode 100644 index 00000000..6929843a --- /dev/null +++ b/apps/api/.xata/migrations/mig_cvn12paglbhgau6ctubg.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cvn12paglbhgau6ctubg", + "operations": [ + { + "add_column": { + "up": "0", + "table": "playback_state", + "column": { + "name": "queue_position", + "type": "int", + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cvn12paglbhgau6ctubg", + "parent": "mig_cvn11aiglbhgau6ctu80", + "schema": "public", + "startedAt": "2025-04-03T04:41:10.117415Z" +} diff --git a/apps/api/.xata/migrations/mig_cvn1h5qglbhgau6ctuhg.json b/apps/api/.xata/migrations/mig_cvn1h5qglbhgau6ctuhg.json new file mode 100644 index 00000000..5a94d040 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cvn1h5qglbhgau6ctuhg.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cvn1h5qglbhgau6ctuhg", + "operations": [ + { + "add_column": { + "up": "0", + "table": "playback_state", + "column": { + "name": "progress_ms", + "type": "int", + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cvn1h5qglbhgau6ctuhg", + "parent": "mig_cvn12paglbhgau6ctubg", + "schema": "public", + "startedAt": "2025-04-03T05:11:52.275843Z" +} diff --git a/apps/api/.xata/migrations/mig_cvn1ke2glbhgau6ctuig.json b/apps/api/.xata/migrations/mig_cvn1ke2glbhgau6ctuig.json new file mode 100644 index 00000000..b1cb655b --- /dev/null +++ b/apps/api/.xata/migrations/mig_cvn1ke2glbhgau6ctuig.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cvn1ke2glbhgau6ctuig", + "operations": [ + { + "add_column": { + "up": "''", + "table": "queue_tracks", + "column": { + "name": "user_id", + "type": "text", + "comment": "{\"xata.link\":\"users\"}", + "references": { + "name": "user_id_link", + "table": "users", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cvn1ke2glbhgau6ctuig", + "parent": "mig_cvn1h5qglbhgau6ctuhg", + "schema": "public", + "startedAt": "2025-04-03T05:18:48.526713Z" +} diff --git a/apps/api/.xata/migrations/mig_cvn1kqfo1tkgc98jggd0.json b/apps/api/.xata/migrations/mig_cvn1kqfo1tkgc98jggd0.json new file mode 100644 index 00000000..831c2822 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cvn1kqfo1tkgc98jggd0.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cvn1kqfo1tkgc98jggd0", + "operations": [ + { + "add_column": { + "up": "''", + "table": "queue_tracks", + "column": { + "name": "track_id", + "type": "text", + "comment": "{\"xata.link\":\"tracks\"}", + "references": { + "name": "track_id_link", + "table": "tracks", + "column": "xata_id", + "on_delete": "SET NULL" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cvn1kqfo1tkgc98jggd0", + "parent": "mig_cvn1ke2glbhgau6ctuig", + "schema": "public", + "startedAt": "2025-04-03T05:19:38.197487Z" +} diff --git a/apps/api/.xata/migrations/mig_cvn1l8iglbhgau6ctujg.json b/apps/api/.xata/migrations/mig_cvn1l8iglbhgau6ctujg.json new file mode 100644 index 00000000..93b89a91 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cvn1l8iglbhgau6ctujg.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cvn1l8iglbhgau6ctujg", + "operations": [ + { + "add_column": { + "up": "0", + "table": "queue_tracks", + "column": { + "name": "position", + "type": "int", + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cvn1l8iglbhgau6ctujg", + "parent": "mig_cvn1kqfo1tkgc98jggd0", + "schema": "public", + "startedAt": "2025-04-03T05:20:35.051751Z" +} diff --git a/apps/api/.xata/migrations/mig_cvrt0e5fchh2dtob8q4g.json b/apps/api/.xata/migrations/mig_cvrt0e5fchh2dtob8q4g.json new file mode 100644 index 00000000..ab4c04d5 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cvrt0e5fchh2dtob8q4g.json @@ -0,0 +1,21 @@ +{ + "done": true, + "migration": { + "name": "mig_cvrt0e5fchh2dtob8q4g", + "operations": [ + { + "drop_constraint": { + "up": "\"uri\"", + "down": "\"uri\"", + "name": "user_tracks__pgroll_new_uri_key", + "table": "user_tracks" + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cvrt0e5fchh2dtob8q4g", + "parent": "mig_cvn1l8iglbhgau6ctujg", + "schema": "public", + "startedAt": "2025-04-10T14:05:45.203505Z" +} diff --git a/apps/api/.xata/migrations/mig_cvsn7hd1cltn5mtppc70.json b/apps/api/.xata/migrations/mig_cvsn7hd1cltn5mtppc70.json new file mode 100644 index 00000000..d6d63e1a --- /dev/null +++ b/apps/api/.xata/migrations/mig_cvsn7hd1cltn5mtppc70.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_cvsn7hd1cltn5mtppc70", + "operations": [ + { + "create_table": { + "name": "api_keys", + "columns": [ + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_id", + "type": "text", + "check": { + "name": "api_keys_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"api_keys\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"api_keys\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cvsn7hd1cltn5mtppc70", + "parent": "mig_cvrt0e5fchh2dtob8q4g", + "schema": "public", + "startedAt": "2025-04-11T19:55:50.295386Z" +} diff --git a/apps/api/.xata/migrations/mig_cvsn81l1cltn5mtppc80.json b/apps/api/.xata/migrations/mig_cvsn81l1cltn5mtppc80.json new file mode 100644 index 00000000..fcc5c3bb --- /dev/null +++ b/apps/api/.xata/migrations/mig_cvsn81l1cltn5mtppc80.json @@ -0,0 +1,25 @@ +{ + "done": true, + "migration": { + "name": "mig_cvsn81l1cltn5mtppc80", + "operations": [ + { + "add_column": { + "up": "''", + "table": "api_keys", + "column": { + "name": "shared_secret", + "type": "text", + "unique": true, + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cvsn81l1cltn5mtppc80", + "parent": "mig_cvsn7hd1cltn5mtppc70", + "schema": "public", + "startedAt": "2025-04-11T19:56:54.8875Z" +} diff --git a/apps/api/.xata/migrations/mig_cvsn8otfchh2dtob919g.json b/apps/api/.xata/migrations/mig_cvsn8otfchh2dtob919g.json new file mode 100644 index 00000000..8242e19c --- /dev/null +++ b/apps/api/.xata/migrations/mig_cvsn8otfchh2dtob919g.json @@ -0,0 +1,25 @@ +{ + "done": true, + "migration": { + "name": "mig_cvsn8otfchh2dtob919g", + "operations": [ + { + "add_column": { + "up": "''", + "table": "api_keys", + "column": { + "name": "api_key", + "type": "text", + "unique": true, + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cvsn8otfchh2dtob919g", + "parent": "mig_cvsn81l1cltn5mtppc80", + "schema": "public", + "startedAt": "2025-04-11T19:58:27.763431Z" +} diff --git a/apps/api/.xata/migrations/mig_cvsn9ad1cltn5mtppc90.json b/apps/api/.xata/migrations/mig_cvsn9ad1cltn5mtppc90.json new file mode 100644 index 00000000..7c87f64d --- /dev/null +++ b/apps/api/.xata/migrations/mig_cvsn9ad1cltn5mtppc90.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_cvsn9ad1cltn5mtppc90", + "operations": [ + { + "add_column": { + "up": "''", + "table": "api_keys", + "column": { + "name": "user_id", + "type": "text", + "comment": "{\"xata.link\":\"users\"}", + "references": { + "name": "user_id_link", + "table": "users", + "column": "xata_id", + "on_delete": "CASCADE" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cvsn9ad1cltn5mtppc90", + "parent": "mig_cvsn8otfchh2dtob919g", + "schema": "public", + "startedAt": "2025-04-11T19:59:37.377207Z" +} diff --git a/apps/api/.xata/migrations/mig_cvsnc0tfchh2dtob91cg.json b/apps/api/.xata/migrations/mig_cvsnc0tfchh2dtob91cg.json new file mode 100644 index 00000000..784e1db5 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cvsnc0tfchh2dtob91cg.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cvsnc0tfchh2dtob91cg", + "operations": [ + { + "add_column": { + "table": "api_keys", + "column": { + "name": "description", + "type": "text", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cvsnc0tfchh2dtob91cg", + "parent": "mig_cvsn9ad1cltn5mtppc90", + "schema": "public", + "startedAt": "2025-04-11T20:05:24.469571Z" +} diff --git a/apps/api/.xata/migrations/mig_cvtnv0d1cltn5mtppjhg.json b/apps/api/.xata/migrations/mig_cvtnv0d1cltn5mtppjhg.json new file mode 100644 index 00000000..a68dbe22 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cvtnv0d1cltn5mtppjhg.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cvtnv0d1cltn5mtppjhg", + "operations": [ + { + "add_column": { + "table": "api_keys", + "column": { + "name": "enabled", + "type": "bool", + "comment": "", + "default": "'true'" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cvtnv0d1cltn5mtppjhg", + "parent": "sql_8b4842daf1e1a9", + "schema": "public", + "startedAt": "2025-04-13T09:10:25.536065Z" +} diff --git a/apps/api/.xata/migrations/mig_cvtpkbno1tkgc98ji5h0.json b/apps/api/.xata/migrations/mig_cvtpkbno1tkgc98ji5h0.json new file mode 100644 index 00000000..e742f176 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cvtpkbno1tkgc98ji5h0.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cvtpkbno1tkgc98ji5h0", + "operations": [ + { + "add_column": { + "up": "''", + "table": "api_keys", + "column": { + "name": "name", + "type": "text", + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cvtpkbno1tkgc98ji5h0", + "parent": "mig_cvtnv0d1cltn5mtppjhg", + "schema": "public", + "startedAt": "2025-04-13T11:04:14.578022Z" +} diff --git a/apps/api/.xata/migrations/mig_cvtpku7o1tkgc98ji5j0.json b/apps/api/.xata/migrations/mig_cvtpku7o1tkgc98ji5j0.json new file mode 100644 index 00000000..f65e0d71 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cvtpku7o1tkgc98ji5j0.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cvtpku7o1tkgc98ji5j0", + "operations": [ + { + "alter_column": { + "up": "\"name\"", + "down": "\"name\"", + "table": "api_keys", + "column": "name", + "unique": { + "name": "api_keys_name_unique" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cvtpku7o1tkgc98ji5j0", + "parent": "mig_cvtpkbno1tkgc98ji5h0", + "schema": "public", + "startedAt": "2025-04-13T11:05:29.131622Z" +} diff --git a/apps/api/.xata/migrations/mig_cvu23dtfchh2dtob9esg.json b/apps/api/.xata/migrations/mig_cvu23dtfchh2dtob9esg.json new file mode 100644 index 00000000..aed60ea8 --- /dev/null +++ b/apps/api/.xata/migrations/mig_cvu23dtfchh2dtob9esg.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_cvu23dtfchh2dtob9esg", + "operations": [ + { + "add_column": { + "table": "scrobbles", + "column": { + "name": "timestamp", + "type": "timestamptz", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_cvu23dtfchh2dtob9esg", + "parent": "mig_cvtpku7o1tkgc98ji5j0", + "schema": "public", + "startedAt": "2025-04-13T20:42:32.054392Z" +} diff --git a/apps/api/.xata/migrations/mig_d0h07rqdo80pli9qntig.json b/apps/api/.xata/migrations/mig_d0h07rqdo80pli9qntig.json new file mode 100644 index 00000000..4ad6cf04 --- /dev/null +++ b/apps/api/.xata/migrations/mig_d0h07rqdo80pli9qntig.json @@ -0,0 +1,21 @@ +{ + "done": true, + "migration": { + "name": "mig_d0h07rqdo80pli9qntig", + "operations": [ + { + "drop_constraint": { + "up": "\"spotify_link\"", + "down": "\"spotify_link\"", + "name": "tracks_spotify_link_unique", + "table": "tracks" + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_d0h07rqdo80pli9qntig", + "parent": "mig_cvu23dtfchh2dtob9esg", + "schema": "public", + "startedAt": "2025-05-12T14:21:36.910039Z" +} diff --git a/apps/api/.xata/migrations/mig_d0mcdj2r9e9qaqkp2jj0.json b/apps/api/.xata/migrations/mig_d0mcdj2r9e9qaqkp2jj0.json new file mode 100644 index 00000000..0f4dbb54 --- /dev/null +++ b/apps/api/.xata/migrations/mig_d0mcdj2r9e9qaqkp2jj0.json @@ -0,0 +1,57 @@ +{ + "done": true, + "migration": { + "name": "mig_d0mcdj2r9e9qaqkp2jj0", + "operations": [ + { + "create_table": { + "name": "webscrobblers", + "columns": [ + { + "name": "xata_createdat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_updatedat", + "type": "timestamptz", + "default": "now()" + }, + { + "name": "xata_id", + "type": "text", + "check": { + "name": "webscrobblers_xata_id_length_xata_id", + "constraint": "length(\"xata_id\") < 256" + }, + "unique": true, + "default": "'rec_' || xata_private.xid()" + }, + { + "name": "xata_version", + "type": "integer", + "default": "0" + } + ] + } + }, + { + "sql": { + "up": "ALTER TABLE \"webscrobblers\" REPLICA IDENTITY FULL", + "onComplete": true + } + }, + { + "sql": { + "up": "CREATE TRIGGER xata_maintain_metadata_trigger_pgroll\n BEFORE INSERT OR UPDATE\n ON \"webscrobblers\"\n FOR EACH ROW\n EXECUTE FUNCTION xata_private.maintain_metadata_trigger_pgroll()", + "onComplete": true + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_d0mcdj2r9e9qaqkp2jj0", + "parent": "mig_d0h07rqdo80pli9qntig", + "schema": "public", + "startedAt": "2025-05-20T18:15:40.809155Z" +} diff --git a/apps/api/.xata/migrations/mig_d0mcgrir9e9qaqkp2jl0.json b/apps/api/.xata/migrations/mig_d0mcgrir9e9qaqkp2jl0.json new file mode 100644 index 00000000..49be88c5 --- /dev/null +++ b/apps/api/.xata/migrations/mig_d0mcgrir9e9qaqkp2jl0.json @@ -0,0 +1,30 @@ +{ + "done": true, + "migration": { + "name": "mig_d0mcgrir9e9qaqkp2jl0", + "operations": [ + { + "add_column": { + "up": "''", + "table": "webscrobblers", + "column": { + "name": "user_id", + "type": "text", + "comment": "{\"xata.link\":\"users\"}", + "references": { + "name": "user_id_link", + "table": "users", + "column": "xata_id", + "on_delete": "CASCADE" + } + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_d0mcgrir9e9qaqkp2jl0", + "parent": "mig_d0mcdj2r9e9qaqkp2jj0", + "schema": "public", + "startedAt": "2025-05-20T18:22:39.412559Z" +} diff --git a/apps/api/.xata/migrations/mig_d0mchpiunsp1bris7p90.json b/apps/api/.xata/migrations/mig_d0mchpiunsp1bris7p90.json new file mode 100644 index 00000000..756fe161 --- /dev/null +++ b/apps/api/.xata/migrations/mig_d0mchpiunsp1bris7p90.json @@ -0,0 +1,25 @@ +{ + "done": true, + "migration": { + "name": "mig_d0mchpiunsp1bris7p90", + "operations": [ + { + "add_column": { + "up": "''", + "table": "webscrobblers", + "column": { + "name": "uuid", + "type": "text", + "unique": true, + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_d0mchpiunsp1bris7p90", + "parent": "mig_d0mcgrir9e9qaqkp2jl0", + "schema": "public", + "startedAt": "2025-05-20T18:24:38.56302Z" +} diff --git a/apps/api/.xata/migrations/mig_d0mciaido80pli9qp7r0.json b/apps/api/.xata/migrations/mig_d0mciaido80pli9qp7r0.json new file mode 100644 index 00000000..c9c9db96 --- /dev/null +++ b/apps/api/.xata/migrations/mig_d0mciaido80pli9qp7r0.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_d0mciaido80pli9qp7r0", + "operations": [ + { + "add_column": { + "up": "''", + "table": "webscrobblers", + "column": { + "name": "name", + "type": "text", + "comment": "" + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_d0mciaido80pli9qp7r0", + "parent": "mig_d0mchpiunsp1bris7p90", + "schema": "public", + "startedAt": "2025-05-20T18:25:47.136272Z" +} diff --git a/apps/api/.xata/migrations/mig_d0mcigar9e9qaqkp2jo0.json b/apps/api/.xata/migrations/mig_d0mcigar9e9qaqkp2jo0.json new file mode 100644 index 00000000..7ed08a68 --- /dev/null +++ b/apps/api/.xata/migrations/mig_d0mcigar9e9qaqkp2jo0.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_d0mcigar9e9qaqkp2jo0", + "operations": [ + { + "add_column": { + "table": "webscrobblers", + "column": { + "name": "description", + "type": "text", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_d0mcigar9e9qaqkp2jo0", + "parent": "mig_d0mciaido80pli9qp7r0", + "schema": "public", + "startedAt": "2025-05-20T18:26:10.73522Z" +} diff --git a/apps/api/.xata/migrations/mig_d0mcirqr9e9qaqkp2jp0.json b/apps/api/.xata/migrations/mig_d0mcirqr9e9qaqkp2jp0.json new file mode 100644 index 00000000..912098b3 --- /dev/null +++ b/apps/api/.xata/migrations/mig_d0mcirqr9e9qaqkp2jp0.json @@ -0,0 +1,25 @@ +{ + "done": true, + "migration": { + "name": "mig_d0mcirqr9e9qaqkp2jp0", + "operations": [ + { + "add_column": { + "table": "webscrobblers", + "column": { + "name": "enabled", + "type": "bool", + "comment": "", + "default": "'true'", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_d0mcirqr9e9qaqkp2jp0", + "parent": "mig_d0mcigar9e9qaqkp2jo0", + "schema": "public", + "startedAt": "2025-05-20T18:26:55.485501Z" +} diff --git a/apps/api/.xata/migrations/mig_d0md042r9e9qaqkp2jug.json b/apps/api/.xata/migrations/mig_d0md042r9e9qaqkp2jug.json new file mode 100644 index 00000000..301fd95d --- /dev/null +++ b/apps/api/.xata/migrations/mig_d0md042r9e9qaqkp2jug.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_d0md042r9e9qaqkp2jug", + "operations": [ + { + "add_column": { + "table": "artists", + "column": { + "name": "lastfm_link", + "type": "text", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_d0md042r9e9qaqkp2jug", + "parent": "mig_d0mcirqr9e9qaqkp2jp0", + "schema": "public", + "startedAt": "2025-05-20T18:55:13.383196Z" +} diff --git a/apps/api/.xata/migrations/mig_d0md0k2r9e9qaqkp2jvg.json b/apps/api/.xata/migrations/mig_d0md0k2r9e9qaqkp2jvg.json new file mode 100644 index 00000000..bc094eda --- /dev/null +++ b/apps/api/.xata/migrations/mig_d0md0k2r9e9qaqkp2jvg.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_d0md0k2r9e9qaqkp2jvg", + "operations": [ + { + "add_column": { + "table": "tracks", + "column": { + "name": "lastfm_link", + "type": "text", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_d0md0k2r9e9qaqkp2jvg", + "parent": "mig_d0md042r9e9qaqkp2jug", + "schema": "public", + "startedAt": "2025-05-20T18:56:17.521958Z" +} diff --git a/apps/api/.xata/migrations/mig_d0md0vido80pli9qp7t0.json b/apps/api/.xata/migrations/mig_d0md0vido80pli9qp7t0.json new file mode 100644 index 00000000..27510f1e --- /dev/null +++ b/apps/api/.xata/migrations/mig_d0md0vido80pli9qp7t0.json @@ -0,0 +1,24 @@ +{ + "done": true, + "migration": { + "name": "mig_d0md0vido80pli9qp7t0", + "operations": [ + { + "add_column": { + "table": "albums", + "column": { + "name": "lasstfm_link", + "type": "text", + "comment": "", + "nullable": true + } + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_d0md0vido80pli9qp7t0", + "parent": "mig_d0md0k2r9e9qaqkp2jvg", + "schema": "public", + "startedAt": "2025-05-20T18:57:02.336214Z" +} diff --git a/apps/api/.xata/migrations/mig_d0md192r9e9qaqkp2k0g.json b/apps/api/.xata/migrations/mig_d0md192r9e9qaqkp2k0g.json new file mode 100644 index 00000000..ae2668b9 --- /dev/null +++ b/apps/api/.xata/migrations/mig_d0md192r9e9qaqkp2k0g.json @@ -0,0 +1,20 @@ +{ + "done": true, + "migration": { + "name": "mig_d0md192r9e9qaqkp2k0g", + "operations": [ + { + "alter_column": { + "name": "lastfm_link", + "table": "albums", + "column": "lasstfm_link" + } + } + ] + }, + "migrationType": "pgroll", + "name": "mig_d0md192r9e9qaqkp2k0g", + "parent": "mig_d0md0vido80pli9qp7t0", + "schema": "public", + "startedAt": "2025-05-20T18:57:41.029826Z" +} diff --git a/apps/api/.xata/migrations/sql_525dccb0e69e3a.json b/apps/api/.xata/migrations/sql_525dccb0e69e3a.json new file mode 100644 index 00000000..60e8f6aa --- /dev/null +++ b/apps/api/.xata/migrations/sql_525dccb0e69e3a.json @@ -0,0 +1,18 @@ +{ + "done": true, + "migration": { + "name": "sql_525dccb0e69e3a", + "operations": [ + { + "sql": { + "up": "CREATE INDEX idx_tracks_lower_artist ON tracks USING btree (lower(artist))" + } + } + ] + }, + "migrationType": "inferred", + "name": "sql_525dccb0e69e3a", + "parent": "sql_58928c5fa822f6", + "schema": "public", + "startedAt": "2025-04-12T15:29:22.222122Z" +} diff --git a/apps/api/.xata/migrations/sql_58928c5fa822f6.json b/apps/api/.xata/migrations/sql_58928c5fa822f6.json new file mode 100644 index 00000000..dffef927 --- /dev/null +++ b/apps/api/.xata/migrations/sql_58928c5fa822f6.json @@ -0,0 +1,18 @@ +{ + "done": true, + "migration": { + "name": "sql_58928c5fa822f6", + "operations": [ + { + "sql": { + "up": "CREATE INDEX idx_tracks_lower_title ON tracks USING btree (lower(title))" + } + } + ] + }, + "migrationType": "inferred", + "name": "sql_58928c5fa822f6", + "parent": "mig_cvsnc0tfchh2dtob91cg", + "schema": "public", + "startedAt": "2025-04-12T15:28:47.092727Z" +} diff --git a/apps/api/.xata/migrations/sql_7fbe41bfacc536.json b/apps/api/.xata/migrations/sql_7fbe41bfacc536.json new file mode 100644 index 00000000..76bc7e27 --- /dev/null +++ b/apps/api/.xata/migrations/sql_7fbe41bfacc536.json @@ -0,0 +1,18 @@ +{ + "done": true, + "migration": { + "name": "sql_7fbe41bfacc536", + "operations": [ + { + "sql": { + "up": "CREATE UNIQUE INDEX IF NOT EXISTS user_playlists_unique_index ON user_playlists USING btree (user_id, playlist_id)" + } + } + ] + }, + "migrationType": "inferred", + "name": "sql_7fbe41bfacc536", + "parent": "mig_cv55o952t0po8jv9tklg", + "schema": "public", + "startedAt": "2025-03-07T04:52:51.842079Z" +} diff --git a/apps/api/.xata/migrations/sql_8b4842daf1e1a9.json b/apps/api/.xata/migrations/sql_8b4842daf1e1a9.json new file mode 100644 index 00000000..e9b8e2c1 --- /dev/null +++ b/apps/api/.xata/migrations/sql_8b4842daf1e1a9.json @@ -0,0 +1,18 @@ +{ + "done": true, + "migration": { + "name": "sql_8b4842daf1e1a9", + "operations": [ + { + "sql": { + "up": "CREATE INDEX idx_tracks_lower_album_artist ON tracks USING btree (lower(album_artist))" + } + } + ] + }, + "migrationType": "inferred", + "name": "sql_8b4842daf1e1a9", + "parent": "sql_525dccb0e69e3a", + "schema": "public", + "startedAt": "2025-04-12T15:29:33.3105Z" +} diff --git a/rockskyapi/rocksky-app-proxy/.xata/version/compatibility.json b/apps/api/.xata/version/compatibility.json similarity index 100% rename from rockskyapi/rocksky-app-proxy/.xata/version/compatibility.json rename to apps/api/.xata/version/compatibility.json diff --git a/apps/api/.xatarc b/apps/api/.xatarc new file mode 100644 index 00000000..f326bb44 --- /dev/null +++ b/apps/api/.xatarc @@ -0,0 +1,6 @@ +{ + "databaseURL": "https://Tsiry-Sandratraina-s-workspace-b1ficn.us-east-1.xata.sh/db/rocksky", + "codegen": { + "output": "src/xata.ts" + } +} \ No newline at end of file diff --git a/apps/api/README.md b/apps/api/README.md new file mode 100644 index 00000000..2aedc3bb --- /dev/null +++ b/apps/api/README.md @@ -0,0 +1,25 @@ +# Cloudflare Workers OpenAPI 3.1 + +This is a Cloudflare Worker with OpenAPI 3.1 using [chanfana](https://github.com/cloudflare/chanfana) and [Hono](https://github.com/honojs/hono). + +This is an example project made to be used as a quick start into building OpenAPI compliant Workers that generates the +`openapi.json` schema automatically from code and validates the incoming request to the defined parameters or request body. + +## Get started + +1. Sign up for [Cloudflare Workers](https://workers.dev). The free tier is more than enough for most use cases. +2. Clone this project and install dependencies with `npm install` +3. Run `wrangler login` to login to your Cloudflare account in wrangler +4. Run `wrangler deploy` to publish the API to Cloudflare Workers + +## Project structure + +1. Your main router is defined in `src/index.ts`. +2. Each endpoint has its own file in `src/endpoints/`. +3. For more information read the [chanfana documentation](https://chanfana.pages.dev/) and [Hono documentation](https://hono.dev/docs). + +## Development + +1. Run `wrangler dev` to start a local instance of the API. +2. Open `http://localhost:8787/` in your browser to see the Swagger interface where you can try the endpoints. +3. Changes made in the `src/` folder will automatically trigger the server to reload, you only need to refresh the Swagger interface. diff --git a/apps/api/bruno/rocksky/actor/Get User's Albums.bru b/apps/api/bruno/rocksky/actor/Get User's Albums.bru new file mode 100644 index 00000000..52af062e --- /dev/null +++ b/apps/api/bruno/rocksky/actor/Get User's Albums.bru @@ -0,0 +1,15 @@ +meta { + name: Get User's Albums + type: http + seq: 1 +} + +get { + url: {{url}}/xrpc/app.rocksky.actor.getActorAlbums?did={{did}} + body: none + auth: inherit +} + +params:query { + did: {{did}} +} diff --git a/apps/api/bruno/rocksky/actor/Get User's Artists.bru b/apps/api/bruno/rocksky/actor/Get User's Artists.bru new file mode 100644 index 00000000..bf0f9255 --- /dev/null +++ b/apps/api/bruno/rocksky/actor/Get User's Artists.bru @@ -0,0 +1,15 @@ +meta { + name: Get User's Artists + type: http + seq: 2 +} + +get { + url: {{url}}/xrpc/app.rocksky.actor.getActorArtists?did={{did}} + body: none + auth: inherit +} + +params:query { + did: {{did}} +} diff --git a/apps/api/bruno/rocksky/actor/Get User's Loved Songs.bru b/apps/api/bruno/rocksky/actor/Get User's Loved Songs.bru new file mode 100644 index 00000000..f676ae30 --- /dev/null +++ b/apps/api/bruno/rocksky/actor/Get User's Loved Songs.bru @@ -0,0 +1,15 @@ +meta { + name: Get User's Loved Songs + type: http + seq: 3 +} + +get { + url: {{url}}/xrpc/app.rocksky.actor.getActorLovedSongs?did={{did}} + body: none + auth: inherit +} + +params:query { + did: {{did}} +} diff --git a/apps/api/bruno/rocksky/actor/Get User's Playlists.bru b/apps/api/bruno/rocksky/actor/Get User's Playlists.bru new file mode 100644 index 00000000..969e0cb5 --- /dev/null +++ b/apps/api/bruno/rocksky/actor/Get User's Playlists.bru @@ -0,0 +1,15 @@ +meta { + name: Get User's Playlists + type: http + seq: 4 +} + +get { + url: {{url}}/xrpc/app.rocksky.actor.getActorPlaylists?did={{did}} + body: none + auth: inherit +} + +params:query { + did: {{did}} +} diff --git a/apps/api/bruno/rocksky/actor/Get User's Profile.bru b/apps/api/bruno/rocksky/actor/Get User's Profile.bru new file mode 100644 index 00000000..aad12089 --- /dev/null +++ b/apps/api/bruno/rocksky/actor/Get User's Profile.bru @@ -0,0 +1,15 @@ +meta { + name: Get User's Profile + type: http + seq: 7 +} + +get { + url: {{url}}/xrpc/app.rocksky.actor.getProfile?did={{did}} + body: none + auth: inherit +} + +params:query { + did: {{did}} +} diff --git a/apps/api/bruno/rocksky/actor/Get User's Scrobbles.bru b/apps/api/bruno/rocksky/actor/Get User's Scrobbles.bru new file mode 100644 index 00000000..67b1f97c --- /dev/null +++ b/apps/api/bruno/rocksky/actor/Get User's Scrobbles.bru @@ -0,0 +1,15 @@ +meta { + name: Get User's Scrobbles + type: http + seq: 5 +} + +get { + url: {{url}}/xrpc/app.rocksky.actor.getActorScrobbles?did={{did}} + body: none + auth: inherit +} + +params:query { + did: {{did}} +} diff --git a/apps/api/bruno/rocksky/actor/Get User's Songs.bru b/apps/api/bruno/rocksky/actor/Get User's Songs.bru new file mode 100644 index 00000000..8c2379e1 --- /dev/null +++ b/apps/api/bruno/rocksky/actor/Get User's Songs.bru @@ -0,0 +1,15 @@ +meta { + name: Get User's Songs + type: http + seq: 6 +} + +get { + url: {{url}}/xrpc/app.rocksky.actor.getActorSongs?did={{did}} + body: none + auth: inherit +} + +params:query { + did: {{did}} +} diff --git a/apps/api/bruno/rocksky/actor/folder.bru b/apps/api/bruno/rocksky/actor/folder.bru new file mode 100644 index 00000000..5534227c --- /dev/null +++ b/apps/api/bruno/rocksky/actor/folder.bru @@ -0,0 +1,8 @@ +meta { + name: actor + seq: 1 +} + +auth { + mode: inherit +} diff --git a/apps/api/bruno/rocksky/album/Get Album's Tracks.bru b/apps/api/bruno/rocksky/album/Get Album's Tracks.bru new file mode 100644 index 00000000..848e89f5 --- /dev/null +++ b/apps/api/bruno/rocksky/album/Get Album's Tracks.bru @@ -0,0 +1,15 @@ +meta { + name: Get Album's Tracks + type: http + seq: 3 +} + +get { + url: {{url}}/xrpc/app.rocksky.album.getAlbumTracks?uri=at://did:plc:7vdlgi2bflelz7mmuxoqjfcr/app.rocksky.album/3lhtdpslp4c2e + body: none + auth: inherit +} + +params:query { + uri: at://did:plc:7vdlgi2bflelz7mmuxoqjfcr/app.rocksky.album/3lhtdpslp4c2e +} diff --git a/apps/api/bruno/rocksky/album/Get Album.bru b/apps/api/bruno/rocksky/album/Get Album.bru new file mode 100644 index 00000000..199dde72 --- /dev/null +++ b/apps/api/bruno/rocksky/album/Get Album.bru @@ -0,0 +1,15 @@ +meta { + name: Get Album + type: http + seq: 1 +} + +get { + url: {{url}}/xrpc/app.rocksky.album.getAlbum?uri=at://did:plc:7vdlgi2bflelz7mmuxoqjfcr/app.rocksky.album/3lhtdpslp4c2e + body: none + auth: inherit +} + +params:query { + uri: at://did:plc:7vdlgi2bflelz7mmuxoqjfcr/app.rocksky.album/3lhtdpslp4c2e +} diff --git a/apps/api/bruno/rocksky/album/Get Albums.bru b/apps/api/bruno/rocksky/album/Get Albums.bru new file mode 100644 index 00000000..66d99541 --- /dev/null +++ b/apps/api/bruno/rocksky/album/Get Albums.bru @@ -0,0 +1,11 @@ +meta { + name: Get Albums + type: http + seq: 2 +} + +get { + url: {{url}}/xrpc/app.rocksky.album.getAlbums + body: none + auth: inherit +} diff --git a/apps/api/bruno/rocksky/album/folder.bru b/apps/api/bruno/rocksky/album/folder.bru new file mode 100644 index 00000000..3732a006 --- /dev/null +++ b/apps/api/bruno/rocksky/album/folder.bru @@ -0,0 +1,8 @@ +meta { + name: album + seq: 2 +} + +auth { + mode: inherit +} diff --git a/apps/api/bruno/rocksky/apikey/Create ApiKey.bru b/apps/api/bruno/rocksky/apikey/Create ApiKey.bru new file mode 100644 index 00000000..2e93138e --- /dev/null +++ b/apps/api/bruno/rocksky/apikey/Create ApiKey.bru @@ -0,0 +1,17 @@ +meta { + name: Create ApiKey + type: http + seq: 1 +} + +post { + url: {{url}}/xrpc/app.rocksky.apikey.createApikey + body: json + auth: inherit +} + +body:json { + { + "name": "demo" + } +} diff --git a/apps/api/bruno/rocksky/apikey/Get API Keys.bru b/apps/api/bruno/rocksky/apikey/Get API Keys.bru new file mode 100644 index 00000000..053ef495 --- /dev/null +++ b/apps/api/bruno/rocksky/apikey/Get API Keys.bru @@ -0,0 +1,11 @@ +meta { + name: Get API Keys + type: http + seq: 2 +} + +get { + url: {{url}}/xrpc/app.rocksky.apikey.getApikeys + body: none + auth: inherit +} diff --git a/apps/api/bruno/rocksky/apikey/Remove API Key.bru b/apps/api/bruno/rocksky/apikey/Remove API Key.bru new file mode 100644 index 00000000..1736d464 --- /dev/null +++ b/apps/api/bruno/rocksky/apikey/Remove API Key.bru @@ -0,0 +1,15 @@ +meta { + name: Remove API Key + type: http + seq: 3 +} + +post { + url: {{url}}/xrpc/app.rocksky.apikey.removeApikey?id=123 + body: none + auth: inherit +} + +params:query { + id: 123 +} diff --git a/apps/api/bruno/rocksky/apikey/Update API Key.bru b/apps/api/bruno/rocksky/apikey/Update API Key.bru new file mode 100644 index 00000000..31986a9e --- /dev/null +++ b/apps/api/bruno/rocksky/apikey/Update API Key.bru @@ -0,0 +1,18 @@ +meta { + name: Update API Key + type: http + seq: 4 +} + +post { + url: {{url}}/xrpc/app.rocksky.apikey.updateApikey + body: json + auth: inherit +} + +body:json { + { + "id": "123", + "name": "demo" + } +} diff --git a/apps/api/bruno/rocksky/apikey/folder.bru b/apps/api/bruno/rocksky/apikey/folder.bru new file mode 100644 index 00000000..99a92b89 --- /dev/null +++ b/apps/api/bruno/rocksky/apikey/folder.bru @@ -0,0 +1,8 @@ +meta { + name: apikey + seq: 3 +} + +auth { + mode: inherit +} diff --git a/apps/api/bruno/rocksky/artist/Get Artist's Albums.bru b/apps/api/bruno/rocksky/artist/Get Artist's Albums.bru new file mode 100644 index 00000000..92f8de5e --- /dev/null +++ b/apps/api/bruno/rocksky/artist/Get Artist's Albums.bru @@ -0,0 +1,15 @@ +meta { + name: Get Artist's Albums + type: http + seq: 3 +} + +get { + url: {{url}}/xrpc/app.rocksky.artist.getArtistAlbums?uri=at://did:plc:7vdlgi2bflelz7mmuxoqjfcr/app.rocksky.artist/3lpjjwleebs2i + body: none + auth: inherit +} + +params:query { + uri: at://did:plc:7vdlgi2bflelz7mmuxoqjfcr/app.rocksky.artist/3lpjjwleebs2i +} diff --git a/apps/api/bruno/rocksky/artist/Get Artist's Tracks.bru b/apps/api/bruno/rocksky/artist/Get Artist's Tracks.bru new file mode 100644 index 00000000..cdaa6310 --- /dev/null +++ b/apps/api/bruno/rocksky/artist/Get Artist's Tracks.bru @@ -0,0 +1,15 @@ +meta { + name: Get Artist's Tracks + type: http + seq: 4 +} + +get { + url: {{url}}/xrpc/app.rocksky.artist.getArtistTracks?uri=at://did:plc:7vdlgi2bflelz7mmuxoqjfcr/app.rocksky.artist/3lpjjwleebs2i + body: none + auth: inherit +} + +params:query { + uri: at://did:plc:7vdlgi2bflelz7mmuxoqjfcr/app.rocksky.artist/3lpjjwleebs2i +} diff --git a/apps/api/bruno/rocksky/artist/Get Artist.bru b/apps/api/bruno/rocksky/artist/Get Artist.bru new file mode 100644 index 00000000..847fc3ab --- /dev/null +++ b/apps/api/bruno/rocksky/artist/Get Artist.bru @@ -0,0 +1,15 @@ +meta { + name: Get Artist + type: http + seq: 1 +} + +get { + url: {{url}}/xrpc/app.rocksky.artist.getArtist?uri=at://did:plc:7vdlgi2bflelz7mmuxoqjfcr/app.rocksky.artist/3lpjjwleebs2i + body: none + auth: inherit +} + +params:query { + uri: at://did:plc:7vdlgi2bflelz7mmuxoqjfcr/app.rocksky.artist/3lpjjwleebs2i +} diff --git a/apps/api/bruno/rocksky/artist/Get Artists.bru b/apps/api/bruno/rocksky/artist/Get Artists.bru new file mode 100644 index 00000000..2f67a445 --- /dev/null +++ b/apps/api/bruno/rocksky/artist/Get Artists.bru @@ -0,0 +1,11 @@ +meta { + name: Get Artists + type: http + seq: 2 +} + +get { + url: {{url}}/xrpc/app.rocksky.artist.getArtists + body: none + auth: inherit +} diff --git a/apps/api/bruno/rocksky/artist/folder.bru b/apps/api/bruno/rocksky/artist/folder.bru new file mode 100644 index 00000000..4111f350 --- /dev/null +++ b/apps/api/bruno/rocksky/artist/folder.bru @@ -0,0 +1,8 @@ +meta { + name: artist + seq: 4 +} + +auth { + mode: inherit +} diff --git a/apps/api/bruno/rocksky/bruno.json b/apps/api/bruno/rocksky/bruno.json new file mode 100644 index 00000000..b5c25608 --- /dev/null +++ b/apps/api/bruno/rocksky/bruno.json @@ -0,0 +1,9 @@ +{ + "version": "1", + "name": "rocksky", + "type": "collection", + "ignore": [ + "node_modules", + ".git" + ] +} \ No newline at end of file diff --git a/apps/api/bruno/rocksky/charts/Get Scrobbles Per Day.bru b/apps/api/bruno/rocksky/charts/Get Scrobbles Per Day.bru new file mode 100644 index 00000000..e1816533 --- /dev/null +++ b/apps/api/bruno/rocksky/charts/Get Scrobbles Per Day.bru @@ -0,0 +1,18 @@ +meta { + name: Get Scrobbles Per Day + type: http + seq: 1 +} + +get { + url: {{url}}/xrpc/app.rocksky.charts.getScrobblesChart + body: none + auth: inherit +} + +params:query { + ~songuri: at://did:plc:7vdlgi2bflelz7mmuxoqjfcr/app.rocksky.song/3lmcerwq44c2m + ~artisturi: at://did:plc:7vdlgi2bflelz7mmuxoqjfcr/app.rocksky.artist/3liw2eggxws2l + ~did: {{did}} + ~albumuri: at://did:plc:7vdlgi2bflelz7mmuxoqjfcr/app.rocksky.album/3lhtdpslp4c2e +} diff --git a/apps/api/bruno/rocksky/charts/folder.bru b/apps/api/bruno/rocksky/charts/folder.bru new file mode 100644 index 00000000..86108270 --- /dev/null +++ b/apps/api/bruno/rocksky/charts/folder.bru @@ -0,0 +1,8 @@ +meta { + name: charts + seq: 5 +} + +auth { + mode: inherit +} diff --git a/apps/api/bruno/rocksky/collection.bru b/apps/api/bruno/rocksky/collection.bru new file mode 100644 index 00000000..cadda7c1 --- /dev/null +++ b/apps/api/bruno/rocksky/collection.bru @@ -0,0 +1,4 @@ +vars:pre-request { + url: https://api.rocksky.app + ~url: http://localhost:3004 +} diff --git a/apps/api/bruno/rocksky/dropbox/Download File.bru b/apps/api/bruno/rocksky/dropbox/Download File.bru new file mode 100644 index 00000000..4a9dc1a7 --- /dev/null +++ b/apps/api/bruno/rocksky/dropbox/Download File.bru @@ -0,0 +1,15 @@ +meta { + name: Download File + type: http + seq: 1 +} + +get { + url: {{url}}/xrpc/app.rocksky.dropbox.downloadFile?fileId=123 + body: none + auth: inherit +} + +params:query { + fileId: 123 +} diff --git a/apps/api/bruno/rocksky/dropbox/Get Files.bru b/apps/api/bruno/rocksky/dropbox/Get Files.bru new file mode 100644 index 00000000..64543726 --- /dev/null +++ b/apps/api/bruno/rocksky/dropbox/Get Files.bru @@ -0,0 +1,11 @@ +meta { + name: Get Files + type: http + seq: 2 +} + +get { + url: {{url}}/xrpc/app.rocksky.dropbox.getFiles + body: none + auth: inherit +} diff --git a/apps/api/bruno/rocksky/dropbox/Get Metadata.bru b/apps/api/bruno/rocksky/dropbox/Get Metadata.bru new file mode 100644 index 00000000..702ca1c4 --- /dev/null +++ b/apps/api/bruno/rocksky/dropbox/Get Metadata.bru @@ -0,0 +1,15 @@ +meta { + name: Get Metadata + type: http + seq: 3 +} + +get { + url: {{url}}/xrpc/app.rocksky.dropbox.getMetadata?path=/ + body: none + auth: inherit +} + +params:query { + path: / +} diff --git a/apps/api/bruno/rocksky/dropbox/Get Temporary Link.bru b/apps/api/bruno/rocksky/dropbox/Get Temporary Link.bru new file mode 100644 index 00000000..3aa5f39f --- /dev/null +++ b/apps/api/bruno/rocksky/dropbox/Get Temporary Link.bru @@ -0,0 +1,15 @@ +meta { + name: Get Temporary Link + type: http + seq: 4 +} + +get { + url: {{url}}/xrpc/app.rocksky.dropbox.getTemporaryLink?path=/ + body: none + auth: inherit +} + +params:query { + path: / +} diff --git a/apps/api/bruno/rocksky/dropbox/folder.bru b/apps/api/bruno/rocksky/dropbox/folder.bru new file mode 100644 index 00000000..1336f396 --- /dev/null +++ b/apps/api/bruno/rocksky/dropbox/folder.bru @@ -0,0 +1,8 @@ +meta { + name: dropbox + seq: 6 +} + +auth { + mode: inherit +} diff --git a/apps/api/bruno/rocksky/environments/local.bru b/apps/api/bruno/rocksky/environments/local.bru new file mode 100644 index 00000000..96fa9e77 --- /dev/null +++ b/apps/api/bruno/rocksky/environments/local.bru @@ -0,0 +1,3 @@ +vars { + url: http://localhost:3004 +} diff --git a/apps/api/bruno/rocksky/environments/prod.bru b/apps/api/bruno/rocksky/environments/prod.bru new file mode 100644 index 00000000..b30c1e5d --- /dev/null +++ b/apps/api/bruno/rocksky/environments/prod.bru @@ -0,0 +1,4 @@ +vars { + url: https://api.rocksky.app + did: tsiry-sandratraina.com +} diff --git a/apps/api/bruno/rocksky/feed/Get Now Playings.bru b/apps/api/bruno/rocksky/feed/Get Now Playings.bru new file mode 100644 index 00000000..392d0271 --- /dev/null +++ b/apps/api/bruno/rocksky/feed/Get Now Playings.bru @@ -0,0 +1,11 @@ +meta { + name: Get Now Playings + type: http + seq: 1 +} + +get { + url: {{url}}/xrpc/app.rocksky.feed.getNowPlayings + body: none + auth: inherit +} diff --git a/apps/api/bruno/rocksky/feed/Search.bru b/apps/api/bruno/rocksky/feed/Search.bru new file mode 100644 index 00000000..faef196f --- /dev/null +++ b/apps/api/bruno/rocksky/feed/Search.bru @@ -0,0 +1,15 @@ +meta { + name: Search + type: http + seq: 2 +} + +get { + url: {{url}}/xrpc/app.rocksky.feed.search?query=linkin park + body: none + auth: inherit +} + +params:query { + query: linkin park +} diff --git a/apps/api/bruno/rocksky/feed/folder.bru b/apps/api/bruno/rocksky/feed/folder.bru new file mode 100644 index 00000000..da33d047 --- /dev/null +++ b/apps/api/bruno/rocksky/feed/folder.bru @@ -0,0 +1,8 @@ +meta { + name: feed + seq: 7 +} + +auth { + mode: inherit +} diff --git a/apps/api/bruno/rocksky/googledrive/Download File.bru b/apps/api/bruno/rocksky/googledrive/Download File.bru new file mode 100644 index 00000000..167abee1 --- /dev/null +++ b/apps/api/bruno/rocksky/googledrive/Download File.bru @@ -0,0 +1,15 @@ +meta { + name: Download File + type: http + seq: 1 +} + +get { + url: {{url}}/xrpc/app.rocksky.googledrive.downloadFile?fileId=123 + body: none + auth: inherit +} + +params:query { + fileId: 123 +} diff --git a/apps/api/bruno/rocksky/googledrive/Get File.bru b/apps/api/bruno/rocksky/googledrive/Get File.bru new file mode 100644 index 00000000..2e86f90a --- /dev/null +++ b/apps/api/bruno/rocksky/googledrive/Get File.bru @@ -0,0 +1,15 @@ +meta { + name: Get File + type: http + seq: 3 +} + +get { + url: {{url}}/xrpc/app.rocksky.googledrive.getFile?fileId=123 + body: none + auth: inherit +} + +params:query { + fileId: 123 +} diff --git a/apps/api/bruno/rocksky/googledrive/Get Files.bru b/apps/api/bruno/rocksky/googledrive/Get Files.bru new file mode 100644 index 00000000..a031c1c0 --- /dev/null +++ b/apps/api/bruno/rocksky/googledrive/Get Files.bru @@ -0,0 +1,15 @@ +meta { + name: Get Files + type: http + seq: 2 +} + +get { + url: {{url}}/xrpc/app.rocksky.googledrive.getFiles?at=/ + body: none + auth: inherit +} + +params:query { + at: / +} diff --git a/apps/api/bruno/rocksky/googledrive/folder.bru b/apps/api/bruno/rocksky/googledrive/folder.bru new file mode 100644 index 00000000..6402f04c --- /dev/null +++ b/apps/api/bruno/rocksky/googledrive/folder.bru @@ -0,0 +1,8 @@ +meta { + name: googledrive + seq: 8 +} + +auth { + mode: inherit +} diff --git a/apps/api/bruno/rocksky/like/Dislike Shout.bru b/apps/api/bruno/rocksky/like/Dislike Shout.bru new file mode 100644 index 00000000..9c83b69c --- /dev/null +++ b/apps/api/bruno/rocksky/like/Dislike Shout.bru @@ -0,0 +1,17 @@ +meta { + name: Dislike Shout + type: http + seq: 1 +} + +post { + url: {{url}}/xrpc/app.rocksky.like.dislikeShout + body: json + auth: inherit +} + +body:json { + { + "uri": "at://123" + } +} diff --git a/apps/api/bruno/rocksky/like/Dislike Song.bru b/apps/api/bruno/rocksky/like/Dislike Song.bru new file mode 100644 index 00000000..9b54ab77 --- /dev/null +++ b/apps/api/bruno/rocksky/like/Dislike Song.bru @@ -0,0 +1,17 @@ +meta { + name: Dislike Song + type: http + seq: 2 +} + +post { + url: {{url}}/xrpc/app.rocksky.like.dislikeSong + body: json + auth: inherit +} + +body:json { + { + "uri": "at://123" + } +} diff --git a/apps/api/bruno/rocksky/like/Like Shout.bru b/apps/api/bruno/rocksky/like/Like Shout.bru new file mode 100644 index 00000000..dd50672b --- /dev/null +++ b/apps/api/bruno/rocksky/like/Like Shout.bru @@ -0,0 +1,17 @@ +meta { + name: Like Shout + type: http + seq: 4 +} + +post { + url: {{url}}/xrpc/app.rocksky.like.likeShout + body: json + auth: inherit +} + +body:json { + { + "uri": "at://123" + } +} diff --git a/apps/api/bruno/rocksky/like/Like Song.bru b/apps/api/bruno/rocksky/like/Like Song.bru new file mode 100644 index 00000000..ce0117fc --- /dev/null +++ b/apps/api/bruno/rocksky/like/Like Song.bru @@ -0,0 +1,17 @@ +meta { + name: Like Song + type: http + seq: 3 +} + +post { + url: {{url}}/xrpc/app.rocksky.like.likeSong + body: json + auth: inherit +} + +body:json { + { + "uri": "at://123" + } +} diff --git a/apps/api/bruno/rocksky/like/folder.bru b/apps/api/bruno/rocksky/like/folder.bru new file mode 100644 index 00000000..cfc56fed --- /dev/null +++ b/apps/api/bruno/rocksky/like/folder.bru @@ -0,0 +1,8 @@ +meta { + name: like + seq: 9 +} + +auth { + mode: inherit +} diff --git a/apps/api/bruno/rocksky/player/Get Currently Playing Song.bru b/apps/api/bruno/rocksky/player/Get Currently Playing Song.bru new file mode 100644 index 00000000..9e2aed5f --- /dev/null +++ b/apps/api/bruno/rocksky/player/Get Currently Playing Song.bru @@ -0,0 +1,15 @@ +meta { + name: Get Currently Playing Song + type: http + seq: 1 +} + +get { + url: {{url}}/xrpc/app.rocksky.player.getCurrentlyPlaying?did=tsiry-sandratraina.com + body: none + auth: inherit +} + +params:query { + did: tsiry-sandratraina.com +} diff --git a/apps/api/bruno/rocksky/player/Pause.bru b/apps/api/bruno/rocksky/player/Pause.bru new file mode 100644 index 00000000..f868b866 --- /dev/null +++ b/apps/api/bruno/rocksky/player/Pause.bru @@ -0,0 +1,11 @@ +meta { + name: Pause + type: http + seq: 5 +} + +post { + url: {{url}}/xrpc/app.rocksky.player.pause + body: none + auth: inherit +} diff --git a/apps/api/bruno/rocksky/player/Play Next Song.bru b/apps/api/bruno/rocksky/player/Play Next Song.bru new file mode 100644 index 00000000..b9a2a0ad --- /dev/null +++ b/apps/api/bruno/rocksky/player/Play Next Song.bru @@ -0,0 +1,11 @@ +meta { + name: Play Next Song + type: http + seq: 2 +} + +post { + url: {{url}}/xrpc/app.rocksky.player.next + body: none + auth: inherit +} diff --git a/apps/api/bruno/rocksky/player/Play Previous Song.bru b/apps/api/bruno/rocksky/player/Play Previous Song.bru new file mode 100644 index 00000000..e4d71ab5 --- /dev/null +++ b/apps/api/bruno/rocksky/player/Play Previous Song.bru @@ -0,0 +1,11 @@ +meta { + name: Play Previous Song + type: http + seq: 3 +} + +post { + url: {{url}}/xrpc/app.rocksky.player.previous + body: none + auth: inherit +} diff --git a/apps/api/bruno/rocksky/player/Play.bru b/apps/api/bruno/rocksky/player/Play.bru new file mode 100644 index 00000000..e6f8e62c --- /dev/null +++ b/apps/api/bruno/rocksky/player/Play.bru @@ -0,0 +1,11 @@ +meta { + name: Play + type: http + seq: 4 +} + +post { + url: {{url}}/xrpc/app.rocksky.player.play + body: none + auth: inherit +} diff --git a/apps/api/bruno/rocksky/player/Seek.bru b/apps/api/bruno/rocksky/player/Seek.bru new file mode 100644 index 00000000..ceb3f5ce --- /dev/null +++ b/apps/api/bruno/rocksky/player/Seek.bru @@ -0,0 +1,15 @@ +meta { + name: Seek + type: http + seq: 6 +} + +post { + url: {{url}}/xrpc/app.rocksky.player.seek?position=1 + body: none + auth: inherit +} + +params:query { + position: 1 +} diff --git a/apps/api/bruno/rocksky/player/folder.bru b/apps/api/bruno/rocksky/player/folder.bru new file mode 100644 index 00000000..f35327cc --- /dev/null +++ b/apps/api/bruno/rocksky/player/folder.bru @@ -0,0 +1,8 @@ +meta { + name: player + seq: 10 +} + +auth { + mode: inherit +} diff --git a/apps/api/bruno/rocksky/playlist/Get Playlist.bru b/apps/api/bruno/rocksky/playlist/Get Playlist.bru new file mode 100644 index 00000000..631bc6d0 --- /dev/null +++ b/apps/api/bruno/rocksky/playlist/Get Playlist.bru @@ -0,0 +1,15 @@ +meta { + name: Get Playlist + type: http + seq: 1 +} + +get { + url: {{url}}/xrpc/app.rocksky.playlist.getPlaylist?uri=at://did:plc:7vdlgi2bflelz7mmuxoqjfcr/app.rocksky.playlist/3ljwqccczak2o + body: none + auth: inherit +} + +params:query { + uri: at://did:plc:7vdlgi2bflelz7mmuxoqjfcr/app.rocksky.playlist/3ljwqccczak2o +} diff --git a/apps/api/bruno/rocksky/playlist/Get Playlists.bru b/apps/api/bruno/rocksky/playlist/Get Playlists.bru new file mode 100644 index 00000000..8971591b --- /dev/null +++ b/apps/api/bruno/rocksky/playlist/Get Playlists.bru @@ -0,0 +1,11 @@ +meta { + name: Get Playlists + type: http + seq: 2 +} + +get { + url: {{url}}/xrpc/app.rocksky.playlist.getPlaylists + body: none + auth: inherit +} diff --git a/apps/api/bruno/rocksky/playlist/folder.bru b/apps/api/bruno/rocksky/playlist/folder.bru new file mode 100644 index 00000000..e15044e3 --- /dev/null +++ b/apps/api/bruno/rocksky/playlist/folder.bru @@ -0,0 +1,8 @@ +meta { + name: playlist + seq: 11 +} + +auth { + mode: inherit +} diff --git a/apps/api/bruno/rocksky/radio/folder.bru b/apps/api/bruno/rocksky/radio/folder.bru new file mode 100644 index 00000000..a13a044f --- /dev/null +++ b/apps/api/bruno/rocksky/radio/folder.bru @@ -0,0 +1,8 @@ +meta { + name: radio + seq: 12 +} + +auth { + mode: inherit +} diff --git a/apps/api/bruno/rocksky/scrobble/Create Scrobble.bru b/apps/api/bruno/rocksky/scrobble/Create Scrobble.bru new file mode 100644 index 00000000..93b969e7 --- /dev/null +++ b/apps/api/bruno/rocksky/scrobble/Create Scrobble.bru @@ -0,0 +1,18 @@ +meta { + name: Create Scrobble + type: http + seq: 1 +} + +post { + url: {{url}}/xrpc/app.rocksky.scrobble.createScrobble + body: json + auth: inherit +} + +body:json { + { + "title": "", + "artist": "" + } +} diff --git a/apps/api/bruno/rocksky/scrobble/Get Scrobble.bru b/apps/api/bruno/rocksky/scrobble/Get Scrobble.bru new file mode 100644 index 00000000..b43ea2fc --- /dev/null +++ b/apps/api/bruno/rocksky/scrobble/Get Scrobble.bru @@ -0,0 +1,15 @@ +meta { + name: Get Scrobble + type: http + seq: 2 +} + +get { + url: {{url}}/xrpc/app.rocksky.scrobble.getScrobble?uri=at://did:plc:7vdlgi2bflelz7mmuxoqjfcr/app.rocksky.scrobble/3lr3lo2zgck2o + body: none + auth: inherit +} + +params:query { + uri: at://did:plc:7vdlgi2bflelz7mmuxoqjfcr/app.rocksky.scrobble/3lr3lo2zgck2o +} diff --git a/apps/api/bruno/rocksky/scrobble/Get Scrobbles.bru b/apps/api/bruno/rocksky/scrobble/Get Scrobbles.bru new file mode 100644 index 00000000..ee1d93fe --- /dev/null +++ b/apps/api/bruno/rocksky/scrobble/Get Scrobbles.bru @@ -0,0 +1,11 @@ +meta { + name: Get Scrobbles + type: http + seq: 3 +} + +get { + url: {{url}}/xrpc/app.rocksky.scrobble.getScrobbles + body: none + auth: inherit +} diff --git a/apps/api/bruno/rocksky/scrobble/folder.bru b/apps/api/bruno/rocksky/scrobble/folder.bru new file mode 100644 index 00000000..21e1506e --- /dev/null +++ b/apps/api/bruno/rocksky/scrobble/folder.bru @@ -0,0 +1,8 @@ +meta { + name: scrobble + seq: 13 +} + +auth { + mode: inherit +} diff --git a/apps/api/bruno/rocksky/shout/Create Shout.bru b/apps/api/bruno/rocksky/shout/Create Shout.bru new file mode 100644 index 00000000..da5429ef --- /dev/null +++ b/apps/api/bruno/rocksky/shout/Create Shout.bru @@ -0,0 +1,17 @@ +meta { + name: Create Shout + type: http + seq: 1 +} + +post { + url: {{url}}/xrpc/app.rocksky.shout.createShout + body: json + auth: inherit +} + +body:json { + { + "message": "123" + } +} diff --git a/apps/api/bruno/rocksky/shout/Get Album's Shouts.bru b/apps/api/bruno/rocksky/shout/Get Album's Shouts.bru new file mode 100644 index 00000000..c8bc7b23 --- /dev/null +++ b/apps/api/bruno/rocksky/shout/Get Album's Shouts.bru @@ -0,0 +1,15 @@ +meta { + name: Get Album's Shouts + type: http + seq: 2 +} + +get { + url: {{url}}/xrpc/app.rocksky.shout.getAlbumShouts?uri=at://did:plc:7vdlgi2bflelz7mmuxoqjfcr/app.rocksky.album/3liyeolehos2l + body: none + auth: inherit +} + +params:query { + uri: at://did:plc:7vdlgi2bflelz7mmuxoqjfcr/app.rocksky.album/3liyeolehos2l +} diff --git a/apps/api/bruno/rocksky/shout/Get Artist's Shouts.bru b/apps/api/bruno/rocksky/shout/Get Artist's Shouts.bru new file mode 100644 index 00000000..d55c4948 --- /dev/null +++ b/apps/api/bruno/rocksky/shout/Get Artist's Shouts.bru @@ -0,0 +1,15 @@ +meta { + name: Get Artist's Shouts + type: http + seq: 3 +} + +get { + url: {{url}}/xrpc/app.rocksky.shout.getArtistShouts?uri=at://did:plc:67ck67oi5mejpysgqcgl4lds/app.rocksky.artist/3llrqru22ks24 + body: none + auth: inherit +} + +params:query { + uri: at://did:plc:67ck67oi5mejpysgqcgl4lds/app.rocksky.artist/3llrqru22ks24 +} diff --git a/apps/api/bruno/rocksky/shout/Get Profile's Shouts.bru b/apps/api/bruno/rocksky/shout/Get Profile's Shouts.bru new file mode 100644 index 00000000..1a2fc4ee --- /dev/null +++ b/apps/api/bruno/rocksky/shout/Get Profile's Shouts.bru @@ -0,0 +1,15 @@ +meta { + name: Get Profile's Shouts + type: http + seq: 4 +} + +get { + url: {{url}}/xrpc/app.rocksky.shout.getProfileShouts?did=tsiry-sandratraina.com + body: none + auth: inherit +} + +params:query { + did: tsiry-sandratraina.com +} diff --git a/apps/api/bruno/rocksky/shout/Get Shout Replies.bru b/apps/api/bruno/rocksky/shout/Get Shout Replies.bru new file mode 100644 index 00000000..9ea352e7 --- /dev/null +++ b/apps/api/bruno/rocksky/shout/Get Shout Replies.bru @@ -0,0 +1,15 @@ +meta { + name: Get Shout Replies + type: http + seq: 9 +} + +get { + url: {{url}}/xrpc/app.rocksky.shout.getShoutReplies?uri=at://did:plc:qfpnj4og54vl56wngdriaxug/app.rocksky.shout/3lpzgbyy77k2o + body: none + auth: inherit +} + +params:query { + uri: at://did:plc:qfpnj4og54vl56wngdriaxug/app.rocksky.shout/3lpzgbyy77k2o +} diff --git a/apps/api/bruno/rocksky/shout/Get Track's Shouts.bru b/apps/api/bruno/rocksky/shout/Get Track's Shouts.bru new file mode 100644 index 00000000..f28a4884 --- /dev/null +++ b/apps/api/bruno/rocksky/shout/Get Track's Shouts.bru @@ -0,0 +1,15 @@ +meta { + name: Get Track's Shouts + type: http + seq: 5 +} + +get { + url: {{url}}/xrpc/app.rocksky.shout.getTrackShouts?uri=at://did:plc:7vdlgi2bflelz7mmuxoqjfcr/app.rocksky.song/3lhlhdt3htc2i + body: none + auth: inherit +} + +params:query { + uri: at://did:plc:7vdlgi2bflelz7mmuxoqjfcr/app.rocksky.song/3lhlhdt3htc2i +} diff --git a/apps/api/bruno/rocksky/shout/Remove Shout.bru b/apps/api/bruno/rocksky/shout/Remove Shout.bru new file mode 100644 index 00000000..9621783b --- /dev/null +++ b/apps/api/bruno/rocksky/shout/Remove Shout.bru @@ -0,0 +1,15 @@ +meta { + name: Remove Shout + type: http + seq: 6 +} + +post { + url: {{url}}/xrpc/app.rocksky.shout.removeShout?id=123 + body: none + auth: inherit +} + +params:query { + id: 123 +} diff --git a/apps/api/bruno/rocksky/shout/Reply Shout.bru b/apps/api/bruno/rocksky/shout/Reply Shout.bru new file mode 100644 index 00000000..ba9a5c7c --- /dev/null +++ b/apps/api/bruno/rocksky/shout/Reply Shout.bru @@ -0,0 +1,18 @@ +meta { + name: Reply Shout + type: http + seq: 7 +} + +post { + url: {{url}}/xrpc/app.rocksky.shout.replyShout + body: json + auth: inherit +} + +body:json { + { + "shoutId": "123", + "message": "test 123" + } +} diff --git a/apps/api/bruno/rocksky/shout/Report Shout.bru b/apps/api/bruno/rocksky/shout/Report Shout.bru new file mode 100644 index 00000000..82478985 --- /dev/null +++ b/apps/api/bruno/rocksky/shout/Report Shout.bru @@ -0,0 +1,18 @@ +meta { + name: Report Shout + type: http + seq: 8 +} + +post { + url: {{url}}/xrpc/app.rocksky.shout.reportShout + body: json + auth: inherit +} + +body:json { + { + "shoutId": "123", + "reason": "test 123" + } +} diff --git a/apps/api/bruno/rocksky/shout/folder.bru b/apps/api/bruno/rocksky/shout/folder.bru new file mode 100644 index 00000000..d719bbdf --- /dev/null +++ b/apps/api/bruno/rocksky/shout/folder.bru @@ -0,0 +1,8 @@ +meta { + name: shout + seq: 14 +} + +auth { + mode: inherit +} diff --git a/apps/api/bruno/rocksky/song/Get Song.bru b/apps/api/bruno/rocksky/song/Get Song.bru new file mode 100644 index 00000000..a7a951c1 --- /dev/null +++ b/apps/api/bruno/rocksky/song/Get Song.bru @@ -0,0 +1,15 @@ +meta { + name: Get Song + type: http + seq: 1 +} + +get { + url: {{url}}/xrpc/app.rocksky.song.getSong?uri=at://did:plc:7vdlgi2bflelz7mmuxoqjfcr/app.rocksky.song/3lqxn6qyus22i + body: none + auth: inherit +} + +params:query { + uri: at://did:plc:7vdlgi2bflelz7mmuxoqjfcr/app.rocksky.song/3lqxn6qyus22i +} diff --git a/apps/api/bruno/rocksky/song/Get Songs.bru b/apps/api/bruno/rocksky/song/Get Songs.bru new file mode 100644 index 00000000..c8758dcf --- /dev/null +++ b/apps/api/bruno/rocksky/song/Get Songs.bru @@ -0,0 +1,11 @@ +meta { + name: Get Songs + type: http + seq: 2 +} + +get { + url: {{url}}/xrpc/app.rocksky.song.getSongs + body: none + auth: inherit +} diff --git a/apps/api/bruno/rocksky/song/folder.bru b/apps/api/bruno/rocksky/song/folder.bru new file mode 100644 index 00000000..218ba01a --- /dev/null +++ b/apps/api/bruno/rocksky/song/folder.bru @@ -0,0 +1,8 @@ +meta { + name: song + seq: 15 +} + +auth { + mode: inherit +} diff --git a/apps/api/bruno/rocksky/spotify/Get Currently Playing Song.bru b/apps/api/bruno/rocksky/spotify/Get Currently Playing Song.bru new file mode 100644 index 00000000..a07888cf --- /dev/null +++ b/apps/api/bruno/rocksky/spotify/Get Currently Playing Song.bru @@ -0,0 +1,15 @@ +meta { + name: Get Currently Playing Song + type: http + seq: 1 +} + +get { + url: {{url}}/xrpc/app.rocksky.spotify.getCurrentlyPlaying?actor=tsiry-sandratraina.com + body: none + auth: inherit +} + +params:query { + actor: tsiry-sandratraina.com +} diff --git a/apps/api/bruno/rocksky/spotify/Pause.bru b/apps/api/bruno/rocksky/spotify/Pause.bru new file mode 100644 index 00000000..00016b59 --- /dev/null +++ b/apps/api/bruno/rocksky/spotify/Pause.bru @@ -0,0 +1,11 @@ +meta { + name: Pause + type: http + seq: 4 +} + +post { + url: {{url}}/xrpc/app.rocksky.spotify.pause + body: none + auth: inherit +} diff --git a/apps/api/bruno/rocksky/spotify/Play Next Song.bru b/apps/api/bruno/rocksky/spotify/Play Next Song.bru new file mode 100644 index 00000000..a0b04187 --- /dev/null +++ b/apps/api/bruno/rocksky/spotify/Play Next Song.bru @@ -0,0 +1,11 @@ +meta { + name: Play Next Song + type: http + seq: 2 +} + +post { + url: {{url}}/xrpc/app.rocksky.spotify.next + body: none + auth: inherit +} diff --git a/apps/api/bruno/rocksky/spotify/Play Previous Song.bru b/apps/api/bruno/rocksky/spotify/Play Previous Song.bru new file mode 100644 index 00000000..80e7188d --- /dev/null +++ b/apps/api/bruno/rocksky/spotify/Play Previous Song.bru @@ -0,0 +1,12 @@ +meta { + name: Play Previous Song + type: http + seq: 3 +} + +post { + url: {{url}}/xrpc/app.rocksky.spotify.previous + body: none + auth: bearer +} + diff --git a/apps/api/bruno/rocksky/spotify/Play.bru b/apps/api/bruno/rocksky/spotify/Play.bru new file mode 100644 index 00000000..f139a589 --- /dev/null +++ b/apps/api/bruno/rocksky/spotify/Play.bru @@ -0,0 +1,11 @@ +meta { + name: Play + type: http + seq: 5 +} + +post { + url: {{url}}/xrpc/app.rocksky.spotify.play + body: none + auth: inherit +} diff --git a/apps/api/bruno/rocksky/spotify/Seek.bru b/apps/api/bruno/rocksky/spotify/Seek.bru new file mode 100644 index 00000000..01974fd5 --- /dev/null +++ b/apps/api/bruno/rocksky/spotify/Seek.bru @@ -0,0 +1,15 @@ +meta { + name: Seek + type: http + seq: 6 +} + +post { + url: {{url}}/xrpc/app.rocksky.spotify.seek?position=1 + body: none + auth: inherit +} + +params:query { + position: 1 +} diff --git a/apps/api/bruno/rocksky/spotify/folder.bru b/apps/api/bruno/rocksky/spotify/folder.bru new file mode 100644 index 00000000..01129a63 --- /dev/null +++ b/apps/api/bruno/rocksky/spotify/folder.bru @@ -0,0 +1,8 @@ +meta { + name: spotify + seq: 16 +} + +auth { + mode: inherit +} diff --git a/apps/api/bruno/rocksky/stats/Get Stats.bru b/apps/api/bruno/rocksky/stats/Get Stats.bru new file mode 100644 index 00000000..e974d7ed --- /dev/null +++ b/apps/api/bruno/rocksky/stats/Get Stats.bru @@ -0,0 +1,15 @@ +meta { + name: Get Stats + type: http + seq: 1 +} + +get { + url: {{url}}/xrpc/app.rocksky.stats.getStats?did=tsiry-sandratraina.com + body: none + auth: inherit +} + +params:query { + did: tsiry-sandratraina.com +} diff --git a/apps/api/bruno/rocksky/stats/folder.bru b/apps/api/bruno/rocksky/stats/folder.bru new file mode 100644 index 00000000..e99b79ec --- /dev/null +++ b/apps/api/bruno/rocksky/stats/folder.bru @@ -0,0 +1,8 @@ +meta { + name: stats + seq: 17 +} + +auth { + mode: inherit +} diff --git a/apps/api/bun.lock b/apps/api/bun.lock new file mode 100644 index 00000000..e20aa538 --- /dev/null +++ b/apps/api/bun.lock @@ -0,0 +1,1505 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "cloudflare-workers-openapi", + "dependencies": { + "@atproto/api": "^0.13.31", + "@atproto/common": "^0.4.6", + "@atproto/identity": "^0.4.5", + "@atproto/lex-cli": "^0.5.6", + "@atproto/lexicon": "^0.4.5", + "@atproto/oauth-client-node": "^0.2.14", + "@atproto/sync": "^0.1.11", + "@atproto/syntax": "^0.3.1", + "@atproto/xrpc-server": "^0.7.8", + "@hono/node-server": "^1.13.8", + "@hono/node-ws": "^1.1.0", + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/auto-instrumentations-node": "^0.58.0", + "@opentelemetry/exporter-metrics-otlp-http": "^0.200.0", + "@opentelemetry/exporter-trace-otlp-http": "^0.200.0", + "@opentelemetry/resources": "^2.0.0", + "@opentelemetry/sdk-metrics": "^2.0.0", + "@opentelemetry/sdk-node": "^0.200.0", + "@opentelemetry/semantic-conventions": "^1.32.0", + "@pyroscope/nodejs": "^0.4.5", + "@xata.io/client": "^0.0.0-next.va121e4207b94bfe0a3c025fc00b247b923880930", + "assert": "^2.1.0", + "axios": "^1.7.9", + "better-sqlite3": "^11.8.1", + "chalk": "^5.4.1", + "chanfana": "^2.0.2", + "dayjs": "^1.11.13", + "dotenv": "^16.4.7", + "drizzle-orm": "^0.44.2", + "dropbox": "^10.34.0", + "effect": "^3.14.22", + "envalid": "^8.0.0", + "express": "^5.1.0", + "googleapis": "^146.0.0", + "hono": "^4.4.7", + "iron-session": "^8.0.4", + "jsonwebtoken": "^9.0.2", + "kysely": "^0.27.5", + "lodash": "^4.17.21", + "nats": "^2.29.2", + "pg": "^8.13.3", + "ramda": "^0.30.1", + "redis": "^4.7.0", + "unstorage": "^1.14.4", + "url": "^0.11.4", + "uuid": "^11.1.0", + "ws": "^8.18.1", + "zod": "^3.24.1", + }, + "devDependencies": { + "@pkl-community/pkl": "^0.28.2", + "@types/express": "^5.0.2", + "@types/lodash": "^4.17.17", + "@types/node": "^22.13.0", + "@types/ramda": "^0.30.2", + "@types/service-worker-mock": "^2.0.1", + "drizzle-kit": "^0.31.1", + "pkgroll": "^2.6.1", + "tsx": "^4.19.2", + "zx": "^8.5.4", + }, + }, + }, + "packages": { + "@asteasolutions/zod-to-openapi": ["@asteasolutions/zod-to-openapi@7.3.0", "", { "dependencies": { "openapi3-ts": "^4.1.2" }, "peerDependencies": { "zod": "^3.20.2" } }, "sha512-7tE/r1gXwMIvGnXVUdIqUhCU1RevEFC4Jk6Bussa0fk1ecbnnINkZzj1EOAJyE/M3AI25DnHT/zKQL1/FPFi8Q=="], + + "@atproto-labs/did-resolver": ["@atproto-labs/did-resolver@0.1.11", "", { "dependencies": { "@atproto-labs/fetch": "0.2.2", "@atproto-labs/pipe": "0.1.0", "@atproto-labs/simple-store": "0.1.2", "@atproto-labs/simple-store-memory": "0.1.2", "@atproto/did": "0.1.5", "zod": "^3.23.8" } }, "sha512-qXNzIX2GPQnxT1gl35nv/8ErDdc4Fj/+RlJE7oyE7JGkFAPUyuY03TvKJ79SmWFsWE8wyTXEpLuphr9Da1Vhkw=="], + + "@atproto-labs/fetch": ["@atproto-labs/fetch@0.2.2", "", { "dependencies": { "@atproto-labs/pipe": "0.1.0" } }, "sha512-QyafkedbFeVaN20DYUpnY2hcArYxjdThPXbYMqOSoZhcvkrUqaw4xDND4wZB5TBD9cq2yqe9V6mcw9P4XQKQuQ=="], + + "@atproto-labs/fetch-node": ["@atproto-labs/fetch-node@0.1.8", "", { "dependencies": { "@atproto-labs/fetch": "0.2.2", "@atproto-labs/pipe": "0.1.0", "ipaddr.js": "^2.1.0", "psl": "^1.9.0", "undici": "^6.14.1" } }, "sha512-OOTIhZNPEDDm7kaYU8iYRgzM+D5n3mP2iiBSyKuLakKTaZBL5WwYlUsJVsqX26SnUXtGEroOJEVJ6f66OcG80w=="], + + "@atproto-labs/handle-resolver": ["@atproto-labs/handle-resolver@0.1.7", "", { "dependencies": { "@atproto-labs/simple-store": "0.1.2", "@atproto-labs/simple-store-memory": "0.1.2", "@atproto/did": "0.1.5", "zod": "^3.23.8" } }, "sha512-nb4uAOgRVMp2NGVTJnor4ohqySbd1KyB5VzQLaRjMaPwH60Al057eTqiKRbeH/xD7hOBPNj1m0YjgxzvyAnWkg=="], + + "@atproto-labs/handle-resolver-node": ["@atproto-labs/handle-resolver-node@0.1.14", "", { "dependencies": { "@atproto-labs/fetch-node": "0.1.8", "@atproto-labs/handle-resolver": "0.1.7", "@atproto/did": "0.1.5" } }, "sha512-+kOf+xENdxUNrrLoIcp/L4ommIa1SHnwfHIWbxumXnacfurjMOnZhfXeiNsEguaAxDNYpqDNpKsFBtcgjffXvQ=="], + + "@atproto-labs/identity-resolver": ["@atproto-labs/identity-resolver@0.1.15", "", { "dependencies": { "@atproto-labs/did-resolver": "0.1.11", "@atproto-labs/handle-resolver": "0.1.7", "@atproto/syntax": "0.4.0" } }, "sha512-3ABob5iUDoFL85I8/pJE4wncz3148fADoxNVAdksyACxxjpH1GNhSYNyIpRpdMCJ/kjj69DM9rggumTHqnD/Xg=="], + + "@atproto-labs/pipe": ["@atproto-labs/pipe@0.1.0", "", {}, "sha512-ghOqHFyJlQVFPESzlVHjKroP0tPzbmG5Jms0dNI9yLDEfL8xp4OFPWLX4f6T8mRq69wWs4nIDM3sSsFbFqLa1w=="], + + "@atproto-labs/simple-store": ["@atproto-labs/simple-store@0.1.2", "", {}, "sha512-9vTNvyPPBs44tKVFht16wGlilW8u4wpEtKwLkWbuNEh3h9TTQ8zjVhEoGZh/v73G4Otr9JUOSIq+/5+8OZD2mQ=="], + + "@atproto-labs/simple-store-memory": ["@atproto-labs/simple-store-memory@0.1.2", "", { "dependencies": { "@atproto-labs/simple-store": "0.1.2", "lru-cache": "^10.2.0" } }, "sha512-q6wawjKKXuhUzr2MnkSlgr6zU6VimYkL8eNvLQvkroLnIDyMkoCKO4+EJ885ZD8lGwBo4pX9Lhrg9JJ+ncJI8g=="], + + "@atproto/api": ["@atproto/api@0.13.31", "", { "dependencies": { "@atproto/common-web": "^0.3.2", "@atproto/lexicon": "^0.4.5", "@atproto/syntax": "^0.3.1", "@atproto/xrpc": "^0.6.6", "await-lock": "^2.2.2", "multiformats": "^9.9.0", "tlds": "^1.234.0", "zod": "^3.23.8" } }, "sha512-i2cUQuwe+3j8rgPJj4YWRjSQeJunGqJ3IzesnvbODjjZh3IS9jB80BZ/pTe/AvNg6JCBbqeWJjWDVKeFHaiZAw=="], + + "@atproto/common": ["@atproto/common@0.4.6", "", { "dependencies": { "@atproto/common-web": "^0.3.2", "@ipld/dag-cbor": "^7.0.3", "cbor-x": "^1.5.1", "iso-datestring-validator": "^2.2.2", "multiformats": "^9.9.0", "pino": "^8.21.0" } }, "sha512-X33ZubLPrHLNur2Ln4tRP5TY0G0u/t9DyAeA5dgtTNGIXE3iJIlfiUSR0PW5s1iAvBbrrJK4BwaA2Pqsdl+RNw=="], + + "@atproto/common-web": ["@atproto/common-web@0.3.2", "", { "dependencies": { "graphemer": "^1.4.0", "multiformats": "^9.9.0", "uint8arrays": "3.0.0", "zod": "^3.23.8" } }, "sha512-Vx0JtL1/CssJbFAb0UOdvTrkbUautsDfHNOXNTcX2vyPIxH9xOameSqLLunM1hZnOQbJwyjmQCt6TV+bhnanDg=="], + + "@atproto/crypto": ["@atproto/crypto@0.4.3", "", { "dependencies": { "@noble/curves": "^1.7.0", "@noble/hashes": "^1.6.1", "uint8arrays": "3.0.0" } }, "sha512-YSSUAvkx+ldpXw97NXZWfLx/prgh5YJ2K0BCw51JCJmXSRp6KhhwvOm4J+K/s5hwpssyuDCVTXknyS4PHwaK5g=="], + + "@atproto/did": ["@atproto/did@0.1.5", "", { "dependencies": { "zod": "^3.23.8" } }, "sha512-8+1D08QdGE5TF0bB0vV8HLVrVZJeLNITpRTUVEoABNMRaUS7CoYSVb0+JNQDeJIVmqMjOL8dOjvCUDkp3gEaGQ=="], + + "@atproto/identity": ["@atproto/identity@0.4.5", "", { "dependencies": { "@atproto/common-web": "^0.3.2", "@atproto/crypto": "^0.4.3" } }, "sha512-IyW6wk+qfX+z/LmBdjatJgjSJWDTJLSCT/6yQUD/L0mkOjRdxiG7DoYIChaF3xHOPKiIuOGu/fuzhBMxVVcCcw=="], + + "@atproto/jwk": ["@atproto/jwk@0.1.4", "", { "dependencies": { "multiformats": "^9.9.0", "zod": "^3.23.8" } }, "sha512-dSRuEi0FbxL5ln6hEFHp5ZW01xbQH9yJi5odZaEYpcA6beZHf/bawlU12CQy/CDsbC3FxSqrBw7Q2t7mvdSBqw=="], + + "@atproto/jwk-jose": ["@atproto/jwk-jose@0.1.5", "", { "dependencies": { "@atproto/jwk": "0.1.4", "jose": "^5.2.0" } }, "sha512-piYZ3ohKhRiGlD6/bZCV/Ed3lIi7CVd6txbofEHik22EkYWK0nWKoEriCUSTssSylwFzeOq2r31Ut16WcJoghw=="], + + "@atproto/jwk-webcrypto": ["@atproto/jwk-webcrypto@0.1.5", "", { "dependencies": { "@atproto/jwk": "0.1.4", "@atproto/jwk-jose": "0.1.5", "zod": "^3.23.8" } }, "sha512-xsX8cJO6rBakLz8zNKenuKIbjoTeaiMi/ETOFFYGtlMlk1grdxDOe6OGpCmUDXaOiYWu3x5K5Hc4J9ooI/4nRg=="], + + "@atproto/lex-cli": ["@atproto/lex-cli@0.5.6", "", { "dependencies": { "@atproto/lexicon": "^0.4.5", "@atproto/syntax": "^0.3.1", "chalk": "^4.1.2", "commander": "^9.4.0", "prettier": "^3.2.5", "ts-morph": "^16.0.0", "yesno": "^0.4.0", "zod": "^3.23.8" }, "bin": { "lex": "dist/index.js" } }, "sha512-3XMZLoZ4PST84qj+MBC2yyg9CjR10suFt0dkWAUTnaJw5wffaBhm9reUqDAEmf+Gjxq1CAuCZ+ge7FNFd8S1/A=="], + + "@atproto/lexicon": ["@atproto/lexicon@0.4.5", "", { "dependencies": { "@atproto/common-web": "^0.3.2", "@atproto/syntax": "^0.3.1", "iso-datestring-validator": "^2.2.2", "multiformats": "^9.9.0", "zod": "^3.23.8" } }, "sha512-fljWqMGKn+XWtTprBcS3F1hGBREnQYh6qYHv2sjENucc7REms1gtmZXSerB9N6pVeHVNOnXiILdukeAcic5OEw=="], + + "@atproto/oauth-client": ["@atproto/oauth-client@0.3.13", "", { "dependencies": { "@atproto-labs/did-resolver": "0.1.11", "@atproto-labs/fetch": "0.2.2", "@atproto-labs/handle-resolver": "0.1.7", "@atproto-labs/identity-resolver": "0.1.15", "@atproto-labs/simple-store": "0.1.2", "@atproto-labs/simple-store-memory": "0.1.2", "@atproto/did": "0.1.5", "@atproto/jwk": "0.1.4", "@atproto/oauth-types": "0.2.4", "@atproto/xrpc": "0.6.12", "multiformats": "^9.9.0", "zod": "^3.23.8" } }, "sha512-PqE6hWG6bhpu5OUbccoAZjoj9LQroStuPjXqkHCsnUfQGmruzuNmzMS0myLdoWCx+NSGr4sMgUPjGzAHXSLoaQ=="], + + "@atproto/oauth-client-node": ["@atproto/oauth-client-node@0.2.14", "", { "dependencies": { "@atproto-labs/did-resolver": "0.1.11", "@atproto-labs/handle-resolver-node": "0.1.14", "@atproto-labs/simple-store": "0.1.2", "@atproto/did": "0.1.5", "@atproto/jwk": "0.1.4", "@atproto/jwk-jose": "0.1.5", "@atproto/jwk-webcrypto": "0.1.5", "@atproto/oauth-client": "0.3.13", "@atproto/oauth-types": "0.2.4" } }, "sha512-KDQWhkCqwVJtuBmqBLRo9sOL9Mw9SkFmCe1s+t6asdkfe1uMezvSTYCi5SIR+E4vwrYSIq2z6ZvWbc/XV3UwEQ=="], + + "@atproto/oauth-types": ["@atproto/oauth-types@0.2.4", "", { "dependencies": { "@atproto/jwk": "0.1.4", "zod": "^3.23.8" } }, "sha512-V2LnlXi1CSmBQWTQgDm8l4oN7xYxlftVwM7hrvYNP+Jxo3Ozfe0QLK1Wy/CH6/ZqzrBBhYvcbf4DJYTUwPA+hw=="], + + "@atproto/repo": ["@atproto/repo@0.6.2", "", { "dependencies": { "@atproto/common": "^0.4.6", "@atproto/common-web": "^0.3.2", "@atproto/crypto": "^0.4.3", "@atproto/lexicon": "^0.4.5", "@ipld/car": "^3.2.3", "@ipld/dag-cbor": "^7.0.0", "multiformats": "^9.9.0", "uint8arrays": "3.0.0", "zod": "^3.23.8" } }, "sha512-0YEWJ38Sj8SwhD8GGQ7Q6GDeZppsRae4JfNLQmtPgAddt5A4iNIK5HLdpGGlT+dC0/ElsEbQpY7mXLuP92Wbtw=="], + + "@atproto/sync": ["@atproto/sync@0.1.11", "", { "dependencies": { "@atproto/common": "^0.4.6", "@atproto/identity": "^0.4.5", "@atproto/lexicon": "^0.4.5", "@atproto/repo": "^0.6.2", "@atproto/syntax": "^0.3.1", "@atproto/xrpc-server": "^0.7.8", "multiformats": "^9.9.0", "p-queue": "^6.6.2", "ws": "^8.12.0" } }, "sha512-+Wa+7AxEdL8R7iLohyBMzMQ5tHwHkgrPt0Tu6W9HLZ/fBh2yt09vlD10SU6NifX0eC8kpA3letnxUD3nu5bDBQ=="], + + "@atproto/syntax": ["@atproto/syntax@0.3.1", "", {}, "sha512-fzW0Mg1QUOVCWUD3RgEsDt6d1OZ6DdFmbKcDdbzUfh0t4rhtRAC05KbZYmxuMPWDAiJ4BbbQ5dkAc/mNypMXkw=="], + + "@atproto/xrpc": ["@atproto/xrpc@0.6.6", "", { "dependencies": { "@atproto/lexicon": "^0.4.5", "zod": "^3.23.8" } }, "sha512-umXEYVMo9/pyIBoKmIAIi64RXDW9tSXY+wqztlQ6I2GZtjLfNZqmAWU+wADk3SxUe54mvjxxGyA4TtyGtDMfhA=="], + + "@atproto/xrpc-server": ["@atproto/xrpc-server@0.7.8", "", { "dependencies": { "@atproto/common": "^0.4.6", "@atproto/crypto": "^0.4.3", "@atproto/lexicon": "^0.4.5", "@atproto/xrpc": "^0.6.6", "cbor-x": "^1.5.1", "express": "^4.17.2", "http-errors": "^2.0.0", "mime-types": "^2.1.35", "rate-limiter-flexible": "^2.4.1", "uint8arrays": "3.0.0", "ws": "^8.12.0", "zod": "^3.23.8" } }, "sha512-0QlNPYcxI37AJLL9OffQrkFI5F5SkVKf3VvNkQFVNaOe1eqdu4lty8VVVrweA57EnnOO8W4xVlc9xgVa33Gbyg=="], + + "@cbor-extract/cbor-extract-darwin-arm64": ["@cbor-extract/cbor-extract-darwin-arm64@2.2.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-P7swiOAdF7aSi0H+tHtHtr6zrpF3aAq/W9FXx5HektRvLTM2O89xCyXF3pk7pLc7QpaY7AoaE8UowVf9QBdh3w=="], + + "@cbor-extract/cbor-extract-darwin-x64": ["@cbor-extract/cbor-extract-darwin-x64@2.2.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-1liF6fgowph0JxBbYnAS7ZlqNYLf000Qnj4KjqPNW4GViKrEql2MgZnAsExhY9LSy8dnvA4C0qHEBgPrll0z0w=="], + + "@cbor-extract/cbor-extract-linux-arm": ["@cbor-extract/cbor-extract-linux-arm@2.2.0", "", { "os": "linux", "cpu": "arm" }, "sha512-QeBcBXk964zOytiedMPQNZr7sg0TNavZeuUCD6ON4vEOU/25+pLhNN6EDIKJ9VLTKaZ7K7EaAriyYQ1NQ05s/Q=="], + + "@cbor-extract/cbor-extract-linux-arm64": ["@cbor-extract/cbor-extract-linux-arm64@2.2.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-rQvhNmDuhjTVXSPFLolmQ47/ydGOFXtbR7+wgkSY0bdOxCFept1hvg59uiLPT2fVDuJFuEy16EImo5tE2x3RsQ=="], + + "@cbor-extract/cbor-extract-linux-x64": ["@cbor-extract/cbor-extract-linux-x64@2.2.0", "", { "os": "linux", "cpu": "x64" }, "sha512-cWLAWtT3kNLHSvP4RKDzSTX9o0wvQEEAj4SKvhWuOVZxiDAeQazr9A+PSiRILK1VYMLeDml89ohxCnUNQNQNCw=="], + + "@cbor-extract/cbor-extract-win32-x64": ["@cbor-extract/cbor-extract-win32-x64@2.2.0", "", { "os": "win32", "cpu": "x64" }, "sha512-l2M+Z8DO2vbvADOBNLbbh9y5ST1RY5sqkWOg/58GkUPBYou/cuNZ68SGQ644f1CvZ8kcOxyZtw06+dxWHIoN/w=="], + + "@datadog/pprof": ["@datadog/pprof@5.7.1", "", { "dependencies": { "delay": "^5.0.0", "node-gyp-build": "<4.0", "p-limit": "^3.1.0", "pprof-format": "^2.1.0", "source-map": "^0.7.4" } }, "sha512-D5XTxsaPG36x41vZZn8hsAeC7QQDx0rv1a1Uhxo5xCXUB/9rc19+I7iCnjgJS5aH0ShXdPVOWRClo16hOSKKSw=="], + + "@drizzle-team/brocli": ["@drizzle-team/brocli@0.10.2", "", {}, "sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w=="], + + "@esbuild-kit/core-utils": ["@esbuild-kit/core-utils@3.3.2", "", { "dependencies": { "esbuild": "~0.18.20", "source-map-support": "^0.5.21" } }, "sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ=="], + + "@esbuild-kit/esm-loader": ["@esbuild-kit/esm-loader@2.6.5", "", { "dependencies": { "@esbuild-kit/core-utils": "^3.3.2", "get-tsconfig": "^4.7.0" } }, "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA=="], + + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.25.5", "", { "os": "android", "cpu": "arm" }, "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.5", "", { "os": "android", "cpu": "arm64" }, "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.25.5", "", { "os": "android", "cpu": "x64" }, "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.5", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.5", "", { "os": "linux", "cpu": "arm" }, "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.5", "", { "os": "linux", "cpu": "ia32" }, "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.5", "", { "os": "linux", "cpu": "none" }, "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.5", "", { "os": "linux", "cpu": "none" }, "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.5", "", { "os": "linux", "cpu": "none" }, "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.5", "", { "os": "linux", "cpu": "x64" }, "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw=="], + + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.5", "", { "os": "none", "cpu": "arm64" }, "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.5", "", { "os": "none", "cpu": "x64" }, "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ=="], + + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.5", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.5", "", { "os": "openbsd", "cpu": "x64" }, "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.5", "", { "os": "sunos", "cpu": "x64" }, "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.5", "", { "os": "win32", "cpu": "x64" }, "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g=="], + + "@grpc/grpc-js": ["@grpc/grpc-js@1.13.3", "", { "dependencies": { "@grpc/proto-loader": "^0.7.13", "@js-sdsl/ordered-map": "^4.4.2" } }, "sha512-FTXHdOoPbZrBjlVLHuKbDZnsTxXv2BlHF57xw6LuThXacXvtkahEPED0CKMk6obZDf65Hv4k3z62eyPNpvinIg=="], + + "@grpc/proto-loader": ["@grpc/proto-loader@0.7.14", "", { "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", "protobufjs": "^7.2.5", "yargs": "^17.7.2" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" } }, "sha512-oS0FyK8eGNBJC6aB/qsS4LOxCYQlBniNzp6W8IdjlRVRGs0FOK9dS84OV+kXGaZf8Ozeos8fbUMJUGGzSpOCzQ=="], + + "@hono/node-server": ["@hono/node-server@1.13.8", "", { "peerDependencies": { "hono": "^4" } }, "sha512-fsn8ucecsAXUoVxrUil0m13kOEq4mkX4/4QozCqmY+HpGfKl74OYSn8JcMA8GnG0ClfdRI4/ZSeG7zhFaVg+wg=="], + + "@hono/node-ws": ["@hono/node-ws@1.1.0", "", { "dependencies": { "ws": "^8.17.0" }, "peerDependencies": { "@hono/node-server": "^1.11.1", "hono": "^4.6.0" } }, "sha512-uHaz1EPguJqsUmA+Jmhdi/DTRAMs2Fvcy7qno9E48rlK3WBtyGQw4u4DKlc+o18Nh1DGz2oA1n9hCzEyhVBeLw=="], + + "@ipld/car": ["@ipld/car@3.2.4", "", { "dependencies": { "@ipld/dag-cbor": "^7.0.0", "multiformats": "^9.5.4", "varint": "^6.0.0" } }, "sha512-rezKd+jk8AsTGOoJKqzfjLJ3WVft7NZNH95f0pfPbicROvzTyvHCNy567HzSUd6gRXZ9im29z5ZEv9Hw49jSYw=="], + + "@ipld/dag-cbor": ["@ipld/dag-cbor@7.0.3", "", { "dependencies": { "cborg": "^1.6.0", "multiformats": "^9.5.4" } }, "sha512-1VVh2huHsuohdXC1bGJNE8WR72slZ9XE2T3wbBBq31dm7ZBatmKLLxrB+XAqafxfRFjv08RZmj/W/ZqaM13AuA=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="], + + "@js-sdsl/ordered-map": ["@js-sdsl/ordered-map@4.4.2", "", {}, "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw=="], + + "@noble/curves": ["@noble/curves@1.8.1", "", { "dependencies": { "@noble/hashes": "1.7.1" } }, "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ=="], + + "@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], + + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], + + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], + + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + + "@opentelemetry/api": ["@opentelemetry/api@1.9.0", "", {}, "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg=="], + + "@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.200.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-IKJBQxh91qJ+3ssRly5hYEJ8NDHu9oY/B1PXVSCWf7zytmYO9RNLB0Ox9XQ/fJ8m6gY6Q6NtBWlmXfaXt5Uc4Q=="], + + "@opentelemetry/auto-instrumentations-node": ["@opentelemetry/auto-instrumentations-node@0.58.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/instrumentation-amqplib": "^0.47.0", "@opentelemetry/instrumentation-aws-lambda": "^0.51.0", "@opentelemetry/instrumentation-aws-sdk": "^0.51.0", "@opentelemetry/instrumentation-bunyan": "^0.46.0", "@opentelemetry/instrumentation-cassandra-driver": "^0.46.0", "@opentelemetry/instrumentation-connect": "^0.44.0", "@opentelemetry/instrumentation-cucumber": "^0.15.0", "@opentelemetry/instrumentation-dataloader": "^0.17.0", "@opentelemetry/instrumentation-dns": "^0.44.0", "@opentelemetry/instrumentation-express": "^0.48.1", "@opentelemetry/instrumentation-fastify": "^0.45.0", "@opentelemetry/instrumentation-fs": "^0.20.0", "@opentelemetry/instrumentation-generic-pool": "^0.44.0", "@opentelemetry/instrumentation-graphql": "^0.48.0", "@opentelemetry/instrumentation-grpc": "^0.200.0", "@opentelemetry/instrumentation-hapi": "^0.46.0", "@opentelemetry/instrumentation-http": "^0.200.0", "@opentelemetry/instrumentation-ioredis": "^0.48.0", "@opentelemetry/instrumentation-kafkajs": "^0.9.1", "@opentelemetry/instrumentation-knex": "^0.45.0", "@opentelemetry/instrumentation-koa": "^0.48.0", "@opentelemetry/instrumentation-lru-memoizer": "^0.45.0", "@opentelemetry/instrumentation-memcached": "^0.44.0", "@opentelemetry/instrumentation-mongodb": "^0.53.0", "@opentelemetry/instrumentation-mongoose": "^0.47.0", "@opentelemetry/instrumentation-mysql": "^0.46.0", "@opentelemetry/instrumentation-mysql2": "^0.46.0", "@opentelemetry/instrumentation-nestjs-core": "^0.46.0", "@opentelemetry/instrumentation-net": "^0.44.0", "@opentelemetry/instrumentation-pg": "^0.52.0", "@opentelemetry/instrumentation-pino": "^0.47.0", "@opentelemetry/instrumentation-redis": "^0.47.0", "@opentelemetry/instrumentation-redis-4": "^0.47.0", "@opentelemetry/instrumentation-restify": "^0.46.0", "@opentelemetry/instrumentation-router": "^0.45.0", "@opentelemetry/instrumentation-runtime-node": "^0.14.0", "@opentelemetry/instrumentation-socket.io": "^0.47.0", "@opentelemetry/instrumentation-tedious": "^0.19.0", "@opentelemetry/instrumentation-undici": "^0.11.0", "@opentelemetry/instrumentation-winston": "^0.45.0", "@opentelemetry/resource-detector-alibaba-cloud": "^0.31.0", "@opentelemetry/resource-detector-aws": "^2.0.0", "@opentelemetry/resource-detector-azure": "^0.7.0", "@opentelemetry/resource-detector-container": "^0.7.0", "@opentelemetry/resource-detector-gcp": "^0.34.0", "@opentelemetry/resources": "^2.0.0", "@opentelemetry/sdk-node": "^0.200.0" }, "peerDependencies": { "@opentelemetry/api": "^1.4.1", "@opentelemetry/core": "^2.0.0" } }, "sha512-gtqPqkXp8TG6vrmbzAJUKjJm3nrCiVGgImlV1tj8lsVqpnKDCB1Kl7bCcXod36+Tq/O4rCeTDmW90dCHeuv9jQ=="], + + "@opentelemetry/context-async-hooks": ["@opentelemetry/context-async-hooks@2.0.0", "", { "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-IEkJGzK1A9v3/EHjXh3s2IiFc6L4jfK+lNgKVgUjeUJQRRhnVFMIO3TAvKwonm9O1HebCuoOt98v8bZW7oVQHA=="], + + "@opentelemetry/core": ["@opentelemetry/core@2.0.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ=="], + + "@opentelemetry/exporter-logs-otlp-grpc": ["@opentelemetry/exporter-logs-otlp-grpc@0.200.0", "", { "dependencies": { "@grpc/grpc-js": "^1.7.1", "@opentelemetry/core": "2.0.0", "@opentelemetry/otlp-exporter-base": "0.200.0", "@opentelemetry/otlp-grpc-exporter-base": "0.200.0", "@opentelemetry/otlp-transformer": "0.200.0", "@opentelemetry/sdk-logs": "0.200.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-+3MDfa5YQPGM3WXxW9kqGD85Q7s9wlEMVNhXXG7tYFLnIeaseUt9YtCeFhEDFzfEktacdFpOtXmJuNW8cHbU5A=="], + + "@opentelemetry/exporter-logs-otlp-http": ["@opentelemetry/exporter-logs-otlp-http@0.200.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.200.0", "@opentelemetry/core": "2.0.0", "@opentelemetry/otlp-exporter-base": "0.200.0", "@opentelemetry/otlp-transformer": "0.200.0", "@opentelemetry/sdk-logs": "0.200.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-KfWw49htbGGp9s8N4KI8EQ9XuqKJ0VG+yVYVYFiCYSjEV32qpQ5qZ9UZBzOZ6xRb+E16SXOSCT3RkqBVSABZ+g=="], + + "@opentelemetry/exporter-logs-otlp-proto": ["@opentelemetry/exporter-logs-otlp-proto@0.200.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.200.0", "@opentelemetry/core": "2.0.0", "@opentelemetry/otlp-exporter-base": "0.200.0", "@opentelemetry/otlp-transformer": "0.200.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/sdk-logs": "0.200.0", "@opentelemetry/sdk-trace-base": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-GmahpUU/55hxfH4TP77ChOfftADsCq/nuri73I/AVLe2s4NIglvTsaACkFVZAVmnXXyPS00Fk3x27WS3yO07zA=="], + + "@opentelemetry/exporter-metrics-otlp-grpc": ["@opentelemetry/exporter-metrics-otlp-grpc@0.200.0", "", { "dependencies": { "@grpc/grpc-js": "^1.7.1", "@opentelemetry/core": "2.0.0", "@opentelemetry/exporter-metrics-otlp-http": "0.200.0", "@opentelemetry/otlp-exporter-base": "0.200.0", "@opentelemetry/otlp-grpc-exporter-base": "0.200.0", "@opentelemetry/otlp-transformer": "0.200.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/sdk-metrics": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uHawPRvKIrhqH09GloTuYeq2BjyieYHIpiklOvxm9zhrCL2eRsnI/6g9v2BZTVtGp8tEgIa7rCQ6Ltxw6NBgew=="], + + "@opentelemetry/exporter-metrics-otlp-http": ["@opentelemetry/exporter-metrics-otlp-http@0.200.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/otlp-exporter-base": "0.200.0", "@opentelemetry/otlp-transformer": "0.200.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/sdk-metrics": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-5BiR6i8yHc9+qW7F6LqkuUnIzVNA7lt0qRxIKcKT+gq3eGUPHZ3DY29sfxI3tkvnwMgtnHDMNze5DdxW39HsAw=="], + + "@opentelemetry/exporter-metrics-otlp-proto": ["@opentelemetry/exporter-metrics-otlp-proto@0.200.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/exporter-metrics-otlp-http": "0.200.0", "@opentelemetry/otlp-exporter-base": "0.200.0", "@opentelemetry/otlp-transformer": "0.200.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/sdk-metrics": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-E+uPj0yyvz81U9pvLZp3oHtFrEzNSqKGVkIViTQY1rH3TOobeJPSpLnTVXACnCwkPR5XeTvPnK3pZ2Kni8AFMg=="], + + "@opentelemetry/exporter-prometheus": ["@opentelemetry/exporter-prometheus@0.200.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/sdk-metrics": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-ZYdlU9r0USuuYppiDyU2VFRA0kFl855ylnb3N/2aOlXrbA4PMCznen7gmPbetGQu7pz8Jbaf4fwvrDnVdQQXSw=="], + + "@opentelemetry/exporter-trace-otlp-grpc": ["@opentelemetry/exporter-trace-otlp-grpc@0.200.0", "", { "dependencies": { "@grpc/grpc-js": "^1.7.1", "@opentelemetry/core": "2.0.0", "@opentelemetry/otlp-exporter-base": "0.200.0", "@opentelemetry/otlp-grpc-exporter-base": "0.200.0", "@opentelemetry/otlp-transformer": "0.200.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/sdk-trace-base": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-hmeZrUkFl1YMsgukSuHCFPYeF9df0hHoKeHUthRKFCxiURs+GwF1VuabuHmBMZnjTbsuvNjOB+JSs37Csem/5Q=="], + + "@opentelemetry/exporter-trace-otlp-http": ["@opentelemetry/exporter-trace-otlp-http@0.200.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/otlp-exporter-base": "0.200.0", "@opentelemetry/otlp-transformer": "0.200.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/sdk-trace-base": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-Goi//m/7ZHeUedxTGVmEzH19NgqJY+Bzr6zXo1Rni1+hwqaksEyJ44gdlEMREu6dzX1DlAaH/qSykSVzdrdafA=="], + + "@opentelemetry/exporter-trace-otlp-proto": ["@opentelemetry/exporter-trace-otlp-proto@0.200.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/otlp-exporter-base": "0.200.0", "@opentelemetry/otlp-transformer": "0.200.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/sdk-trace-base": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-V9TDSD3PjK1OREw2iT9TUTzNYEVWJk4Nhodzhp9eiz4onDMYmPy3LaGbPv81yIR6dUb/hNp/SIhpiCHwFUq2Vg=="], + + "@opentelemetry/exporter-zipkin": ["@opentelemetry/exporter-zipkin@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/sdk-trace-base": "2.0.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-icxaKZ+jZL/NHXX8Aru4HGsrdhK0MLcuRXkX5G5IRmCgoRLw+Br6I/nMVozX2xjGGwV7hw2g+4Slj8K7s4HbVg=="], + + "@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.200.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.200.0", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-pmPlzfJd+vvgaZd/reMsC8RWgTXn2WY1OWT5RT42m3aOn5532TozwXNDhg1vzqJ+jnvmkREcdLr27ebJEQt0Jg=="], + + "@opentelemetry/instrumentation-amqplib": ["@opentelemetry/instrumentation-amqplib@0.47.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-bQboBxolOVDcD4l5QAwqKYpJVKQ8BW82+8tiD5uheu0hDuYgdmDziSAByc8yKS7xpkJw4AYocVP7JwSpQ1hgjg=="], + + "@opentelemetry/instrumentation-aws-lambda": ["@opentelemetry/instrumentation-aws-lambda@0.51.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0", "@types/aws-lambda": "8.10.147" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-yPtnDum6vykhxA1xZ2kKc3DGmrLdbRAkJG0HiQUcOas47j716wmtqsLCctHyXgO0NpmS/BCzbUnOxxPG6kln7A=="], + + "@opentelemetry/instrumentation-aws-sdk": ["@opentelemetry/instrumentation-aws-sdk@0.51.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/propagation-utils": "^0.31.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-NfmdJqrgJyAPGzPJk2bNl8vBn2kbDIHyTmKVNWhcQWh0VCA5aspi75Gsp5tHmLqk26VAtVtUEDZwK3nApFEtzw=="], + + "@opentelemetry/instrumentation-bunyan": ["@opentelemetry/instrumentation-bunyan@0.46.0", "", { "dependencies": { "@opentelemetry/api-logs": "^0.200.0", "@opentelemetry/instrumentation": "^0.200.0", "@types/bunyan": "1.8.11" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-7ERXBAMIVi1rtFG5odsLTLVy6IJZnLLB74fFlPstV7/ZZG04UZ8YFOYVS14jXArcPohY8HFYLbm56dIFCXYI9w=="], + + "@opentelemetry/instrumentation-cassandra-driver": ["@opentelemetry/instrumentation-cassandra-driver@0.46.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-ItT2C32afignjHQosleI/iBjzlHhF+F7tJIK9ty47/CceVNlA9oK39ss9f7o9jmnKvQfhNWffvkXdjc0afwnSQ=="], + + "@opentelemetry/instrumentation-connect": ["@opentelemetry/instrumentation-connect@0.44.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0", "@types/connect": "3.4.38" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-eChFPViU/nkHsCYSp2PCnHnxt/ZmI/N5reHcwmjXbKhEj6TRNJcjLpI+OQksP8lLu0CS9DlDosHEhknCsxLdjQ=="], + + "@opentelemetry/instrumentation-cucumber": ["@opentelemetry/instrumentation-cucumber@0.15.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-MOHDzttn5TSBqt4j3/XjBhYNH0iLQP7oX2pumIzXP7dJFTcUtaq6PVakKPtIaqBTTabOKqCJhrF240XGwWefPQ=="], + + "@opentelemetry/instrumentation-dataloader": ["@opentelemetry/instrumentation-dataloader@0.17.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-JqovxOo7a65+3A/W+eiqUv7DrDsSvsY0NemHJ4uyVrzD4bpDYofVRdnz/ehYcNerlxVIKU+HcybDmiaoj41DPw=="], + + "@opentelemetry/instrumentation-dns": ["@opentelemetry/instrumentation-dns@0.44.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-+tAFXkFPldOpIba2akqKQ1ukqHET1pZ4pqhrr5x0p+RJ+1a1pPmTt1vCyvSSr634WOY8qMSmzZps++16yxnMbA=="], + + "@opentelemetry/instrumentation-express": ["@opentelemetry/instrumentation-express@0.48.1", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-j8NYOf9DRWtchbWor/zA0poI42TpZG9tViIKA0e1lC+6MshTqSJYtgNv8Fn1sx1Wn/TRyp+5OgSXiE4LDfvpEg=="], + + "@opentelemetry/instrumentation-fastify": ["@opentelemetry/instrumentation-fastify@0.45.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-m94anTFZ6jpvK0G5fXIiq1sB0gCgY2rAL7Cg7svuOh9Roya2RIQz2E5KfCsO1kWCmnHNeTo7wIofoGN7WLPvsA=="], + + "@opentelemetry/instrumentation-fs": ["@opentelemetry/instrumentation-fs@0.20.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.200.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-30l45ovjwHb16ImCGVjKCvw5U7X1zKuYY26ii5S+goV8BZ4a/TCpBf2kQxteQjWD05Gl3fzPMZI5aScfPI6Rjw=="], + + "@opentelemetry/instrumentation-generic-pool": ["@opentelemetry/instrumentation-generic-pool@0.44.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-bY7locZDqmQLEtY2fIJbSnAbHilxfhflaEQHjevFGkaiXc9UMtOvITOy5JKHhYQISpgrvY2WGXKG7YlVyI7uMg=="], + + "@opentelemetry/instrumentation-graphql": ["@opentelemetry/instrumentation-graphql@0.48.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-w1sbf9F9bQTpIWGnKWhH1A+9N9rKxS4eM+AzczgMWp272ZM9lQv4zLTrH5NRST2ltY3nmZ72wkfFrSR0rECi0g=="], + + "@opentelemetry/instrumentation-grpc": ["@opentelemetry/instrumentation-grpc@0.200.0", "", { "dependencies": { "@opentelemetry/instrumentation": "0.200.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-iaPHlO1qb1WlGUq0oTx0rJND/BtBeTAtyEfflu2VwKDe8XZeia7UEOfiSQxnGqVSTwW5F0P1S5UzqeDJotreWQ=="], + + "@opentelemetry/instrumentation-hapi": ["@opentelemetry/instrumentation-hapi@0.46.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-573y+ZxywEcq+3+Z3KqcbV45lrVwUKvQiP9OhABVFNX8wHbtM6DPRBmYfqiUkSbIBcOEihm5qH6Gs73Xq0RBEA=="], + + "@opentelemetry/instrumentation-http": ["@opentelemetry/instrumentation-http@0.200.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/instrumentation": "0.200.0", "@opentelemetry/semantic-conventions": "^1.29.0", "forwarded-parse": "2.1.2" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-9tqGbCJikhYU68y3k9mi6yWsMyMeCcwoQuHvIXan5VvvPPQ5WIZaV6Mxu/MCVe4swRNoFs8Th+qyj0TZV5ELvw=="], + + "@opentelemetry/instrumentation-ioredis": ["@opentelemetry/instrumentation-ioredis@0.48.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/redis-common": "^0.37.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-kQhdrn/CAfJIObqbyyGtagWNxPvglJ9FwnWmsfXKodaGskJv/nyvdC9yIcgwzjbkG1pokVUROrvJ0mizqm29Tg=="], + + "@opentelemetry/instrumentation-kafkajs": ["@opentelemetry/instrumentation-kafkajs@0.9.1", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.30.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-eGl5WKBqd0unOKm7PJKjEa1G+ac9nvpDjyv870nUYuSnUkyDc/Fag5keddIjHixTJwRp3FmyP7n+AadAjh52Vw=="], + + "@opentelemetry/instrumentation-knex": ["@opentelemetry/instrumentation-knex@0.45.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-2kkyTDUzK/3G3jxTc+NqHSdgi1Mjw2irZ98T/cSyNdlbsnDOMSTHjbm0AxJCV4QYQ4cKW7a8W/BBgxDGlu+mXQ=="], + + "@opentelemetry/instrumentation-koa": ["@opentelemetry/instrumentation-koa@0.48.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-LV63v3pxFpjKC0IJO+y5nsGdcH+9Y8Wnn0fhu673XZ5auxqJk2t4nIHuSmls08oRKaX+5q1e+h70XmP/45NJsw=="], + + "@opentelemetry/instrumentation-lru-memoizer": ["@opentelemetry/instrumentation-lru-memoizer@0.45.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-W2MNx7hPtvSIgEFxFrqdBykdfN0UrShCbJxvMU9fwgqbOdxIrcubPt0i1vmy3Ap6QwSi+HmsRNQD2w3ucbLG3A=="], + + "@opentelemetry/instrumentation-memcached": ["@opentelemetry/instrumentation-memcached@0.44.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0", "@types/memcached": "^2.2.6" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-1zABdJlF9Tk0yUv2ELpF6Mk2kw81k+bnB3Sw+D/ssRDcGGCnCNbz+fKJE8dwAPkDP+OcTmiKm6ySREbcyRFzCg=="], + + "@opentelemetry/instrumentation-mongodb": ["@opentelemetry/instrumentation-mongodb@0.53.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-zS2gQJQuG7RZw5yaNG/TnxsOtv1fFkn3ypuDrVLJtJLZtcOr4GYn31jbIA8od+QW/ChZLVcH364iDs+z/xS9wA=="], + + "@opentelemetry/instrumentation-mongoose": ["@opentelemetry/instrumentation-mongoose@0.47.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-zg4ixMNmuACda75eOFa1m5h794zC9wp397stX0LAZvOylSb6dWT52P6ElkVQMV42C/27liEdQWxpabsamB+XPQ=="], + + "@opentelemetry/instrumentation-mysql": ["@opentelemetry/instrumentation-mysql@0.46.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0", "@types/mysql": "2.15.26" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-Z1NDAv07suIukgL7kxk9cAQX1t/smRMLNOU+q5Aqnhnf/0FIF/N4cX2wg+25IWy0m2PoaPbAVYCKB0aOt5vzAw=="], + + "@opentelemetry/instrumentation-mysql2": ["@opentelemetry/instrumentation-mysql2@0.46.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0", "@opentelemetry/sql-common": "^0.41.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-JsmIA+aTfHqy2tahjnVWChRipYpYrTy+XFAuUPia9CTaspCx8ZrirPUqYnbnaPEtnzYff2a4LX0B2LT1hKlOiA=="], + + "@opentelemetry/instrumentation-nestjs-core": ["@opentelemetry/instrumentation-nestjs-core@0.46.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.30.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-5cYnBIMZuTSLFUt0pMH+NQNdI5/2YeCVuz29Mo2lkudbBUOvzGmzl/Y6LG1JEw2j6zuJx5IgO5CKNrJqAIzTWA=="], + + "@opentelemetry/instrumentation-net": ["@opentelemetry/instrumentation-net@0.44.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-SmAbOKTi0lgdTN9XMXOaf+4jw670MpiK3pw9/to/kRlTvNWwWA4RD34trCcoL7Gf2IYoXuj56Oo4Z5C7N98ukw=="], + + "@opentelemetry/instrumentation-pg": ["@opentelemetry/instrumentation-pg@0.52.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0", "@opentelemetry/sql-common": "^0.41.0", "@types/pg": "8.6.1", "@types/pg-pool": "2.0.6" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-OBpqlxTqmFkZGHaHV4Pzd95HkyKVS+vf0N5wVX3BSb8uqsvOrW62I1qt+2jNsZ13dtG5eOzvcsQTMGND76wizA=="], + + "@opentelemetry/instrumentation-pino": ["@opentelemetry/instrumentation-pino@0.47.0", "", { "dependencies": { "@opentelemetry/api-logs": "^0.200.0", "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.200.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-OFOy/TGtGXMYWrF4xPKhLN1evdqUpbuoKODzeh3GSjFkcooZZf4m/Hpzu12FV+s0wDBf43oAjXbNJWeCJQMrug=="], + + "@opentelemetry/instrumentation-redis": ["@opentelemetry/instrumentation-redis@0.47.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/redis-common": "^0.37.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-T2YvuX/LaJEQKgKvIQJlbSMSzxp6oBm+9PMgfn7QcBXzSY9tyeyDF6QjLAKNvxs+BJeQzFmDlahjoEyatzxRWA=="], + + "@opentelemetry/instrumentation-redis-4": ["@opentelemetry/instrumentation-redis-4@0.47.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/redis-common": "^0.37.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-9LywJGp1fmmLj6g1+Rv91pVE3ATle1C/qIya9ZLwPywXTOdFIARI/gvvvlI7uFABoLojj2dSaI/5JQrq4C1HSg=="], + + "@opentelemetry/instrumentation-restify": ["@opentelemetry/instrumentation-restify@0.46.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-du1FjKsTGQH6q8QjG0Bxlg0L79Co/Ey0btKKb2sg7fvg0YX6LKdR2N1fzfne/A9k+WjQ5v28JuUXOk2cEPYU/Q=="], + + "@opentelemetry/instrumentation-router": ["@opentelemetry/instrumentation-router@0.45.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-CGEeT73Wy/nLQw+obG/mBCIgMbZQKrGG6hzbEdtQ4G2jqI97w7pLWdM4DvkpWVBNcxMpO13dX1nn2OiyZXND3Q=="], + + "@opentelemetry/instrumentation-runtime-node": ["@opentelemetry/instrumentation-runtime-node@0.14.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-y78dGoFMKwHSz0SD113Gt1dFTcfunpPZXIJh2SzJN27Lyb9FIzuMfjc3Iu3+s/N6qNOLuS9mKnPe3/qVGG4Waw=="], + + "@opentelemetry/instrumentation-socket.io": ["@opentelemetry/instrumentation-socket.io@0.47.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-qAc+XCcRmZYjs8KJIPv+MMR2wPPPOppwoarzKRR4G+yvOBs1xMwbbkqNHifKga0XcfFX4KVr7Z5QQ6ZZzWyLtg=="], + + "@opentelemetry/instrumentation-tedious": ["@opentelemetry/instrumentation-tedious@0.19.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0", "@types/tedious": "^4.0.14" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-hNC/Bz+g4RvwaKsbA1VD+9x8X2Ml+fN2uba4dniIdQIrAItLdet4xx/7TEoWYtyVJQozphvpnIsUp52Rw4djCA=="], + + "@opentelemetry/instrumentation-undici": ["@opentelemetry/instrumentation-undici@0.11.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.200.0" }, "peerDependencies": { "@opentelemetry/api": "^1.7.0" } }, "sha512-H6ijJnKVZBB0Lhm6NsaBt0rUz+i52LriLhrpGAE8SazB0jCIVY4MrL2dNib/4w8zA+Fw9zFwERJvKXUIbSD1ew=="], + + "@opentelemetry/instrumentation-winston": ["@opentelemetry/instrumentation-winston@0.45.0", "", { "dependencies": { "@opentelemetry/api-logs": "^0.200.0", "@opentelemetry/instrumentation": "^0.200.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-LZz3/6QvzoneSqD/xnB8wq/g1fy8oe2PwfZ15zS2YA5mnjuSqlqgl+k3sib7wfIYHMP1D3ajfbDB6UOJBALj/w=="], + + "@opentelemetry/otlp-exporter-base": ["@opentelemetry/otlp-exporter-base@0.200.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/otlp-transformer": "0.200.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-IxJgA3FD7q4V6gGq4bnmQM5nTIyMDkoGFGrBrrDjB6onEiq1pafma55V+bHvGYLWvcqbBbRfezr1GED88lacEQ=="], + + "@opentelemetry/otlp-grpc-exporter-base": ["@opentelemetry/otlp-grpc-exporter-base@0.200.0", "", { "dependencies": { "@grpc/grpc-js": "^1.7.1", "@opentelemetry/core": "2.0.0", "@opentelemetry/otlp-exporter-base": "0.200.0", "@opentelemetry/otlp-transformer": "0.200.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-CK2S+bFgOZ66Bsu5hlDeOX6cvW5FVtVjFFbWuaJP0ELxJKBB6HlbLZQ2phqz/uLj1cWap5xJr/PsR3iGoB7Vqw=="], + + "@opentelemetry/otlp-transformer": ["@opentelemetry/otlp-transformer@0.200.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.200.0", "@opentelemetry/core": "2.0.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/sdk-logs": "0.200.0", "@opentelemetry/sdk-metrics": "2.0.0", "@opentelemetry/sdk-trace-base": "2.0.0", "protobufjs": "^7.3.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-+9YDZbYybOnv7sWzebWOeK6gKyt2XE7iarSyBFkwwnP559pEevKOUD8NyDHhRjCSp13ybh9iVXlMfcj/DwF/yw=="], + + "@opentelemetry/propagation-utils": ["@opentelemetry/propagation-utils@0.31.0", "", { "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-Gnxes8Mwm7BwLCDobUD1A5YoFWIKDch6WQWvO+jc0uvfI4vujDExVghbGg5sTJhHc2Sg2cU0+ANgV/jUjdS79w=="], + + "@opentelemetry/propagator-b3": ["@opentelemetry/propagator-b3@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-blx9S2EI49Ycuw6VZq+bkpaIoiJFhsDuvFGhBIoH3vJ5oYjJ2U0s3fAM5jYft99xVIAv6HqoPtlP9gpVA2IZtA=="], + + "@opentelemetry/propagator-jaeger": ["@opentelemetry/propagator-jaeger@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-Mbm/LSFyAtQKP0AQah4AfGgsD+vsZcyreZoQ5okFBk33hU7AquU4TltgyL9dvaO8/Zkoud8/0gEvwfOZ5d7EPA=="], + + "@opentelemetry/redis-common": ["@opentelemetry/redis-common@0.37.0", "", {}, "sha512-tJwgE6jt32bLs/9J6jhQRKU2EZnsD8qaO13aoFyXwF6s4LhpT7YFHf3Z03MqdILk6BA2BFUhoyh7k9fj9i032A=="], + + "@opentelemetry/resource-detector-alibaba-cloud": ["@opentelemetry/resource-detector-alibaba-cloud@0.31.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/resources": "^2.0.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-Ty3GkSnht10UySMdHC1ngwGEYMbTBxt0/PMpjwbM6ibxkgf57apx04cSeHVm9TwBE/vm9+4/zt4RciCqyWQwtA=="], + + "@opentelemetry/resource-detector-aws": ["@opentelemetry/resource-detector-aws@2.0.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/resources": "^2.0.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-jvHvLAXzFPJJhj0AdbMOpup+Fchef32sHM1Suj4NgJGKxTO47T84i5OjKiG/81YEoCaKmlTefezNbuaGCrPd3w=="], + + "@opentelemetry/resource-detector-azure": ["@opentelemetry/resource-detector-azure@0.7.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/resources": "^2.0.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-aR2ALsK+b/+5lLDhK9KTK8rcuKg7+sqa/Cg+QCeasqoy7qby70FRtAbQcZGljJ5BLBcVPYjl1hcTYIUyL3Laww=="], + + "@opentelemetry/resource-detector-container": ["@opentelemetry/resource-detector-container@0.7.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/resources": "^2.0.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-B6DmocHE6bCJt6Iy6z7p+ESjrp7WI4MJN2jWa2MBj9UEZ60Mj/q4BZ8qv0NSmcOYuJhjykNqCUmA+dAOnQn/Kw=="], + + "@opentelemetry/resource-detector-gcp": ["@opentelemetry/resource-detector-gcp@0.34.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/resources": "^2.0.0", "@opentelemetry/semantic-conventions": "^1.27.0", "gcp-metadata": "^6.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-Mug9Oing1nVQE8pYT33UKuPSEa/wjQTMk3feS9F84h4U7oZIx5Mz3yddj3OHOPgrW/7d1Ve/mG7jmYqBI9tpTg=="], + + "@opentelemetry/resources": ["@opentelemetry/resources@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg=="], + + "@opentelemetry/sdk-logs": ["@opentelemetry/sdk-logs@0.200.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.200.0", "@opentelemetry/core": "2.0.0", "@opentelemetry/resources": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.4.0 <1.10.0" } }, "sha512-VZG870063NLfObmQQNtCVcdXXLzI3vOjjrRENmU37HYiPFa0ZXpXVDsTD02Nh3AT3xYJzQaWKl2X2lQ2l7TWJA=="], + + "@opentelemetry/sdk-metrics": ["@opentelemetry/sdk-metrics@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/resources": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, "sha512-Bvy8QDjO05umd0+j+gDeWcTaVa1/R2lDj/eOvjzpm8VQj1K1vVZJuyjThpV5/lSHyYW2JaHF2IQ7Z8twJFAhjA=="], + + "@opentelemetry/sdk-node": ["@opentelemetry/sdk-node@0.200.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.200.0", "@opentelemetry/core": "2.0.0", "@opentelemetry/exporter-logs-otlp-grpc": "0.200.0", "@opentelemetry/exporter-logs-otlp-http": "0.200.0", "@opentelemetry/exporter-logs-otlp-proto": "0.200.0", "@opentelemetry/exporter-metrics-otlp-grpc": "0.200.0", "@opentelemetry/exporter-metrics-otlp-http": "0.200.0", "@opentelemetry/exporter-metrics-otlp-proto": "0.200.0", "@opentelemetry/exporter-prometheus": "0.200.0", "@opentelemetry/exporter-trace-otlp-grpc": "0.200.0", "@opentelemetry/exporter-trace-otlp-http": "0.200.0", "@opentelemetry/exporter-trace-otlp-proto": "0.200.0", "@opentelemetry/exporter-zipkin": "2.0.0", "@opentelemetry/instrumentation": "0.200.0", "@opentelemetry/propagator-b3": "2.0.0", "@opentelemetry/propagator-jaeger": "2.0.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/sdk-logs": "0.200.0", "@opentelemetry/sdk-metrics": "2.0.0", "@opentelemetry/sdk-trace-base": "2.0.0", "@opentelemetry/sdk-trace-node": "2.0.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-S/YSy9GIswnhYoDor1RusNkmRughipvTCOQrlF1dzI70yQaf68qgf5WMnzUxdlCl3/et/pvaO75xfPfuEmCK5A=="], + + "@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-qQnYdX+ZCkonM7tA5iU4fSRsVxbFGml8jbxOgipRGMFHKaXKHQ30js03rTobYjKjIfnOsZSbHKWF0/0v0OQGfw=="], + + "@opentelemetry/sdk-trace-node": ["@opentelemetry/sdk-trace-node@2.0.0", "", { "dependencies": { "@opentelemetry/context-async-hooks": "2.0.0", "@opentelemetry/core": "2.0.0", "@opentelemetry/sdk-trace-base": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-omdilCZozUjQwY3uZRBwbaRMJ3p09l4t187Lsdf0dGMye9WKD4NGcpgZRvqhI1dwcH6og+YXQEtoO9Wx3ykilg=="], + + "@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.32.0", "", {}, "sha512-s0OpmpQFSfMrmedAn9Lhg4KWJELHCU6uU9dtIJ28N8UGhf9Y55im5X8fEzwhwDwiSqN+ZPSNrDJF7ivf/AuRPQ=="], + + "@opentelemetry/sql-common": ["@opentelemetry/sql-common@0.41.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0" } }, "sha512-pmzXctVbEERbqSfiAgdes9Y63xjoOyXcD7B6IXBkVb+vbM7M9U98mn33nGXxPf4dfYR0M+vhcKRZmbSJ7HfqFA=="], + + "@pkl-community/pkl": ["@pkl-community/pkl@0.28.2", "", { "optionalDependencies": { "@pkl-community/pkl-darwin-arm64": "0.28.2", "@pkl-community/pkl-darwin-x64": "0.28.2", "@pkl-community/pkl-linux-arm64": "0.28.2", "@pkl-community/pkl-linux-x64": "0.28.2" }, "bin": { "pkl": "lib/main.js" } }, "sha512-seSZrwGvDEd1BeT9+dRRnqvyNit8vpFL2I+YBEJ+t3pBYpnpHaVHwQNPlMLvDQ0KZUCQkiWGZnbCMF9WtaxHNA=="], + + "@pkl-community/pkl-darwin-arm64": ["@pkl-community/pkl-darwin-arm64@0.28.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-1CP5VayKnZeL1BUTaQUltiBu5wbn/pNizP3aSK1zbWMHDGK/S/rIs1X0GWEyOHWG7P/h9EBsNzHmJqg4kCn5jw=="], + + "@pkl-community/pkl-darwin-x64": ["@pkl-community/pkl-darwin-x64@0.28.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-gGV3S9Hnyclga3/8wvspXWxKKEPMJrWzgeafIPpFPDa49DDlPCrf4zNkN0T29yylWd4aLwMUGRE15vswkjhdjA=="], + + "@pkl-community/pkl-linux-arm64": ["@pkl-community/pkl-linux-arm64@0.28.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-IGJDm0maESl7Q+x2XukC7ia39m7Z++/C92cknrvTtyNdEROufGDobUv96ekq4e1gdcEgDvvDqCXLEQNC871Trg=="], + + "@pkl-community/pkl-linux-x64": ["@pkl-community/pkl-linux-x64@0.28.2", "", { "os": "linux", "cpu": "x64" }, "sha512-9MndyTuiRhBRdrDqgcNadi6mT8mCNcLChwh28D5t5EDko8maUDTKHwHeuIzdBI5P0ZLNYPnT4McPufkeBu67vQ=="], + + "@protobufjs/aspromise": ["@protobufjs/aspromise@1.1.2", "", {}, "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="], + + "@protobufjs/base64": ["@protobufjs/base64@1.1.2", "", {}, "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="], + + "@protobufjs/codegen": ["@protobufjs/codegen@2.0.4", "", {}, "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="], + + "@protobufjs/eventemitter": ["@protobufjs/eventemitter@1.1.0", "", {}, "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="], + + "@protobufjs/fetch": ["@protobufjs/fetch@1.1.0", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.1", "@protobufjs/inquire": "^1.1.0" } }, "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ=="], + + "@protobufjs/float": ["@protobufjs/float@1.0.2", "", {}, "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="], + + "@protobufjs/inquire": ["@protobufjs/inquire@1.1.0", "", {}, "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="], + + "@protobufjs/path": ["@protobufjs/path@1.1.2", "", {}, "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="], + + "@protobufjs/pool": ["@protobufjs/pool@1.1.0", "", {}, "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="], + + "@protobufjs/utf8": ["@protobufjs/utf8@1.1.0", "", {}, "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="], + + "@pyroscope/nodejs": ["@pyroscope/nodejs@0.4.5", "", { "dependencies": { "@datadog/pprof": "^5.4.1", "debug": "^4.3.3", "p-limit": "^3.1.0", "regenerator-runtime": "^0.13.11", "source-map": "^0.7.3" } }, "sha512-39YVwmLA2QhmLEd/yZjkjvAdU16kH0CiH6KY4wd1O4Lz7CszLW3/q2b33RAegdpnFmu8pPMhDcrPl/79mkjI0g=="], + + "@redis/bloom": ["@redis/bloom@1.2.0", "", { "peerDependencies": { "@redis/client": "^1.0.0" } }, "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg=="], + + "@redis/client": ["@redis/client@1.6.0", "", { "dependencies": { "cluster-key-slot": "1.1.2", "generic-pool": "3.9.0", "yallist": "4.0.0" } }, "sha512-aR0uffYI700OEEH4gYnitAnv3vzVGXCFvYfdpu/CJKvk4pHfLPEy/JSZyrpQ+15WhXe1yJRXLtfQ84s4mEXnPg=="], + + "@redis/graph": ["@redis/graph@1.1.1", "", { "peerDependencies": { "@redis/client": "^1.0.0" } }, "sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw=="], + + "@redis/json": ["@redis/json@1.0.7", "", { "peerDependencies": { "@redis/client": "^1.0.0" } }, "sha512-6UyXfjVaTBTJtKNG4/9Z8PSpKE6XgSyEb8iwaqDcy+uKrd/DGYHTWkUdnQDyzm727V7p21WUMhsqz5oy65kPcQ=="], + + "@redis/search": ["@redis/search@1.2.0", "", { "peerDependencies": { "@redis/client": "^1.0.0" } }, "sha512-tYoDBbtqOVigEDMAcTGsRlMycIIjwMCgD8eR2t0NANeQmgK/lvxNAvYyb6bZDD4frHRhIHkJu2TBRvB0ERkOmw=="], + + "@redis/time-series": ["@redis/time-series@1.1.0", "", { "peerDependencies": { "@redis/client": "^1.0.0" } }, "sha512-c1Q99M5ljsIuc4YdaCwfUEXsofakb9c8+Zse2qxTadu8TalLXuAESzLvFAvNVbkmSlvlzIQOLpBCmWI9wTOt+g=="], + + "@rollup/plugin-alias": ["@rollup/plugin-alias@5.1.1", "", { "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ=="], + + "@rollup/plugin-commonjs": ["@rollup/plugin-commonjs@28.0.2", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "commondir": "^1.0.1", "estree-walker": "^2.0.2", "fdir": "^6.2.0", "is-reference": "1.2.1", "magic-string": "^0.30.3", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^2.68.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-BEFI2EDqzl+vA1rl97IDRZ61AIwGH093d9nz8+dThxJNH8oSoB7MjWvPCX3dkaK1/RCJ/1v/R1XB15FuSs0fQw=="], + + "@rollup/plugin-dynamic-import-vars": ["@rollup/plugin-dynamic-import-vars@2.1.5", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "astring": "^1.8.5", "estree-walker": "^2.0.2", "fast-glob": "^3.2.12", "magic-string": "^0.30.3" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-Mymi24fd9hlRifdZV/jYIFj1dn99F34imiYu3KzlAcgBcRi3i9SucgW/VRo5SQ9K4NuQ7dCep6pFWgNyhRdFHQ=="], + + "@rollup/plugin-inject": ["@rollup/plugin-inject@5.0.5", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "estree-walker": "^2.0.2", "magic-string": "^0.30.3" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg=="], + + "@rollup/plugin-json": ["@rollup/plugin-json@6.1.0", "", { "dependencies": { "@rollup/pluginutils": "^5.1.0" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA=="], + + "@rollup/plugin-node-resolve": ["@rollup/plugin-node-resolve@16.0.0", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "@types/resolve": "1.20.2", "deepmerge": "^4.2.2", "is-module": "^1.0.0", "resolve": "^1.22.1" }, "peerDependencies": { "rollup": "^2.78.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-0FPvAeVUT/zdWoO0jnb/V5BlBsUSNfkIOtFHzMO4H9MOklrmQFY6FduVHKucNb/aTFxvnGhj4MNj/T1oNdDfNg=="], + + "@rollup/plugin-replace": ["@rollup/plugin-replace@6.0.2", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "magic-string": "^0.30.3" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-7QaYCf8bqF04dOy7w/eHmJeNExxTYwvKAmlSAH/EaWWUzbT0h5sbF6bktFoX/0F/0qwng5/dWFMyf3gzaM8DsQ=="], + + "@rollup/pluginutils": ["@rollup/pluginutils@5.1.4", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ=="], + + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.34.0", "", { "os": "android", "cpu": "arm" }, "sha512-Eeao7ewDq79jVEsrtWIj5RNqB8p2knlm9fhR6uJ2gqP7UfbLrTrxevudVrEPDM7Wkpn/HpRC2QfazH7MXLz3vQ=="], + + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.34.0", "", { "os": "android", "cpu": "arm64" }, "sha512-yVh0Kf1f0Fq4tWNf6mWcbQBCLDpDrDEl88lzPgKhrgTcDrTtlmun92ywEF9dCjmYO3EFiSuJeeo9cYRxl2FswA=="], + + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.34.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-gCs0ErAZ9s0Osejpc3qahTsqIPUDjSKIyxK/0BGKvL+Tn0n3Kwvj8BrCv7Y5sR1Ypz1K2qz9Ny0VvkVyoXBVUQ=="], + + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.34.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-aIB5Anc8hngk15t3GUkiO4pv42ykXHfmpXGS+CzM9CTyiWyT8HIS5ygRAy7KcFb/wiw4Br+vh1byqcHRTfq2tQ=="], + + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.34.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-kpdsUdMlVJMRMaOf/tIvxk8TQdzHhY47imwmASOuMajg/GXpw8GKNd8LNwIHE5Yd1onehNpcUB9jHY6wgw9nHQ=="], + + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.34.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-D0RDyHygOBCQiqookcPevrvgEarN0CttBecG4chOeIYCNtlKHmf5oi5kAVpXV7qs0Xh/WO2RnxeicZPtT50V0g=="], + + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.34.0", "", { "os": "linux", "cpu": "arm" }, "sha512-mCIw8j5LPDXmCOW8mfMZwT6F/Kza03EnSr4wGYEswrEfjTfVsFOxvgYfuRMxTuUF/XmRb9WSMD5GhCWDe2iNrg=="], + + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.34.0", "", { "os": "linux", "cpu": "arm" }, "sha512-AwwldAu4aCJPob7zmjuDUMvvuatgs8B/QiVB0KwkUarAcPB3W+ToOT+18TQwY4z09Al7G0BvCcmLRop5zBLTag=="], + + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.34.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-e7kDUGVP+xw05pV65ZKb0zulRploU3gTu6qH1qL58PrULDGxULIS0OSDQJLH7WiFnpd3ZKUU4VM3u/Z7Zw+e7Q=="], + + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.34.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-SXYJw3zpwHgaBqTXeAZ31qfW/v50wq4HhNVvKFhRr5MnptRX2Af4KebLWR1wpxGJtLgfS2hEPuALRIY3LPAAcA=="], + + "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.34.0", "", { "os": "linux", "cpu": "none" }, "sha512-e5XiCinINCI4RdyU3sFyBH4zzz7LiQRvHqDtRe9Dt8o/8hTBaYpdPimayF00eY2qy5j4PaaWK0azRgUench6WQ=="], + + "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.34.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-3SWN3e0bAsm9ToprLFBSro8nJe6YN+5xmB11N4FfNf92wvLye/+Rh5JGQtKOpwLKt6e61R1RBc9g+luLJsc23A=="], + + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.34.0", "", { "os": "linux", "cpu": "none" }, "sha512-B1Oqt3GLh7qmhvfnc2WQla4NuHlcxAD5LyueUi5WtMc76ZWY+6qDtQYqnxARx9r+7mDGfamD+8kTJO0pKUJeJA=="], + + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.34.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-UfUCo0h/uj48Jq2lnhX0AOhZPSTAq3Eostas+XZ+GGk22pI+Op1Y6cxQ1JkUuKYu2iU+mXj1QjPrZm9nNWV9rg=="], + + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.34.0", "", { "os": "linux", "cpu": "x64" }, "sha512-chZLTUIPbgcpm+Z7ALmomXW8Zh+wE2icrG+K6nt/HenPLmtwCajhQC5flNSk1Xy5EDMt/QAOz2MhzfOfJOLSiA=="], + + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.34.0", "", { "os": "linux", "cpu": "x64" }, "sha512-jo0UolK70O28BifvEsFD/8r25shFezl0aUk2t0VJzREWHkq19e+pcLu4kX5HiVXNz5qqkD+aAq04Ct8rkxgbyQ=="], + + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.34.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-Vmg0NhAap2S54JojJchiu5An54qa6t/oKT7LmDaWggpIcaiL8WcWHEN6OQrfTdL6mQ2GFyH7j2T5/3YPEDOOGA=="], + + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.34.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-CV2aqhDDOsABKHKhNcs1SZFryffQf8vK2XrxP6lxC99ELZAdvsDgPklIBfd65R8R+qvOm1SmLaZ/Fdq961+m7A=="], + + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.34.0", "", { "os": "win32", "cpu": "x64" }, "sha512-g2ASy1QwHP88y5KWvblUolJz9rN+i4ZOsYzkEwcNfaNooxNUXG+ON6F5xFo0NIItpHqxcdAyls05VXpBnludGw=="], + + "@standard-schema/spec": ["@standard-schema/spec@1.0.0", "", {}, "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA=="], + + "@ts-morph/common": ["@ts-morph/common@0.17.0", "", { "dependencies": { "fast-glob": "^3.2.11", "minimatch": "^5.1.0", "mkdirp": "^1.0.4", "path-browserify": "^1.0.1" } }, "sha512-RMSSvSfs9kb0VzkvQ2NWobwnj7TxCA9vI/IjR9bDHqgAyVbu2T0DN4wiKVqomyDWqO7dPr/tErSfq7urQ1Q37g=="], + + "@types/aws-lambda": ["@types/aws-lambda@8.10.147", "", {}, "sha512-nD0Z9fNIZcxYX5Mai2CTmFD7wX7UldCkW2ezCF8D1T5hdiLsnTWDGRpfRYntU6VjTdLQjOvyszru7I1c1oCQew=="], + + "@types/body-parser": ["@types/body-parser@1.19.5", "", { "dependencies": { "@types/connect": "*", "@types/node": "*" } }, "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg=="], + + "@types/bunyan": ["@types/bunyan@1.8.11", "", { "dependencies": { "@types/node": "*" } }, "sha512-758fRH7umIMk5qt5ELmRMff4mLDlN+xyYzC+dkPTdKwbSkJFvz6xwyScrytPU0QIBbRRwbiE8/BIg8bpajerNQ=="], + + "@types/connect": ["@types/connect@3.4.38", "", { "dependencies": { "@types/node": "*" } }, "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug=="], + + "@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="], + + "@types/express": ["@types/express@5.0.2", "", { "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^5.0.0", "@types/serve-static": "*" } }, "sha512-BtjL3ZwbCQriyb0DGw+Rt12qAXPiBTPs815lsUvtt1Grk0vLRMZNMUZ741d5rjk+UQOxfDiBZ3dxpX00vSkK3g=="], + + "@types/express-serve-static-core": ["@types/express-serve-static-core@5.0.6", "", { "dependencies": { "@types/node": "*", "@types/qs": "*", "@types/range-parser": "*", "@types/send": "*" } }, "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA=="], + + "@types/http-errors": ["@types/http-errors@2.0.4", "", {}, "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA=="], + + "@types/lodash": ["@types/lodash@4.17.17", "", {}, "sha512-RRVJ+J3J+WmyOTqnz3PiBLA501eKwXl2noseKOrNo/6+XEHjTAxO4xHvxQB6QuNm+s4WRbn6rSiap8+EA+ykFQ=="], + + "@types/memcached": ["@types/memcached@2.2.10", "", { "dependencies": { "@types/node": "*" } }, "sha512-AM9smvZN55Gzs2wRrqeMHVP7KE8KWgCJO/XL5yCly2xF6EKa4YlbpK+cLSAH4NG/Ah64HrlegmGqW8kYws7Vxg=="], + + "@types/mime": ["@types/mime@1.3.5", "", {}, "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w=="], + + "@types/mysql": ["@types/mysql@2.15.26", "", { "dependencies": { "@types/node": "*" } }, "sha512-DSLCOXhkvfS5WNNPbfn2KdICAmk8lLc+/PNvnPnF7gOdMZCxopXduqv0OQ13y/yA/zXTSikZZqVgybUxOEg6YQ=="], + + "@types/node": ["@types/node@22.13.0", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-ClIbNe36lawluuvq3+YYhnIN2CELi+6q8NpnM7PYp4hBn/TatfboPgVSm2rwKRfnV2M+Ty9GWDFI64KEe+kysA=="], + + "@types/node-fetch": ["@types/node-fetch@2.6.12", "", { "dependencies": { "@types/node": "*", "form-data": "^4.0.0" } }, "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA=="], + + "@types/pg": ["@types/pg@8.6.1", "", { "dependencies": { "@types/node": "*", "pg-protocol": "*", "pg-types": "^2.2.0" } }, "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w=="], + + "@types/pg-pool": ["@types/pg-pool@2.0.6", "", { "dependencies": { "@types/pg": "*" } }, "sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ=="], + + "@types/qs": ["@types/qs@6.14.0", "", {}, "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ=="], + + "@types/ramda": ["@types/ramda@0.30.2", "", { "dependencies": { "types-ramda": "^0.30.1" } }, "sha512-PyzHvjCalm2BRYjAU6nIB3TprYwMNOUY/7P/N8bSzp9W/yM2YrtGtAnnVtaCNSeOZ8DzKyFDvaqQs7LnWwwmBA=="], + + "@types/range-parser": ["@types/range-parser@1.2.7", "", {}, "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ=="], + + "@types/resolve": ["@types/resolve@1.20.2", "", {}, "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q=="], + + "@types/send": ["@types/send@0.17.4", "", { "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA=="], + + "@types/serve-static": ["@types/serve-static@1.15.7", "", { "dependencies": { "@types/http-errors": "*", "@types/node": "*", "@types/send": "*" } }, "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw=="], + + "@types/service-worker-mock": ["@types/service-worker-mock@2.0.4", "", {}, "sha512-MEBT2eiqYfhxjqYm/oAf2AvKLbPTPwJJAYrMdheKnGyz1yG9XBRfxCzi93h27qpSvI7jOYfXqFLVMLBXFDqo4A=="], + + "@types/shimmer": ["@types/shimmer@1.2.0", "", {}, "sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg=="], + + "@types/tedious": ["@types/tedious@4.0.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw=="], + + "@xata.io/client": ["@xata.io/client@0.0.0-next.vfbf85e03c9dbded87f0e347cc3850e811f46ef97", "", { "peerDependencies": { "typescript": ">=4.5" } }, "sha512-MBIr8jKL5R07fkoA2P0Fc3pecfT6eD9+3aruL5GYjfSzVIPxvc5slnbA6lQQw8/C8jgV5G+KiG21YQy7HACzmg=="], + + "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="], + + "accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="], + + "acorn": ["acorn@8.14.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg=="], + + "acorn-import-attributes": ["acorn-import-attributes@1.9.5", "", { "peerDependencies": { "acorn": "^8" } }, "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ=="], + + "agent-base": ["agent-base@7.1.3", "", {}, "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw=="], + + "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], + + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "array-flatten": ["array-flatten@1.1.1", "", {}, "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="], + + "assert": ["assert@2.1.0", "", { "dependencies": { "call-bind": "^1.0.2", "is-nan": "^1.3.2", "object-is": "^1.1.5", "object.assign": "^4.1.4", "util": "^0.12.5" } }, "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw=="], + + "astring": ["astring@1.9.0", "", { "bin": { "astring": "bin/astring" } }, "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg=="], + + "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], + + "atomic-sleep": ["atomic-sleep@1.0.0", "", {}, "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ=="], + + "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], + + "await-lock": ["await-lock@2.2.2", "", {}, "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw=="], + + "axios": ["axios@1.7.9", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], + + "better-sqlite3": ["better-sqlite3@11.8.1", "", { "dependencies": { "bindings": "^1.5.0", "prebuild-install": "^7.1.1" } }, "sha512-9BxNaBkblMjhJW8sMRZxnxVTRgbRmssZW0Oxc1MPBTfiR+WW21e2Mk4qu8CzrcZb1LwPCnFsfDEzq+SNcBU8eg=="], + + "bignumber.js": ["bignumber.js@9.1.2", "", {}, "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug=="], + + "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], + + "bindings": ["bindings@1.5.0", "", { "dependencies": { "file-uri-to-path": "1.0.0" } }, "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ=="], + + "bl": ["bl@4.1.0", "", { "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w=="], + + "body-parser": ["body-parser@2.2.0", "", { "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", "debug": "^4.4.0", "http-errors": "^2.0.0", "iconv-lite": "^0.6.3", "on-finished": "^2.4.1", "qs": "^6.14.0", "raw-body": "^3.0.0", "type-is": "^2.0.0" } }, "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg=="], + + "brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], + + "buffer-equal-constant-time": ["buffer-equal-constant-time@1.0.1", "", {}, "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="], + + "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], + + "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], + + "call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="], + + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.1", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g=="], + + "call-bound": ["call-bound@1.0.3", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "get-intrinsic": "^1.2.6" } }, "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA=="], + + "cbor-extract": ["cbor-extract@2.2.0", "", { "dependencies": { "node-gyp-build-optional-packages": "5.1.1" }, "optionalDependencies": { "@cbor-extract/cbor-extract-darwin-arm64": "2.2.0", "@cbor-extract/cbor-extract-darwin-x64": "2.2.0", "@cbor-extract/cbor-extract-linux-arm": "2.2.0", "@cbor-extract/cbor-extract-linux-arm64": "2.2.0", "@cbor-extract/cbor-extract-linux-x64": "2.2.0", "@cbor-extract/cbor-extract-win32-x64": "2.2.0" }, "bin": { "download-cbor-prebuilds": "bin/download-prebuilds.js" } }, "sha512-Ig1zM66BjLfTXpNgKpvBePq271BPOvu8MR0Jl080yG7Jsl+wAZunfrwiwA+9ruzm/WEdIV5QF/bjDZTqyAIVHA=="], + + "cbor-x": ["cbor-x@1.6.0", "", { "optionalDependencies": { "cbor-extract": "^2.2.0" } }, "sha512-0kareyRwHSkL6ws5VXHEf8uY1liitysCVJjlmhaLG+IXLqhSaOO+t63coaso7yjwEzWZzLy8fJo06gZDVQM9Qg=="], + + "cborg": ["cborg@1.10.2", "", { "bin": { "cborg": "cli.js" } }, "sha512-b3tFPA9pUr2zCUiCfRd2+wok2/LBSNUMKOuRRok+WlvvAgEt/PlbgPTsZUcwCOs53IJvLgTp0eotwtosE6njug=="], + + "chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="], + + "chanfana": ["chanfana@2.6.3", "", { "dependencies": { "@asteasolutions/zod-to-openapi": "^7.2.0", "js-yaml": "^4.1.0", "openapi3-ts": "^4.4.0", "zod": "^3.23.8" } }, "sha512-Wb3Mc+xte4NzCwZsNgP1TmTunkkIZwmkyP2Ph+JfzypE4UYMf1oppNKGUvWuAEAWH9U17V4QMlRxTfWc6uWyrw=="], + + "chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], + + "chownr": ["chownr@1.1.4", "", {}, "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="], + + "cjs-module-lexer": ["cjs-module-lexer@1.4.3", "", {}, "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q=="], + + "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + + "cluster-key-slot": ["cluster-key-slot@1.1.2", "", {}, "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA=="], + + "code-block-writer": ["code-block-writer@11.0.3", "", {}, "sha512-NiujjUFB4SwScJq2bwbYUtXbZhBSlY6vYzm++3Q6oC+U+injTqfPYFK8wS9COOmb2lueqp0ZRB4nK1VYeHgNyw=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], + + "commander": ["commander@9.5.0", "", {}, "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ=="], + + "commondir": ["commondir@1.0.1", "", {}, "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg=="], + + "consola": ["consola@3.4.0", "", {}, "sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA=="], + + "content-disposition": ["content-disposition@1.0.0", "", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg=="], + + "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="], + + "cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], + + "cookie-es": ["cookie-es@1.2.2", "", {}, "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg=="], + + "cookie-signature": ["cookie-signature@1.2.2", "", {}, "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="], + + "crossws": ["crossws@0.3.3", "", { "dependencies": { "uncrypto": "^0.1.3" } }, "sha512-/71DJT3xJlqSnBr83uGJesmVHSzZEvgxHt/fIKxBAAngqMHmnBWQNxCphVxxJ2XL3xleu5+hJD6IQ3TglBedcw=="], + + "dayjs": ["dayjs@1.11.13", "", {}, "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="], + + "debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="], + + "decompress-response": ["decompress-response@6.0.0", "", { "dependencies": { "mimic-response": "^3.1.0" } }, "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ=="], + + "deep-extend": ["deep-extend@0.6.0", "", {}, "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="], + + "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], + + "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], + + "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="], + + "defu": ["defu@6.1.4", "", {}, "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="], + + "delay": ["delay@5.0.0", "", {}, "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw=="], + + "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], + + "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], + + "destr": ["destr@2.0.3", "", {}, "sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ=="], + + "destroy": ["destroy@1.2.0", "", {}, "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="], + + "detect-libc": ["detect-libc@2.0.3", "", {}, "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw=="], + + "dotenv": ["dotenv@16.4.7", "", {}, "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ=="], + + "drizzle-kit": ["drizzle-kit@0.31.1", "", { "dependencies": { "@drizzle-team/brocli": "^0.10.2", "@esbuild-kit/esm-loader": "^2.5.5", "esbuild": "^0.25.2", "esbuild-register": "^3.5.0" }, "bin": { "drizzle-kit": "bin.cjs" } }, "sha512-PUjYKWtzOzPtdtQlTHQG3qfv4Y0XT8+Eas6UbxCmxTj7qgMf+39dDujf1BP1I+qqZtw9uzwTh8jYtkMuCq+B0Q=="], + + "drizzle-orm": ["drizzle-orm@0.44.2", "", { "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", "@cloudflare/workers-types": ">=4", "@electric-sql/pglite": ">=0.2.0", "@libsql/client": ">=0.10.0", "@libsql/client-wasm": ">=0.10.0", "@neondatabase/serverless": ">=0.10.0", "@op-engineering/op-sqlite": ">=2", "@opentelemetry/api": "^1.4.1", "@planetscale/database": ">=1.13", "@prisma/client": "*", "@tidbcloud/serverless": "*", "@types/better-sqlite3": "*", "@types/pg": "*", "@types/sql.js": "*", "@upstash/redis": ">=1.34.7", "@vercel/postgres": ">=0.8.0", "@xata.io/client": "*", "better-sqlite3": ">=7", "bun-types": "*", "expo-sqlite": ">=14.0.0", "gel": ">=2", "knex": "*", "kysely": "*", "mysql2": ">=2", "pg": ">=8", "postgres": ">=3", "sql.js": ">=1", "sqlite3": ">=5" }, "optionalPeers": ["@aws-sdk/client-rds-data", "@cloudflare/workers-types", "@electric-sql/pglite", "@libsql/client", "@libsql/client-wasm", "@neondatabase/serverless", "@op-engineering/op-sqlite", "@opentelemetry/api", "@planetscale/database", "@prisma/client", "@tidbcloud/serverless", "@types/better-sqlite3", "@types/pg", "@types/sql.js", "@upstash/redis", "@vercel/postgres", "@xata.io/client", "better-sqlite3", "bun-types", "expo-sqlite", "gel", "knex", "kysely", "mysql2", "pg", "postgres", "sql.js", "sqlite3"] }, "sha512-zGAqBzWWkVSFjZpwPOrmCrgO++1kZ5H/rZ4qTGeGOe18iXGVJWf3WPfHOVwFIbmi8kHjfJstC6rJomzGx8g/dQ=="], + + "dropbox": ["dropbox@10.34.0", "", { "dependencies": { "node-fetch": "^2.6.1" }, "peerDependencies": { "@types/node-fetch": "^2.5.7" } }, "sha512-5jb5/XzU0fSnq36/hEpwT5/QIep7MgqKuxghEG44xCu7HruOAjPdOb3x0geXv5O/hd0nHpQpWO+r5MjYTpMvJg=="], + + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], + + "ecdsa-sig-formatter": ["ecdsa-sig-formatter@1.0.11", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ=="], + + "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], + + "effect": ["effect@3.14.22", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-dEAC2+WFzOM19N3/3MrZ545pPb3Bla/AjHLHHCEe4Yq5fSo+GcC30lPN0sopeZo7J0fhW7Qq2Xp0hoQoxDDEDg=="], + + "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], + + "end-of-stream": ["end-of-stream@1.4.4", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q=="], + + "envalid": ["envalid@8.0.0", "", { "dependencies": { "tslib": "2.6.2" } }, "sha512-PGeYJnJB5naN0ME6SH8nFcDj9HVbLpYIfg1p5lAyM9T4cH2lwtu2fLbozC/bq+HUUOIFxhX/LP0/GmlqPHT4tQ=="], + + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], + + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + + "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], + + "esbuild": ["esbuild@0.25.5", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.5", "@esbuild/android-arm": "0.25.5", "@esbuild/android-arm64": "0.25.5", "@esbuild/android-x64": "0.25.5", "@esbuild/darwin-arm64": "0.25.5", "@esbuild/darwin-x64": "0.25.5", "@esbuild/freebsd-arm64": "0.25.5", "@esbuild/freebsd-x64": "0.25.5", "@esbuild/linux-arm": "0.25.5", "@esbuild/linux-arm64": "0.25.5", "@esbuild/linux-ia32": "0.25.5", "@esbuild/linux-loong64": "0.25.5", "@esbuild/linux-mips64el": "0.25.5", "@esbuild/linux-ppc64": "0.25.5", "@esbuild/linux-riscv64": "0.25.5", "@esbuild/linux-s390x": "0.25.5", "@esbuild/linux-x64": "0.25.5", "@esbuild/netbsd-arm64": "0.25.5", "@esbuild/netbsd-x64": "0.25.5", "@esbuild/openbsd-arm64": "0.25.5", "@esbuild/openbsd-x64": "0.25.5", "@esbuild/sunos-x64": "0.25.5", "@esbuild/win32-arm64": "0.25.5", "@esbuild/win32-ia32": "0.25.5", "@esbuild/win32-x64": "0.25.5" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ=="], + + "esbuild-register": ["esbuild-register@3.6.0", "", { "dependencies": { "debug": "^4.3.4" }, "peerDependencies": { "esbuild": ">=0.12 <1" } }, "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg=="], + + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + + "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], + + "estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], + + "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], + + "event-target-shim": ["event-target-shim@5.0.1", "", {}, "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="], + + "eventemitter3": ["eventemitter3@4.0.7", "", {}, "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="], + + "events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="], + + "expand-template": ["expand-template@2.0.3", "", {}, "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg=="], + + "express": ["express@5.1.0", "", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.0", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "finalhandler": "^2.1.0", "fresh": "^2.0.0", "http-errors": "^2.0.0", "merge-descriptors": "^2.0.0", "mime-types": "^3.0.0", "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", "proxy-addr": "^2.0.7", "qs": "^6.14.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" } }, "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA=="], + + "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], + + "fast-check": ["fast-check@3.23.2", "", { "dependencies": { "pure-rand": "^6.1.0" } }, "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A=="], + + "fast-glob": ["fast-glob@3.3.3", "", { "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" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + + "fast-redact": ["fast-redact@3.5.0", "", {}, "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A=="], + + "fastq": ["fastq@1.19.0", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA=="], + + "fdir": ["fdir@6.4.3", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw=="], + + "file-uri-to-path": ["file-uri-to-path@1.0.0", "", {}, "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="], + + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "finalhandler": ["finalhandler@2.1.0", "", { "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "on-finished": "^2.4.1", "parseurl": "^1.3.3", "statuses": "^2.0.1" } }, "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q=="], + + "follow-redirects": ["follow-redirects@1.15.9", "", {}, "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="], + + "for-each": ["for-each@0.3.4", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-kKaIINnFpzW6ffJNDjjyjrk21BkDx38c0xa/klsT8VzLCaMEefv4ZTacrcVR4DmgTeBra++jMDAfS/tS799YDw=="], + + "form-data": ["form-data@4.0.1", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "mime-types": "^2.1.12" } }, "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw=="], + + "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], + + "forwarded-parse": ["forwarded-parse@2.1.2", "", {}, "sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw=="], + + "fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="], + + "fs-constants": ["fs-constants@1.0.0", "", {}, "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "gaxios": ["gaxios@6.7.1", "", { "dependencies": { "extend": "^3.0.2", "https-proxy-agent": "^7.0.1", "is-stream": "^2.0.0", "node-fetch": "^2.6.9", "uuid": "^9.0.1" } }, "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ=="], + + "gcp-metadata": ["gcp-metadata@6.1.1", "", { "dependencies": { "gaxios": "^6.1.1", "google-logging-utils": "^0.0.2", "json-bigint": "^1.0.0" } }, "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A=="], + + "generic-pool": ["generic-pool@3.9.0", "", {}, "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g=="], + + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], + + "get-intrinsic": ["get-intrinsic@1.2.7", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "function-bind": "^1.1.2", "get-proto": "^1.0.0", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA=="], + + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + + "get-tsconfig": ["get-tsconfig@4.10.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A=="], + + "github-from-package": ["github-from-package@0.0.0", "", {}, "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw=="], + + "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "google-auth-library": ["google-auth-library@9.15.1", "", { "dependencies": { "base64-js": "^1.3.0", "ecdsa-sig-formatter": "^1.0.11", "gaxios": "^6.1.1", "gcp-metadata": "^6.1.0", "gtoken": "^7.0.0", "jws": "^4.0.0" } }, "sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng=="], + + "google-logging-utils": ["google-logging-utils@0.0.2", "", {}, "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ=="], + + "googleapis": ["googleapis@146.0.0", "", { "dependencies": { "google-auth-library": "^9.0.0", "googleapis-common": "^7.0.0" } }, "sha512-NewqvhnBZOJsugCAOo636O0BGE/xY7Cg/v8Rjm1+5LkJCjcqAzLleJ6igd5vrRExJLSKrY9uHy9iKE7r0PrfhQ=="], + + "googleapis-common": ["googleapis-common@7.2.0", "", { "dependencies": { "extend": "^3.0.2", "gaxios": "^6.0.3", "google-auth-library": "^9.7.0", "qs": "^6.7.0", "url-template": "^2.0.8", "uuid": "^9.0.0" } }, "sha512-/fhDZEJZvOV3X5jmD+fKxMqma5q2Q9nZNSF3kn1F18tpxmA86BcTxAGBQdM0N89Z3bEaIs+HVznSmFJEAmMTjA=="], + + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + + "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], + + "gtoken": ["gtoken@7.1.0", "", { "dependencies": { "gaxios": "^6.0.0", "jws": "^4.0.0" } }, "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw=="], + + "h3": ["h3@1.14.0", "", { "dependencies": { "cookie-es": "^1.2.2", "crossws": "^0.3.2", "defu": "^6.1.4", "destr": "^2.0.3", "iron-webcrypto": "^1.2.1", "ohash": "^1.1.4", "radix3": "^1.1.2", "ufo": "^1.5.4", "uncrypto": "^0.1.3", "unenv": "^1.10.0" } }, "sha512-ao22eiONdgelqcnknw0iD645qW0s9NnrJHr5OBz4WOMdBdycfSas1EQf1wXRsm+PcB2Yoj43pjBPwqIpJQTeWg=="], + + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], + + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], + + "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], + + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + + "hono": ["hono@4.6.19", "", {}, "sha512-Xw5DwU2cewEsQ1DkDCdy6aBJkEBARl5loovoL1gL3/gw81RdaPbXrNJYp3LoQpzpJ7ECC/1OFi/vn3UZTLHFEw=="], + + "http-errors": ["http-errors@2.0.0", "", { "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" } }, "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ=="], + + "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], + + "iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], + + "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], + + "import-in-the-middle": ["import-in-the-middle@1.13.1", "", { "dependencies": { "acorn": "^8.14.0", "acorn-import-attributes": "^1.9.5", "cjs-module-lexer": "^1.2.2", "module-details-from-path": "^1.0.3" } }, "sha512-k2V9wNm9B+ysuelDTHjI9d5KPc4l8zAZTGqj+pcynvWkypZd857ryzN8jNC7Pg2YZXNMJcHRPpaDyCBbNyVRpA=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], + + "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], + + "iron-session": ["iron-session@8.0.4", "", { "dependencies": { "cookie": "^0.7.2", "iron-webcrypto": "^1.2.1", "uncrypto": "^0.1.3" } }, "sha512-9ivNnaKOd08osD0lJ3i6If23GFS2LsxyMU8Gf/uBUEgm8/8CC1hrrCHFDpMo3IFbpBgwoo/eairRsaD3c5itxA=="], + + "iron-webcrypto": ["iron-webcrypto@1.2.1", "", {}, "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg=="], + + "is-arguments": ["is-arguments@1.2.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA=="], + + "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], + + "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="], + + "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "is-generator-function": ["is-generator-function@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "get-proto": "^1.0.0", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-module": ["is-module@1.0.0", "", {}, "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g=="], + + "is-nan": ["is-nan@1.3.2", "", { "dependencies": { "call-bind": "^1.0.0", "define-properties": "^1.1.3" } }, "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="], + + "is-reference": ["is-reference@1.2.1", "", { "dependencies": { "@types/estree": "*" } }, "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ=="], + + "is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="], + + "is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], + + "is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="], + + "iso-datestring-validator": ["iso-datestring-validator@2.2.2", "", {}, "sha512-yLEMkBbLZTlVQqOnQ4FiMujR6T4DEcCb1xizmvXS+OxuhwcbtynoosRzdMA69zZCShCNAbi+gJ71FxZBBXx1SA=="], + + "jose": ["jose@5.9.6", "", {}, "sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ=="], + + "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], + + "json-bigint": ["json-bigint@1.0.0", "", { "dependencies": { "bignumber.js": "^9.0.0" } }, "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ=="], + + "jsonwebtoken": ["jsonwebtoken@9.0.2", "", { "dependencies": { "jws": "^3.2.2", "lodash.includes": "^4.3.0", "lodash.isboolean": "^3.0.3", "lodash.isinteger": "^4.0.4", "lodash.isnumber": "^3.0.3", "lodash.isplainobject": "^4.0.6", "lodash.isstring": "^4.0.1", "lodash.once": "^4.0.0", "ms": "^2.1.1", "semver": "^7.5.4" } }, "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ=="], + + "jwa": ["jwa@1.4.1", "", { "dependencies": { "buffer-equal-constant-time": "1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } }, "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA=="], + + "jws": ["jws@3.2.2", "", { "dependencies": { "jwa": "^1.4.1", "safe-buffer": "^5.0.1" } }, "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA=="], + + "kysely": ["kysely@0.27.5", "", {}, "sha512-s7hZHcQeSNKpzCkHRm8yA+0JPLjncSWnjb+2TIElwS2JAqYr+Kv3Ess+9KFfJS0C1xcQ1i9NkNHpWwCYpHMWsA=="], + + "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], + + "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="], + + "lodash.includes": ["lodash.includes@4.3.0", "", {}, "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w=="], + + "lodash.isboolean": ["lodash.isboolean@3.0.3", "", {}, "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg=="], + + "lodash.isinteger": ["lodash.isinteger@4.0.4", "", {}, "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA=="], + + "lodash.isnumber": ["lodash.isnumber@3.0.3", "", {}, "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw=="], + + "lodash.isplainobject": ["lodash.isplainobject@4.0.6", "", {}, "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="], + + "lodash.isstring": ["lodash.isstring@4.0.1", "", {}, "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw=="], + + "lodash.once": ["lodash.once@4.1.1", "", {}, "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg=="], + + "long": ["long@5.3.2", "", {}, "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="], + + "lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + + "magic-string": ["magic-string@0.30.17", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA=="], + + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + + "media-typer": ["media-typer@1.1.0", "", {}, "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="], + + "merge-descriptors": ["merge-descriptors@2.0.0", "", {}, "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g=="], + + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + + "methods": ["methods@1.1.2", "", {}, "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="], + + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "mime": ["mime@1.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="], + + "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "mimic-response": ["mimic-response@3.1.0", "", {}, "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="], + + "minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="], + + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + + "mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="], + + "mkdirp-classic": ["mkdirp-classic@0.5.3", "", {}, "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="], + + "module-details-from-path": ["module-details-from-path@1.0.3", "", {}, "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "multiformats": ["multiformats@9.9.0", "", {}, "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg=="], + + "napi-build-utils": ["napi-build-utils@2.0.0", "", {}, "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA=="], + + "nats": ["nats@2.29.2", "", { "dependencies": { "nkeys.js": "1.1.0" } }, "sha512-HfzEZa/67fAmRXchLv/sFGeZFF27TRf6kuNbuze2+Md+0M4xADoiUf7YColV9CMjlf2nIkFPnlXcpOTdtlhbPg=="], + + "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], + + "nkeys.js": ["nkeys.js@1.1.0", "", { "dependencies": { "tweetnacl": "1.0.3" } }, "sha512-tB/a0shZL5UZWSwsoeyqfTszONTt4k2YS0tuQioMOD180+MbombYVgzDUYHlx+gejYK6rgf08n/2Df99WY0Sxg=="], + + "node-abi": ["node-abi@3.74.0", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w=="], + + "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], + + "node-fetch-native": ["node-fetch-native@1.6.6", "", {}, "sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ=="], + + "node-gyp-build": ["node-gyp-build@3.9.0", "", { "bin": { "node-gyp-build": "./bin.js", "node-gyp-build-test": "./build-test.js", "node-gyp-build-optional": "./optional.js" } }, "sha512-zLcTg6P4AbcHPq465ZMFNXx7XpKKJh+7kkN699NiQWisR2uWYOWNWqRHAmbnmKiL4e9aLSlmy5U7rEMUXV59+A=="], + + "node-gyp-build-optional-packages": ["node-gyp-build-optional-packages@5.1.1", "", { "dependencies": { "detect-libc": "^2.0.1" }, "bin": { "node-gyp-build-optional-packages": "bin.js", "node-gyp-build-optional-packages-test": "build-test.js", "node-gyp-build-optional-packages-optional": "optional.js" } }, "sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw=="], + + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], + + "object-inspect": ["object-inspect@1.13.3", "", {}, "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA=="], + + "object-is": ["object-is@1.1.6", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1" } }, "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q=="], + + "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="], + + "object.assign": ["object.assign@4.1.7", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0", "has-symbols": "^1.1.0", "object-keys": "^1.1.1" } }, "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw=="], + + "ofetch": ["ofetch@1.4.1", "", { "dependencies": { "destr": "^2.0.3", "node-fetch-native": "^1.6.4", "ufo": "^1.5.4" } }, "sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw=="], + + "ohash": ["ohash@1.1.4", "", {}, "sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g=="], + + "on-exit-leak-free": ["on-exit-leak-free@2.1.2", "", {}, "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA=="], + + "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], + + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "openapi3-ts": ["openapi3-ts@4.4.0", "", { "dependencies": { "yaml": "^2.5.0" } }, "sha512-9asTNB9IkKEzWMcHmVZE7Ts3kC9G7AFHfs8i7caD8HbI76gEjdkId4z/AkP83xdZsH7PLAnnbl47qZkXuxpArw=="], + + "p-finally": ["p-finally@1.0.0", "", {}, "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow=="], + + "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], + + "p-queue": ["p-queue@6.6.2", "", { "dependencies": { "eventemitter3": "^4.0.4", "p-timeout": "^3.2.0" } }, "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ=="], + + "p-timeout": ["p-timeout@3.2.0", "", { "dependencies": { "p-finally": "^1.0.0" } }, "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg=="], + + "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], + + "path-browserify": ["path-browserify@1.0.1", "", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="], + + "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], + + "path-to-regexp": ["path-to-regexp@0.1.12", "", {}, "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ=="], + + "pathe": ["pathe@1.1.2", "", {}, "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="], + + "pg": ["pg@8.13.3", "", { "dependencies": { "pg-connection-string": "^2.7.0", "pg-pool": "^3.7.1", "pg-protocol": "^1.7.1", "pg-types": "^2.1.0", "pgpass": "1.x" }, "optionalDependencies": { "pg-cloudflare": "^1.1.1" }, "peerDependencies": { "pg-native": ">=3.0.1" }, "optionalPeers": ["pg-native"] }, "sha512-P6tPt9jXbL9HVu/SSRERNYaYG++MjnscnegFh9pPHihfoBSujsrka0hyuymMzeJKFWrcG8wvCKy8rCe8e5nDUQ=="], + + "pg-cloudflare": ["pg-cloudflare@1.1.1", "", {}, "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q=="], + + "pg-connection-string": ["pg-connection-string@2.7.0", "", {}, "sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA=="], + + "pg-int8": ["pg-int8@1.0.1", "", {}, "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw=="], + + "pg-pool": ["pg-pool@3.7.1", "", { "peerDependencies": { "pg": ">=8.0" } }, "sha512-xIOsFoh7Vdhojas6q3596mXFsR8nwBQBXX5JiV7p9buEVAGqYL4yFzclON5P9vFrpu1u7Zwl2oriyDa89n0wbw=="], + + "pg-protocol": ["pg-protocol@1.7.1", "", {}, "sha512-gjTHWGYWsEgy9MsY0Gp6ZJxV24IjDqdpTW7Eh0x+WfJLFsm/TJx1MzL6T0D88mBvkpxotCQ6TwW6N+Kko7lhgQ=="], + + "pg-types": ["pg-types@2.2.0", "", { "dependencies": { "pg-int8": "1.0.1", "postgres-array": "~2.0.0", "postgres-bytea": "~1.0.0", "postgres-date": "~1.0.4", "postgres-interval": "^1.1.0" } }, "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA=="], + + "pgpass": ["pgpass@1.0.5", "", { "dependencies": { "split2": "^4.1.0" } }, "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug=="], + + "picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], + + "pino": ["pino@8.21.0", "", { "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^1.2.0", "pino-std-serializers": "^6.0.0", "process-warning": "^3.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", "sonic-boom": "^3.7.0", "thread-stream": "^2.6.0" }, "bin": { "pino": "bin.js" } }, "sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q=="], + + "pino-abstract-transport": ["pino-abstract-transport@1.2.0", "", { "dependencies": { "readable-stream": "^4.0.0", "split2": "^4.0.0" } }, "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q=="], + + "pino-std-serializers": ["pino-std-serializers@6.2.2", "", {}, "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA=="], + + "pkgroll": ["pkgroll@2.6.1", "", { "dependencies": { "@rollup/plugin-alias": "^5.1.1", "@rollup/plugin-commonjs": "^28.0.2", "@rollup/plugin-dynamic-import-vars": "^2.1.5", "@rollup/plugin-inject": "^5.0.5", "@rollup/plugin-json": "^6.1.0", "@rollup/plugin-node-resolve": "^16.0.0", "@rollup/plugin-replace": "^6.0.2", "@rollup/pluginutils": "^5.1.4", "esbuild": "^0.24.2", "magic-string": "^0.30.17", "rollup": "^4.29.1" }, "peerDependencies": { "typescript": "^4.1 || ^5.0" }, "optionalPeers": ["typescript"], "bin": { "pkgroll": "dist/cli.js" } }, "sha512-n9ll3LHCvFVsoXzxAFN/Z+kO4E1ByRW/6YdcreLGKj6b7qpRnZI14Xd7nSfhhWcrF67aAVoT/00wGG7VQsSu9Q=="], + + "possible-typed-array-names": ["possible-typed-array-names@1.0.0", "", {}, "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q=="], + + "postgres-array": ["postgres-array@2.0.0", "", {}, "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA=="], + + "postgres-bytea": ["postgres-bytea@1.0.0", "", {}, "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w=="], + + "postgres-date": ["postgres-date@1.0.7", "", {}, "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q=="], + + "postgres-interval": ["postgres-interval@1.2.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ=="], + + "pprof-format": ["pprof-format@2.1.0", "", {}, "sha512-0+G5bHH0RNr8E5hoZo/zJYsL92MhkZjwrHp3O2IxmY8RJL9ooKeuZ8Tm0ZNBw5sGZ9TiM71sthTjWoR2Vf5/xw=="], + + "prebuild-install": ["prebuild-install@7.1.3", "", { "dependencies": { "detect-libc": "^2.0.0", "expand-template": "^2.0.3", "github-from-package": "0.0.0", "minimist": "^1.2.3", "mkdirp-classic": "^0.5.3", "napi-build-utils": "^2.0.0", "node-abi": "^3.3.0", "pump": "^3.0.0", "rc": "^1.2.7", "simple-get": "^4.0.0", "tar-fs": "^2.0.0", "tunnel-agent": "^0.6.0" }, "bin": { "prebuild-install": "bin.js" } }, "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug=="], + + "prettier": ["prettier@3.4.2", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ=="], + + "process": ["process@0.11.10", "", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="], + + "process-warning": ["process-warning@3.0.0", "", {}, "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ=="], + + "protobufjs": ["protobufjs@7.5.0", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.4", "@protobufjs/eventemitter": "^1.1.0", "@protobufjs/fetch": "^1.1.0", "@protobufjs/float": "^1.0.2", "@protobufjs/inquire": "^1.1.0", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.0", "@types/node": ">=13.7.0", "long": "^5.0.0" } }, "sha512-Z2E/kOY1QjoMlCytmexzYfDm/w5fKAiRwpSzGtdnXW1zC88Z2yXazHHrOtwCzn+7wSxyE8PYM4rvVcMphF9sOA=="], + + "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], + + "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], + + "psl": ["psl@1.15.0", "", { "dependencies": { "punycode": "^2.3.1" } }, "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w=="], + + "pump": ["pump@3.0.2", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw=="], + + "punycode": ["punycode@1.4.1", "", {}, "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ=="], + + "pure-rand": ["pure-rand@6.1.0", "", {}, "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA=="], + + "qs": ["qs@6.14.0", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w=="], + + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + + "quick-format-unescaped": ["quick-format-unescaped@4.0.4", "", {}, "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg=="], + + "radix3": ["radix3@1.1.2", "", {}, "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA=="], + + "ramda": ["ramda@0.30.1", "", {}, "sha512-tEF5I22zJnuclswcZMc8bDIrwRHRzf+NqVEmqg50ShAZMP7MWeR/RGDthfM/p+BlqvF2fXAzpn8i+SJcYD3alw=="], + + "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], + + "rate-limiter-flexible": ["rate-limiter-flexible@2.4.2", "", {}, "sha512-rMATGGOdO1suFyf/mI5LYhts71g1sbdhmd6YvdiXO2gJnd42Tt6QS4JUKJKSWVVkMtBacm6l40FR7Trjo6Iruw=="], + + "raw-body": ["raw-body@3.0.0", "", { "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.6.3", "unpipe": "1.0.0" } }, "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g=="], + + "rc": ["rc@1.2.8", "", { "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "bin": { "rc": "./cli.js" } }, "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="], + + "readable-stream": ["readable-stream@4.7.0", "", { "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", "process": "^0.11.10", "string_decoder": "^1.3.0" } }, "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="], + + "readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], + + "real-require": ["real-require@0.2.0", "", {}, "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg=="], + + "redis": ["redis@4.7.0", "", { "dependencies": { "@redis/bloom": "1.2.0", "@redis/client": "1.6.0", "@redis/graph": "1.1.1", "@redis/json": "1.0.7", "@redis/search": "1.2.0", "@redis/time-series": "1.1.0" } }, "sha512-zvmkHEAdGMn+hMRXuMBtu4Vo5P6rHQjLoHftu+lBqq8ZTA3RCVC/WzD790bkKKiNFp7d5/9PcSD19fJyyRvOdQ=="], + + "regenerator-runtime": ["regenerator-runtime@0.13.11", "", {}, "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="], + + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + + "require-in-the-middle": ["require-in-the-middle@7.5.2", "", { "dependencies": { "debug": "^4.3.5", "module-details-from-path": "^1.0.3", "resolve": "^1.22.8" } }, "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ=="], + + "resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="], + + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], + + "reusify": ["reusify@1.0.4", "", {}, "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="], + + "rollup": ["rollup@4.34.0", "", { "dependencies": { "@types/estree": "1.0.6" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.34.0", "@rollup/rollup-android-arm64": "4.34.0", "@rollup/rollup-darwin-arm64": "4.34.0", "@rollup/rollup-darwin-x64": "4.34.0", "@rollup/rollup-freebsd-arm64": "4.34.0", "@rollup/rollup-freebsd-x64": "4.34.0", "@rollup/rollup-linux-arm-gnueabihf": "4.34.0", "@rollup/rollup-linux-arm-musleabihf": "4.34.0", "@rollup/rollup-linux-arm64-gnu": "4.34.0", "@rollup/rollup-linux-arm64-musl": "4.34.0", "@rollup/rollup-linux-loongarch64-gnu": "4.34.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.34.0", "@rollup/rollup-linux-riscv64-gnu": "4.34.0", "@rollup/rollup-linux-s390x-gnu": "4.34.0", "@rollup/rollup-linux-x64-gnu": "4.34.0", "@rollup/rollup-linux-x64-musl": "4.34.0", "@rollup/rollup-win32-arm64-msvc": "4.34.0", "@rollup/rollup-win32-ia32-msvc": "4.34.0", "@rollup/rollup-win32-x64-msvc": "4.34.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-+4C/cgJ9w6sudisA0nZz0+O7lTP9a3CzNLsoDwaRumM8QHwghUsu6tqHXiTmNUp/rqNiM14++7dkzHDyCRs0Jg=="], + + "router": ["router@2.2.0", "", { "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", "is-promise": "^4.0.0", "parseurl": "^1.3.3", "path-to-regexp": "^8.0.0" } }, "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ=="], + + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "safe-regex-test": ["safe-regex-test@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw=="], + + "safe-stable-stringify": ["safe-stable-stringify@2.5.0", "", {}, "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA=="], + + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + + "semver": ["semver@7.7.0", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ=="], + + "send": ["send@1.2.0", "", { "dependencies": { "debug": "^4.3.5", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.0", "mime-types": "^3.0.1", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.1" } }, "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw=="], + + "serve-static": ["serve-static@2.2.0", "", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ=="], + + "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="], + + "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], + + "shimmer": ["shimmer@1.2.1", "", {}, "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw=="], + + "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], + + "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="], + + "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], + + "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], + + "simple-concat": ["simple-concat@1.0.1", "", {}, "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="], + + "simple-get": ["simple-get@4.0.1", "", { "dependencies": { "decompress-response": "^6.0.0", "once": "^1.3.1", "simple-concat": "^1.0.0" } }, "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA=="], + + "sonic-boom": ["sonic-boom@3.8.1", "", { "dependencies": { "atomic-sleep": "^1.0.0" } }, "sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg=="], + + "source-map": ["source-map@0.7.4", "", {}, "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA=="], + + "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], + + "split2": ["split2@4.2.0", "", {}, "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg=="], + + "statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], + + "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + + "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], + + "tar-fs": ["tar-fs@2.1.2", "", { "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", "tar-stream": "^2.1.4" } }, "sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA=="], + + "tar-stream": ["tar-stream@2.2.0", "", { "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" } }, "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ=="], + + "thread-stream": ["thread-stream@2.7.0", "", { "dependencies": { "real-require": "^0.2.0" } }, "sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw=="], + + "tlds": ["tlds@1.255.0", "", { "bin": { "tlds": "bin.js" } }, "sha512-tcwMRIioTcF/FcxLev8MJWxCp+GUALRhFEqbDoZrnowmKSGqPrl5pqS+Sut2m8BgJ6S4FExCSSpGffZ0Tks6Aw=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], + + "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], + + "ts-morph": ["ts-morph@16.0.0", "", { "dependencies": { "@ts-morph/common": "~0.17.0", "code-block-writer": "^11.0.3" } }, "sha512-jGNF0GVpFj0orFw55LTsQxVYEUOCWBAbR5Ls7fTYE5pQsbW18ssTb/6UXx/GYAEjS+DQTp8VoTw0vqYMiaaQuw=="], + + "ts-toolbelt": ["ts-toolbelt@9.6.0", "", {}, "sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w=="], + + "tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "tsx": ["tsx@4.19.2", "", { "dependencies": { "esbuild": "~0.23.0", "get-tsconfig": "^4.7.5" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g=="], + + "tunnel-agent": ["tunnel-agent@0.6.0", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w=="], + + "tweetnacl": ["tweetnacl@1.0.3", "", {}, "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw=="], + + "type-is": ["type-is@2.0.1", "", { "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw=="], + + "types-ramda": ["types-ramda@0.30.1", "", { "dependencies": { "ts-toolbelt": "^9.6.0" } }, "sha512-1HTsf5/QVRmLzcGfldPFvkVsAdi1db1BBKzi7iW3KBUlOICg/nKnFS+jGqDJS3YD8VsWbAh7JiHeBvbsw8RPxA=="], + + "typescript": ["typescript@5.7.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw=="], + + "ufo": ["ufo@1.5.4", "", {}, "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ=="], + + "uint8arrays": ["uint8arrays@3.0.0", "", { "dependencies": { "multiformats": "^9.4.2" } }, "sha512-HRCx0q6O9Bfbp+HHSfQQKD7wU70+lydKVt4EghkdOvlK/NlrF90z+eXV34mUd48rNvVJXwkrMSPpCATkct8fJA=="], + + "uncrypto": ["uncrypto@0.1.3", "", {}, "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="], + + "undici": ["undici@6.21.1", "", {}, "sha512-q/1rj5D0/zayJB2FraXdaWxbhWiNKDvu8naDT2dl1yTlvJp4BLtOcp2a5BvgGNQpYYJzau7tf1WgKv3b+7mqpQ=="], + + "undici-types": ["undici-types@6.20.0", "", {}, "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="], + + "unenv": ["unenv@1.10.0", "", { "dependencies": { "consola": "^3.2.3", "defu": "^6.1.4", "mime": "^3.0.0", "node-fetch-native": "^1.6.4", "pathe": "^1.1.2" } }, "sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ=="], + + "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], + + "unstorage": ["unstorage@1.14.4", "", { "dependencies": { "anymatch": "^3.1.3", "chokidar": "^3.6.0", "destr": "^2.0.3", "h3": "^1.13.0", "lru-cache": "^10.4.3", "node-fetch-native": "^1.6.4", "ofetch": "^1.4.1", "ufo": "^1.5.4" }, "peerDependencies": { "@azure/app-configuration": "^1.8.0", "@azure/cosmos": "^4.2.0", "@azure/data-tables": "^13.3.0", "@azure/identity": "^4.5.0", "@azure/keyvault-secrets": "^4.9.0", "@azure/storage-blob": "^12.26.0", "@capacitor/preferences": "^6.0.3", "@deno/kv": ">=0.8.4", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.34.3", "@vercel/blob": ">=0.27.0", "@vercel/kv": "^1.0.1", "aws4fetch": "^1.0.20", "db0": ">=0.2.1", "idb-keyval": "^6.2.1", "ioredis": "^5.4.2", "uploadthing": "^7.4.1" }, "optionalPeers": ["@azure/app-configuration", "@azure/cosmos", "@azure/data-tables", "@azure/identity", "@azure/keyvault-secrets", "@azure/storage-blob", "@capacitor/preferences", "@deno/kv", "@netlify/blobs", "@planetscale/database", "@upstash/redis", "@vercel/blob", "@vercel/kv", "aws4fetch", "db0", "idb-keyval", "ioredis", "uploadthing"] }, "sha512-1SYeamwuYeQJtJ/USE1x4l17LkmQBzg7deBJ+U9qOBoHo15d1cDxG4jM31zKRgF7pG0kirZy4wVMX6WL6Zoscg=="], + + "url": ["url@0.11.4", "", { "dependencies": { "punycode": "^1.4.1", "qs": "^6.12.3" } }, "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg=="], + + "url-template": ["url-template@2.0.8", "", {}, "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw=="], + + "util": ["util@0.12.5", "", { "dependencies": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", "is-generator-function": "^1.0.7", "is-typed-array": "^1.1.3", "which-typed-array": "^1.1.2" } }, "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "utils-merge": ["utils-merge@1.0.1", "", {}, "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="], + + "uuid": ["uuid@11.1.0", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A=="], + + "varint": ["varint@6.0.0", "", {}, "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg=="], + + "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], + + "webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], + + "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], + + "which-typed-array": ["which-typed-array@1.1.18", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.3", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA=="], + + "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + + "ws": ["ws@8.18.1", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w=="], + + "xtend": ["xtend@4.0.2", "", {}, "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="], + + "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + + "yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + + "yaml": ["yaml@2.7.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA=="], + + "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + + "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + + "yesno": ["yesno@0.4.0", "", {}, "sha512-tdBxmHvbXPBKYIg81bMCB7bVeDmHkRzk5rVJyYYXurwKkHq/MCd8rz4HSJUP7hW0H2NlXiq8IFiWvYKEHhlotA=="], + + "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], + + "zod": ["zod@3.24.1", "", {}, "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A=="], + + "zx": ["zx@8.5.4", "", { "bin": { "zx": "build/cli.js" } }, "sha512-44oKea9Sa8ZnOkTnS6fRJpg3quzgnbB43nLrVfYnqE86J4sxgZMUDLezzKET/FdOAVkF4X+Alm9Bume+W+RW9Q=="], + + "@atproto-labs/fetch-node/ipaddr.js": ["ipaddr.js@2.2.0", "", {}, "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA=="], + + "@atproto-labs/identity-resolver/@atproto/syntax": ["@atproto/syntax@0.4.0", "", {}, "sha512-b9y5ceHS8YKOfP3mdKmwAx5yVj9294UN7FG2XzP6V5aKUdFazEYRnR9m5n5ZQFKa3GNvz7de9guZCJ/sUTcOAA=="], + + "@atproto/lex-cli/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "@atproto/oauth-client/@atproto/xrpc": ["@atproto/xrpc@0.6.12", "", { "dependencies": { "@atproto/lexicon": "^0.4.10", "zod": "^3.23.8" } }, "sha512-Ut3iISNLujlmY9Gu8sNU+SPDJDvqlVzWddU8qUr0Yae5oD4SguaUFjjhireMGhQ3M5E0KljQgDbTmnBo1kIZ3w=="], + + "@atproto/sync/ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], + + "@atproto/xrpc-server/express": ["express@4.21.2", "", { "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.19.0", "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" } }, "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA=="], + + "@atproto/xrpc-server/ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], + + "@esbuild-kit/core-utils/esbuild": ["esbuild@0.18.20", "", { "optionalDependencies": { "@esbuild/android-arm": "0.18.20", "@esbuild/android-arm64": "0.18.20", "@esbuild/android-x64": "0.18.20", "@esbuild/darwin-arm64": "0.18.20", "@esbuild/darwin-x64": "0.18.20", "@esbuild/freebsd-arm64": "0.18.20", "@esbuild/freebsd-x64": "0.18.20", "@esbuild/linux-arm": "0.18.20", "@esbuild/linux-arm64": "0.18.20", "@esbuild/linux-ia32": "0.18.20", "@esbuild/linux-loong64": "0.18.20", "@esbuild/linux-mips64el": "0.18.20", "@esbuild/linux-ppc64": "0.18.20", "@esbuild/linux-riscv64": "0.18.20", "@esbuild/linux-s390x": "0.18.20", "@esbuild/linux-x64": "0.18.20", "@esbuild/netbsd-x64": "0.18.20", "@esbuild/openbsd-x64": "0.18.20", "@esbuild/sunos-x64": "0.18.20", "@esbuild/win32-arm64": "0.18.20", "@esbuild/win32-ia32": "0.18.20", "@esbuild/win32-x64": "0.18.20" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA=="], + + "accepts/mime-types": ["mime-types@3.0.1", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA=="], + + "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "bl/buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], + + "bl/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + + "express/mime-types": ["mime-types@3.0.1", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA=="], + + "gaxios/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], + + "google-auth-library/jws": ["jws@4.0.0", "", { "dependencies": { "jwa": "^2.0.0", "safe-buffer": "^5.0.1" } }, "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg=="], + + "googleapis-common/qs": ["qs@6.13.0", "", { "dependencies": { "side-channel": "^1.0.6" } }, "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg=="], + + "googleapis-common/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], + + "gtoken/jws": ["jws@4.0.0", "", { "dependencies": { "jwa": "^2.0.0", "safe-buffer": "^5.0.1" } }, "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg=="], + + "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "pkgroll/esbuild": ["esbuild@0.24.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.24.2", "@esbuild/android-arm": "0.24.2", "@esbuild/android-arm64": "0.24.2", "@esbuild/android-x64": "0.24.2", "@esbuild/darwin-arm64": "0.24.2", "@esbuild/darwin-x64": "0.24.2", "@esbuild/freebsd-arm64": "0.24.2", "@esbuild/freebsd-x64": "0.24.2", "@esbuild/linux-arm": "0.24.2", "@esbuild/linux-arm64": "0.24.2", "@esbuild/linux-ia32": "0.24.2", "@esbuild/linux-loong64": "0.24.2", "@esbuild/linux-mips64el": "0.24.2", "@esbuild/linux-ppc64": "0.24.2", "@esbuild/linux-riscv64": "0.24.2", "@esbuild/linux-s390x": "0.24.2", "@esbuild/linux-x64": "0.24.2", "@esbuild/netbsd-arm64": "0.24.2", "@esbuild/netbsd-x64": "0.24.2", "@esbuild/openbsd-arm64": "0.24.2", "@esbuild/openbsd-x64": "0.24.2", "@esbuild/sunos-x64": "0.24.2", "@esbuild/win32-arm64": "0.24.2", "@esbuild/win32-ia32": "0.24.2", "@esbuild/win32-x64": "0.24.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA=="], + + "psl/punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + + "readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "router/path-to-regexp": ["path-to-regexp@8.2.0", "", {}, "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ=="], + + "send/mime-types": ["mime-types@3.0.1", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA=="], + + "source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "tar-stream/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + + "tsx/esbuild": ["esbuild@0.23.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.23.1", "@esbuild/android-arm": "0.23.1", "@esbuild/android-arm64": "0.23.1", "@esbuild/android-x64": "0.23.1", "@esbuild/darwin-arm64": "0.23.1", "@esbuild/darwin-x64": "0.23.1", "@esbuild/freebsd-arm64": "0.23.1", "@esbuild/freebsd-x64": "0.23.1", "@esbuild/linux-arm": "0.23.1", "@esbuild/linux-arm64": "0.23.1", "@esbuild/linux-ia32": "0.23.1", "@esbuild/linux-loong64": "0.23.1", "@esbuild/linux-mips64el": "0.23.1", "@esbuild/linux-ppc64": "0.23.1", "@esbuild/linux-riscv64": "0.23.1", "@esbuild/linux-s390x": "0.23.1", "@esbuild/linux-x64": "0.23.1", "@esbuild/netbsd-x64": "0.23.1", "@esbuild/openbsd-arm64": "0.23.1", "@esbuild/openbsd-x64": "0.23.1", "@esbuild/sunos-x64": "0.23.1", "@esbuild/win32-arm64": "0.23.1", "@esbuild/win32-ia32": "0.23.1", "@esbuild/win32-x64": "0.23.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg=="], + + "type-is/mime-types": ["mime-types@3.0.1", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA=="], + + "unenv/mime": ["mime@3.0.0", "", { "bin": { "mime": "cli.js" } }, "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A=="], + + "url/qs": ["qs@6.13.0", "", { "dependencies": { "side-channel": "^1.0.6" } }, "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg=="], + + "@atproto/oauth-client/@atproto/xrpc/@atproto/lexicon": ["@atproto/lexicon@0.4.10", "", { "dependencies": { "@atproto/common-web": "^0.4.1", "@atproto/syntax": "^0.4.0", "iso-datestring-validator": "^2.2.2", "multiformats": "^9.9.0", "zod": "^3.23.8" } }, "sha512-uDbP20vetBgtXPuxoyRcvOGBt2gNe1dFc9yYKcb6jWmXfseHiGTnIlORJOLBXIT2Pz15Eap4fLxAu6zFAykD5A=="], + + "@atproto/xrpc-server/express/accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="], + + "@atproto/xrpc-server/express/body-parser": ["body-parser@1.20.3", "", { "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" } }, "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g=="], + + "@atproto/xrpc-server/express/content-disposition": ["content-disposition@0.5.4", "", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ=="], + + "@atproto/xrpc-server/express/cookie": ["cookie@0.7.1", "", {}, "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w=="], + + "@atproto/xrpc-server/express/cookie-signature": ["cookie-signature@1.0.6", "", {}, "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="], + + "@atproto/xrpc-server/express/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "@atproto/xrpc-server/express/finalhandler": ["finalhandler@1.3.1", "", { "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", "statuses": "2.0.1", "unpipe": "~1.0.0" } }, "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ=="], + + "@atproto/xrpc-server/express/fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="], + + "@atproto/xrpc-server/express/merge-descriptors": ["merge-descriptors@1.0.3", "", {}, "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ=="], + + "@atproto/xrpc-server/express/qs": ["qs@6.13.0", "", { "dependencies": { "side-channel": "^1.0.6" } }, "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg=="], + + "@atproto/xrpc-server/express/send": ["send@0.19.0", "", { "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "2.4.1", "range-parser": "~1.2.1", "statuses": "2.0.1" } }, "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw=="], + + "@atproto/xrpc-server/express/serve-static": ["serve-static@1.16.2", "", { "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "0.19.0" } }, "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw=="], + + "@atproto/xrpc-server/express/type-is": ["type-is@1.6.18", "", { "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" } }, "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.18.20", "", { "os": "android", "cpu": "arm" }, "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.18.20", "", { "os": "android", "cpu": "arm64" }, "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.18.20", "", { "os": "android", "cpu": "x64" }, "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.18.20", "", { "os": "darwin", "cpu": "arm64" }, "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.18.20", "", { "os": "darwin", "cpu": "x64" }, "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.18.20", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.18.20", "", { "os": "freebsd", "cpu": "x64" }, "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.18.20", "", { "os": "linux", "cpu": "arm" }, "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.18.20", "", { "os": "linux", "cpu": "arm64" }, "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.18.20", "", { "os": "linux", "cpu": "ia32" }, "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.18.20", "", { "os": "linux", "cpu": "none" }, "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.18.20", "", { "os": "linux", "cpu": "none" }, "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.18.20", "", { "os": "linux", "cpu": "ppc64" }, "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.18.20", "", { "os": "linux", "cpu": "none" }, "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.18.20", "", { "os": "linux", "cpu": "s390x" }, "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.18.20", "", { "os": "linux", "cpu": "x64" }, "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.18.20", "", { "os": "none", "cpu": "x64" }, "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.18.20", "", { "os": "openbsd", "cpu": "x64" }, "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.18.20", "", { "os": "sunos", "cpu": "x64" }, "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.18.20", "", { "os": "win32", "cpu": "arm64" }, "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.18.20", "", { "os": "win32", "cpu": "ia32" }, "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.18.20", "", { "os": "win32", "cpu": "x64" }, "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ=="], + + "accepts/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], + + "express/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], + + "google-auth-library/jws/jwa": ["jwa@2.0.0", "", { "dependencies": { "buffer-equal-constant-time": "1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } }, "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA=="], + + "gtoken/jws/jwa": ["jwa@2.0.0", "", { "dependencies": { "buffer-equal-constant-time": "1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } }, "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA=="], + + "pkgroll/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.24.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA=="], + + "pkgroll/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.24.2", "", { "os": "android", "cpu": "arm" }, "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q=="], + + "pkgroll/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.24.2", "", { "os": "android", "cpu": "arm64" }, "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg=="], + + "pkgroll/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.24.2", "", { "os": "android", "cpu": "x64" }, "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw=="], + + "pkgroll/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.24.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA=="], + + "pkgroll/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.24.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA=="], + + "pkgroll/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.24.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg=="], + + "pkgroll/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.24.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q=="], + + "pkgroll/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.24.2", "", { "os": "linux", "cpu": "arm" }, "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA=="], + + "pkgroll/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.24.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg=="], + + "pkgroll/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.24.2", "", { "os": "linux", "cpu": "ia32" }, "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw=="], + + "pkgroll/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ=="], + + "pkgroll/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw=="], + + "pkgroll/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.24.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw=="], + + "pkgroll/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q=="], + + "pkgroll/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.24.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw=="], + + "pkgroll/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.24.2", "", { "os": "linux", "cpu": "x64" }, "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q=="], + + "pkgroll/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.24.2", "", { "os": "none", "cpu": "arm64" }, "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw=="], + + "pkgroll/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.24.2", "", { "os": "none", "cpu": "x64" }, "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw=="], + + "pkgroll/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.24.2", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A=="], + + "pkgroll/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.24.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA=="], + + "pkgroll/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.24.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig=="], + + "pkgroll/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.24.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ=="], + + "pkgroll/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.24.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA=="], + + "pkgroll/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.24.2", "", { "os": "win32", "cpu": "x64" }, "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg=="], + + "send/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], + + "tsx/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.23.1", "", { "os": "aix", "cpu": "ppc64" }, "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ=="], + + "tsx/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.23.1", "", { "os": "android", "cpu": "arm" }, "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ=="], + + "tsx/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.23.1", "", { "os": "android", "cpu": "arm64" }, "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw=="], + + "tsx/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.23.1", "", { "os": "android", "cpu": "x64" }, "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg=="], + + "tsx/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.23.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q=="], + + "tsx/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.23.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw=="], + + "tsx/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.23.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA=="], + + "tsx/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.23.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g=="], + + "tsx/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.23.1", "", { "os": "linux", "cpu": "arm" }, "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ=="], + + "tsx/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.23.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g=="], + + "tsx/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.23.1", "", { "os": "linux", "cpu": "ia32" }, "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ=="], + + "tsx/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.23.1", "", { "os": "linux", "cpu": "none" }, "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw=="], + + "tsx/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.23.1", "", { "os": "linux", "cpu": "none" }, "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q=="], + + "tsx/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.23.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw=="], + + "tsx/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.23.1", "", { "os": "linux", "cpu": "none" }, "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA=="], + + "tsx/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.23.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw=="], + + "tsx/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.23.1", "", { "os": "linux", "cpu": "x64" }, "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ=="], + + "tsx/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.23.1", "", { "os": "none", "cpu": "x64" }, "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA=="], + + "tsx/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.23.1", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q=="], + + "tsx/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.23.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA=="], + + "tsx/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.23.1", "", { "os": "sunos", "cpu": "x64" }, "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA=="], + + "tsx/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.23.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A=="], + + "tsx/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.23.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ=="], + + "tsx/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.23.1", "", { "os": "win32", "cpu": "x64" }, "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg=="], + + "type-is/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], + + "@atproto/oauth-client/@atproto/xrpc/@atproto/lexicon/@atproto/common-web": ["@atproto/common-web@0.4.1", "", { "dependencies": { "graphemer": "^1.4.0", "multiformats": "^9.9.0", "uint8arrays": "3.0.0", "zod": "^3.23.8" } }, "sha512-Ghh+djHYMAUCktLKwr2IuGgtjcwSWGudp+K7+N7KBA9pDDloOXUEY8Agjc5SHSo9B1QIEFkegClU5n+apn2e0w=="], + + "@atproto/oauth-client/@atproto/xrpc/@atproto/lexicon/@atproto/syntax": ["@atproto/syntax@0.4.0", "", {}, "sha512-b9y5ceHS8YKOfP3mdKmwAx5yVj9294UN7FG2XzP6V5aKUdFazEYRnR9m5n5ZQFKa3GNvz7de9guZCJ/sUTcOAA=="], + + "@atproto/xrpc-server/express/accepts/negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], + + "@atproto/xrpc-server/express/body-parser/iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], + + "@atproto/xrpc-server/express/body-parser/raw-body": ["raw-body@2.5.2", "", { "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" } }, "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA=="], + + "@atproto/xrpc-server/express/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "@atproto/xrpc-server/express/send/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="], + + "@atproto/xrpc-server/express/type-is/media-typer": ["media-typer@0.3.0", "", {}, "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="], + } +} diff --git a/apps/api/drizzle.config.ts b/apps/api/drizzle.config.ts new file mode 100644 index 00000000..6363f4b3 --- /dev/null +++ b/apps/api/drizzle.config.ts @@ -0,0 +1,10 @@ +import "dotenv/config"; +import { defineConfig } from "drizzle-kit"; + +export default defineConfig({ + dialect: "postgresql", + schema: "./src/schema", + dbCredentials: { + url: process.env.POSTGRES_URL!, + }, +}); diff --git a/apps/api/drizzle/0000_init.sql b/apps/api/drizzle/0000_init.sql new file mode 100644 index 00000000..fcf11f1e --- /dev/null +++ b/apps/api/drizzle/0000_init.sql @@ -0,0 +1,348 @@ +CREATE TABLE "album_tracks" ( + "xata_id" text PRIMARY KEY NOT NULL, + "album_id" text NOT NULL, + "track_id" text NOT NULL, + "xata_createdat" timestamp DEFAULT now() NOT NULL, + "xata_updatedat" timestamp DEFAULT now() NOT NULL, + "xata_version" integer NOT NULL +); +--> statement-breakpoint +CREATE TABLE "albums" ( + "xata_id" text PRIMARY KEY NOT NULL, + "title" text NOT NULL, + "artist" text NOT NULL, + "release_date" text, + "year" integer, + "album_art" text, + "uri" text, + "artist_uri" text, + "apple_music_link" text, + "spotify_link" text, + "tidal_link" text, + "youtube_link" text, + "sha256" text NOT NULL, + "xata_createdat" timestamp DEFAULT now() NOT NULL, + "xata_updatedat" timestamp DEFAULT now() NOT NULL, + "xata_version" integer, + CONSTRAINT "albums_uri_unique" UNIQUE("uri"), + CONSTRAINT "albums_apple_music_link_unique" UNIQUE("apple_music_link"), + CONSTRAINT "albums_spotify_link_unique" UNIQUE("spotify_link"), + CONSTRAINT "albums_tidal_link_unique" UNIQUE("tidal_link"), + CONSTRAINT "albums_youtube_link_unique" UNIQUE("youtube_link"), + CONSTRAINT "albums_sha256_unique" UNIQUE("sha256") +); +--> statement-breakpoint +CREATE TABLE "api_keys" ( + "xata_id" text PRIMARY KEY NOT NULL, + "name" text NOT NULL, + "api_key" text NOT NULL, + "shared_secret" text NOT NULL, + "description" text, + "enabled" boolean DEFAULT true NOT NULL, + "user_id" text NOT NULL, + "xata_createdat" timestamp DEFAULT now() NOT NULL, + "xata_updatedat" timestamp DEFAULT now() NOT NULL +); +--> statement-breakpoint +CREATE TABLE "artist_albums" ( + "xata_id" text PRIMARY KEY NOT NULL, + "artist_id" text NOT NULL, + "album_id" text NOT NULL, + "xata_createdat" timestamp DEFAULT now() NOT NULL, + "xata_updatedat" timestamp DEFAULT now() NOT NULL, + "xata_version" integer NOT NULL +); +--> statement-breakpoint +CREATE TABLE "artist_tracks" ( + "xata_id" text PRIMARY KEY NOT NULL, + "artist_id" text NOT NULL, + "track_id" text NOT NULL, + "xata_createdat" timestamp DEFAULT now() NOT NULL, + "xata_updatedat" timestamp DEFAULT now() NOT NULL, + "xata_version" integer NOT NULL +); +--> statement-breakpoint +CREATE TABLE "artists" ( + "xata_id" text PRIMARY KEY NOT NULL, + "name" text NOT NULL, + "biography" text, + "born" timestamp, + "born_in" text, + "died" timestamp, + "picture" text, + "sha256" text NOT NULL, + "uri" text, + "apple_music_link" text, + "spotify_link" text, + "tidal_link" text, + "youtube_link" text, + "xata_createdat" timestamp DEFAULT now() NOT NULL, + "xata_updatedat" timestamp DEFAULT now() NOT NULL, + "xata_version" integer, + CONSTRAINT "artists_sha256_unique" UNIQUE("sha256"), + CONSTRAINT "artists_uri_unique" UNIQUE("uri") +); +--> statement-breakpoint +CREATE TABLE "dropbox_tokens" ( + "xata_id" text PRIMARY KEY NOT NULL, + "refresh_token" text NOT NULL, + "xata_createdat" timestamp DEFAULT now() NOT NULL, + "xata_updatedat" timestamp DEFAULT now() NOT NULL +); +--> statement-breakpoint +CREATE TABLE "google_drive_tokens" ( + "xata_id" text PRIMARY KEY NOT NULL, + "refresh_token" text NOT NULL, + "xata_createdat" timestamp DEFAULT now() NOT NULL, + "xata_updatedat" timestamp DEFAULT now() NOT NULL +); +--> statement-breakpoint +CREATE TABLE "loved_tracks" ( + "xata_id" text PRIMARY KEY NOT NULL, + "user_id" text NOT NULL, + "track_id" text NOT NULL, + "uri" text, + "xata_createdat" timestamp DEFAULT now() NOT NULL, + CONSTRAINT "loved_tracks_uri_unique" UNIQUE("uri") +); +--> statement-breakpoint +CREATE TABLE "playlist_tracks" ( + "xata_id" text PRIMARY KEY NOT NULL, + "playlist_id" text NOT NULL, + "track_id" text NOT NULL, + "xata_createdat" timestamp DEFAULT now() NOT NULL +); +--> statement-breakpoint +CREATE TABLE "playlists" ( + "xata_id" text PRIMARY KEY NOT NULL, + "name" text NOT NULL, + "picture" text, + "description" text, + "uri" text, + "spotify_link" text, + "tidal_link" text, + "apple_music_link" text, + "created_by" text NOT NULL, + "xata_createdat" timestamp DEFAULT now() NOT NULL, + "xata_updatedat" timestamp DEFAULT now() NOT NULL, + CONSTRAINT "playlists_uri_unique" UNIQUE("uri") +); +--> statement-breakpoint +CREATE TABLE "profile_shouts" ( + "xata_id" text PRIMARY KEY NOT NULL, + "user_id" text NOT NULL, + "shout_id" text NOT NULL, + "xata_createdat" timestamp DEFAULT now() NOT NULL +); +--> statement-breakpoint +CREATE TABLE "scrobbles" ( + "xata_id" text PRIMARY KEY NOT NULL, + "user_id" text, + "track_id" text, + "album_id" text, + "artist_id" text, + "uri" text, + "xata_createdat" timestamp DEFAULT now() NOT NULL, + "xata_updatedat" timestamp DEFAULT now() NOT NULL, + "xata_version" integer, + "timestamp" timestamp DEFAULT now() NOT NULL, + CONSTRAINT "scrobbles_uri_unique" UNIQUE("uri") +); +--> statement-breakpoint +CREATE TABLE "shout_likes" ( + "xata_id" text PRIMARY KEY NOT NULL, + "user_id" text NOT NULL, + "shout_id" text NOT NULL, + "xata_createdat" timestamp DEFAULT now() NOT NULL, + "uri" text NOT NULL, + CONSTRAINT "shout_likes_uri_unique" UNIQUE("uri") +); +--> statement-breakpoint +CREATE TABLE "shout_reports" ( + "xata_id" text PRIMARY KEY NOT NULL, + "user_id" text NOT NULL, + "shout_id" text NOT NULL, + "xata_createdat" timestamp DEFAULT now() NOT NULL +); +--> statement-breakpoint +CREATE TABLE "shouts" ( + "xata_id" text PRIMARY KEY NOT NULL, + "content" text NOT NULL, + "track_id" text, + "artist_id" text, + "album_id" text, + "scrobble_id" text, + "uri" text NOT NULL, + "author_id" text NOT NULL, + "parent_id" text, + "xata_createdat" timestamp DEFAULT now() NOT NULL, + "xata_updatedat" timestamp DEFAULT now() NOT NULL, + CONSTRAINT "shouts_uri_unique" UNIQUE("uri") +); +--> statement-breakpoint +CREATE TABLE "spotify_accounts" ( + "xata_id" text PRIMARY KEY NOT NULL, + "xata_version" integer NOT NULL, + "email" text NOT NULL, + "user_id" text NOT NULL, + "is_beta_user" boolean DEFAULT false NOT NULL, + "xata_createdat" timestamp DEFAULT now() NOT NULL, + "xata_updatedat" timestamp DEFAULT now() NOT NULL +); +--> statement-breakpoint +CREATE TABLE "spotify_tokens" ( + "xata_id" text PRIMARY KEY NOT NULL, + "xata_version" integer NOT NULL, + "access_token" text NOT NULL, + "refresh_token" text NOT NULL, + "user_id" text NOT NULL, + "xata_createdat" timestamp DEFAULT now() NOT NULL, + "xata_updatedat" timestamp DEFAULT now() NOT NULL +); +--> statement-breakpoint +CREATE TABLE "tracks" ( + "xata_id" text PRIMARY KEY NOT NULL, + "title" text NOT NULL, + "artist" text NOT NULL, + "album_artist" text NOT NULL, + "album_art" text, + "album" text NOT NULL, + "track_number" integer, + "duration" integer NOT NULL, + "mb_id" text, + "youtube_link" text, + "spotify_link" text, + "apple_music_link" text, + "tidal_link" text, + "sha256" text NOT NULL, + "disc_number" integer, + "lyrics" text, + "composer" text, + "genre" text, + "label" text, + "copyright_message" text, + "uri" text, + "album_uri" text, + "artist_uri" text, + "xata_createdat" timestamp DEFAULT now() NOT NULL, + "xata_updatedat" timestamp DEFAULT now() NOT NULL, + "xata_version" integer, + CONSTRAINT "tracks_mb_id_unique" UNIQUE("mb_id"), + CONSTRAINT "tracks_youtube_link_unique" UNIQUE("youtube_link"), + CONSTRAINT "tracks_spotify_link_unique" UNIQUE("spotify_link"), + CONSTRAINT "tracks_apple_music_link_unique" UNIQUE("apple_music_link"), + CONSTRAINT "tracks_tidal_link_unique" UNIQUE("tidal_link"), + CONSTRAINT "tracks_sha256_unique" UNIQUE("sha256"), + CONSTRAINT "tracks_uri_unique" UNIQUE("uri"), + CONSTRAINT "tracks_album_uri_unique" UNIQUE("album_uri"), + CONSTRAINT "tracks_artist_uri_unique" UNIQUE("artist_uri") +); +--> statement-breakpoint +CREATE TABLE "user_albums" ( + "xata_id" text PRIMARY KEY NOT NULL, + "user_id" text NOT NULL, + "album_id" text NOT NULL, + "xata_createdat" timestamp DEFAULT now() NOT NULL, + "xata_updatedat" timestamp DEFAULT now() NOT NULL, + "xata_version" integer NOT NULL, + "scrobbles" integer, + "uri" text NOT NULL, + CONSTRAINT "user_albums_uri_unique" UNIQUE("uri") +); +--> statement-breakpoint +CREATE TABLE "user_artists" ( + "xata_id" text PRIMARY KEY NOT NULL, + "user_id" text NOT NULL, + "artist_id" text NOT NULL, + "xata_createdat" timestamp DEFAULT now() NOT NULL, + "xata_updatedat" timestamp DEFAULT now() NOT NULL, + "xata_version" integer NOT NULL, + "scrobbles" integer, + "uri" text NOT NULL, + CONSTRAINT "user_artists_uri_unique" UNIQUE("uri") +); +--> statement-breakpoint +CREATE TABLE "user_playlists" ( + "xata_id" text PRIMARY KEY NOT NULL, + "user_id" text NOT NULL, + "playlist_id" text NOT NULL, + "xata_createdat" timestamp DEFAULT now() NOT NULL, + "uri" text NOT NULL, + CONSTRAINT "user_playlists_uri_unique" UNIQUE("uri") +); +--> statement-breakpoint +CREATE TABLE "user_tracks" ( + "xata_id" text PRIMARY KEY NOT NULL, + "user_id" text NOT NULL, + "track_id" text NOT NULL, + "xata_createdat" timestamp DEFAULT now() NOT NULL, + "xata_updatedat" timestamp DEFAULT now() NOT NULL, + "xata_version" integer NOT NULL, + "uri" text NOT NULL, + "scrobbles" integer, + CONSTRAINT "user_tracks_uri_unique" UNIQUE("uri") +); +--> statement-breakpoint +CREATE TABLE "users" ( + "xata_id" text PRIMARY KEY NOT NULL, + "did" text NOT NULL, + "display_name" text NOT NULL, + "handle" text NOT NULL, + "avatar" text NOT NULL, + "xata_createdat" timestamp DEFAULT now() NOT NULL, + "xata_updatedat" timestamp DEFAULT now() NOT NULL, + "xata_version" integer, + CONSTRAINT "users_did_unique" UNIQUE("did"), + CONSTRAINT "users_handle_unique" UNIQUE("handle") +); +--> statement-breakpoint +CREATE TABLE "webscrobblers" ( + "xata_id" text PRIMARY KEY NOT NULL, + "name" text NOT NULL, + "uuid" text NOT NULL, + "description" text, + "enabled" boolean DEFAULT true NOT NULL, + "user_id" text NOT NULL, + "xata_createdat" timestamp DEFAULT now() NOT NULL, + "xata_updatedat" timestamp DEFAULT now() NOT NULL +); +--> statement-breakpoint +ALTER TABLE "album_tracks" ADD CONSTRAINT "album_tracks_album_id_albums_xata_id_fk" FOREIGN KEY ("album_id") REFERENCES "public"."albums"("xata_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "album_tracks" ADD CONSTRAINT "album_tracks_track_id_tracks_xata_id_fk" FOREIGN KEY ("track_id") REFERENCES "public"."tracks"("xata_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "api_keys" ADD CONSTRAINT "api_keys_user_id_users_xata_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("xata_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "artist_albums" ADD CONSTRAINT "artist_albums_artist_id_artists_xata_id_fk" FOREIGN KEY ("artist_id") REFERENCES "public"."artists"("xata_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "artist_albums" ADD CONSTRAINT "artist_albums_album_id_albums_xata_id_fk" FOREIGN KEY ("album_id") REFERENCES "public"."albums"("xata_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "artist_tracks" ADD CONSTRAINT "artist_tracks_artist_id_artists_xata_id_fk" FOREIGN KEY ("artist_id") REFERENCES "public"."artists"("xata_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "artist_tracks" ADD CONSTRAINT "artist_tracks_track_id_tracks_xata_id_fk" FOREIGN KEY ("track_id") REFERENCES "public"."tracks"("xata_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "loved_tracks" ADD CONSTRAINT "loved_tracks_user_id_users_xata_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("xata_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "loved_tracks" ADD CONSTRAINT "loved_tracks_track_id_tracks_xata_id_fk" FOREIGN KEY ("track_id") REFERENCES "public"."tracks"("xata_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "playlist_tracks" ADD CONSTRAINT "playlist_tracks_playlist_id_playlists_xata_id_fk" FOREIGN KEY ("playlist_id") REFERENCES "public"."playlists"("xata_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "playlist_tracks" ADD CONSTRAINT "playlist_tracks_track_id_tracks_xata_id_fk" FOREIGN KEY ("track_id") REFERENCES "public"."tracks"("xata_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "playlists" ADD CONSTRAINT "playlists_created_by_users_xata_id_fk" FOREIGN KEY ("created_by") REFERENCES "public"."users"("xata_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "profile_shouts" ADD CONSTRAINT "profile_shouts_user_id_users_xata_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("xata_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "profile_shouts" ADD CONSTRAINT "profile_shouts_shout_id_shouts_xata_id_fk" FOREIGN KEY ("shout_id") REFERENCES "public"."shouts"("xata_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "scrobbles" ADD CONSTRAINT "scrobbles_user_id_users_xata_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("xata_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "scrobbles" ADD CONSTRAINT "scrobbles_track_id_tracks_xata_id_fk" FOREIGN KEY ("track_id") REFERENCES "public"."tracks"("xata_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "scrobbles" ADD CONSTRAINT "scrobbles_album_id_albums_xata_id_fk" FOREIGN KEY ("album_id") REFERENCES "public"."albums"("xata_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "scrobbles" ADD CONSTRAINT "scrobbles_artist_id_artists_xata_id_fk" FOREIGN KEY ("artist_id") REFERENCES "public"."artists"("xata_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "shout_likes" ADD CONSTRAINT "shout_likes_user_id_users_xata_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("xata_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "shout_likes" ADD CONSTRAINT "shout_likes_shout_id_shouts_xata_id_fk" FOREIGN KEY ("shout_id") REFERENCES "public"."shouts"("xata_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "shout_reports" ADD CONSTRAINT "shout_reports_user_id_users_xata_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("xata_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "shout_reports" ADD CONSTRAINT "shout_reports_shout_id_shouts_xata_id_fk" FOREIGN KEY ("shout_id") REFERENCES "public"."shouts"("xata_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "shouts" ADD CONSTRAINT "shouts_track_id_tracks_xata_id_fk" FOREIGN KEY ("track_id") REFERENCES "public"."tracks"("xata_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "shouts" ADD CONSTRAINT "shouts_artist_id_users_xata_id_fk" FOREIGN KEY ("artist_id") REFERENCES "public"."users"("xata_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "shouts" ADD CONSTRAINT "shouts_album_id_albums_xata_id_fk" FOREIGN KEY ("album_id") REFERENCES "public"."albums"("xata_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "shouts" ADD CONSTRAINT "shouts_scrobble_id_scrobbles_xata_id_fk" FOREIGN KEY ("scrobble_id") REFERENCES "public"."scrobbles"("xata_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "shouts" ADD CONSTRAINT "shouts_author_id_users_xata_id_fk" FOREIGN KEY ("author_id") REFERENCES "public"."users"("xata_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "shouts" ADD CONSTRAINT "shouts_parent_id_shouts_xata_id_fk" FOREIGN KEY ("parent_id") REFERENCES "public"."shouts"("xata_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "spotify_accounts" ADD CONSTRAINT "spotify_accounts_user_id_users_xata_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("xata_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "spotify_tokens" ADD CONSTRAINT "spotify_tokens_user_id_users_xata_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("xata_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "user_albums" ADD CONSTRAINT "user_albums_user_id_users_xata_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("xata_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "user_albums" ADD CONSTRAINT "user_albums_album_id_albums_xata_id_fk" FOREIGN KEY ("album_id") REFERENCES "public"."albums"("xata_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "user_artists" ADD CONSTRAINT "user_artists_user_id_users_xata_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("xata_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "user_artists" ADD CONSTRAINT "user_artists_artist_id_artists_xata_id_fk" FOREIGN KEY ("artist_id") REFERENCES "public"."artists"("xata_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "user_playlists" ADD CONSTRAINT "user_playlists_user_id_users_xata_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("xata_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "user_playlists" ADD CONSTRAINT "user_playlists_playlist_id_tracks_xata_id_fk" FOREIGN KEY ("playlist_id") REFERENCES "public"."tracks"("xata_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "user_tracks" ADD CONSTRAINT "user_tracks_user_id_users_xata_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("xata_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "user_tracks" ADD CONSTRAINT "user_tracks_track_id_tracks_xata_id_fk" FOREIGN KEY ("track_id") REFERENCES "public"."tracks"("xata_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "webscrobblers" ADD CONSTRAINT "webscrobblers_user_id_users_xata_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("xata_id") ON DELETE no action ON UPDATE no action; \ No newline at end of file diff --git a/apps/api/drizzle/meta/0000_snapshot.json b/apps/api/drizzle/meta/0000_snapshot.json new file mode 100644 index 00000000..50b5d69a --- /dev/null +++ b/apps/api/drizzle/meta/0000_snapshot.json @@ -0,0 +1,2363 @@ +{ + "id": "4c369380-a733-4097-b87a-036a11bbc173", + "prevId": "00000000-0000-0000-0000-000000000000", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.album_tracks": { + "name": "album_tracks", + "schema": "", + "columns": { + "xata_id": { + "name": "xata_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "album_id": { + "name": "album_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "track_id": { + "name": "track_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "xata_createdat": { + "name": "xata_createdat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "xata_updatedat": { + "name": "xata_updatedat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "xata_version": { + "name": "xata_version", + "type": "integer", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "album_tracks_album_id_albums_xata_id_fk": { + "name": "album_tracks_album_id_albums_xata_id_fk", + "tableFrom": "album_tracks", + "tableTo": "albums", + "columnsFrom": [ + "album_id" + ], + "columnsTo": [ + "xata_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "album_tracks_track_id_tracks_xata_id_fk": { + "name": "album_tracks_track_id_tracks_xata_id_fk", + "tableFrom": "album_tracks", + "tableTo": "tracks", + "columnsFrom": [ + "track_id" + ], + "columnsTo": [ + "xata_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.albums": { + "name": "albums", + "schema": "", + "columns": { + "xata_id": { + "name": "xata_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "artist": { + "name": "artist", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "release_date": { + "name": "release_date", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "year": { + "name": "year", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "album_art": { + "name": "album_art", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "uri": { + "name": "uri", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "artist_uri": { + "name": "artist_uri", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "apple_music_link": { + "name": "apple_music_link", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "spotify_link": { + "name": "spotify_link", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "tidal_link": { + "name": "tidal_link", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "youtube_link": { + "name": "youtube_link", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sha256": { + "name": "sha256", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "xata_createdat": { + "name": "xata_createdat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "xata_updatedat": { + "name": "xata_updatedat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "xata_version": { + "name": "xata_version", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "albums_uri_unique": { + "name": "albums_uri_unique", + "nullsNotDistinct": false, + "columns": [ + "uri" + ] + }, + "albums_apple_music_link_unique": { + "name": "albums_apple_music_link_unique", + "nullsNotDistinct": false, + "columns": [ + "apple_music_link" + ] + }, + "albums_spotify_link_unique": { + "name": "albums_spotify_link_unique", + "nullsNotDistinct": false, + "columns": [ + "spotify_link" + ] + }, + "albums_tidal_link_unique": { + "name": "albums_tidal_link_unique", + "nullsNotDistinct": false, + "columns": [ + "tidal_link" + ] + }, + "albums_youtube_link_unique": { + "name": "albums_youtube_link_unique", + "nullsNotDistinct": false, + "columns": [ + "youtube_link" + ] + }, + "albums_sha256_unique": { + "name": "albums_sha256_unique", + "nullsNotDistinct": false, + "columns": [ + "sha256" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.api_keys": { + "name": "api_keys", + "schema": "", + "columns": { + "xata_id": { + "name": "xata_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "api_key": { + "name": "api_key", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "shared_secret": { + "name": "shared_secret", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "xata_createdat": { + "name": "xata_createdat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "xata_updatedat": { + "name": "xata_updatedat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "api_keys_user_id_users_xata_id_fk": { + "name": "api_keys_user_id_users_xata_id_fk", + "tableFrom": "api_keys", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "xata_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.artist_albums": { + "name": "artist_albums", + "schema": "", + "columns": { + "xata_id": { + "name": "xata_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "artist_id": { + "name": "artist_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "album_id": { + "name": "album_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "xata_createdat": { + "name": "xata_createdat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "xata_updatedat": { + "name": "xata_updatedat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "xata_version": { + "name": "xata_version", + "type": "integer", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "artist_albums_artist_id_artists_xata_id_fk": { + "name": "artist_albums_artist_id_artists_xata_id_fk", + "tableFrom": "artist_albums", + "tableTo": "artists", + "columnsFrom": [ + "artist_id" + ], + "columnsTo": [ + "xata_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "artist_albums_album_id_albums_xata_id_fk": { + "name": "artist_albums_album_id_albums_xata_id_fk", + "tableFrom": "artist_albums", + "tableTo": "albums", + "columnsFrom": [ + "album_id" + ], + "columnsTo": [ + "xata_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.artist_tracks": { + "name": "artist_tracks", + "schema": "", + "columns": { + "xata_id": { + "name": "xata_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "artist_id": { + "name": "artist_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "track_id": { + "name": "track_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "xata_createdat": { + "name": "xata_createdat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "xata_updatedat": { + "name": "xata_updatedat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "xata_version": { + "name": "xata_version", + "type": "integer", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "artist_tracks_artist_id_artists_xata_id_fk": { + "name": "artist_tracks_artist_id_artists_xata_id_fk", + "tableFrom": "artist_tracks", + "tableTo": "artists", + "columnsFrom": [ + "artist_id" + ], + "columnsTo": [ + "xata_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "artist_tracks_track_id_tracks_xata_id_fk": { + "name": "artist_tracks_track_id_tracks_xata_id_fk", + "tableFrom": "artist_tracks", + "tableTo": "tracks", + "columnsFrom": [ + "track_id" + ], + "columnsTo": [ + "xata_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.artists": { + "name": "artists", + "schema": "", + "columns": { + "xata_id": { + "name": "xata_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "biography": { + "name": "biography", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "born": { + "name": "born", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "born_in": { + "name": "born_in", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "died": { + "name": "died", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "picture": { + "name": "picture", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sha256": { + "name": "sha256", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "uri": { + "name": "uri", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "apple_music_link": { + "name": "apple_music_link", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "spotify_link": { + "name": "spotify_link", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "tidal_link": { + "name": "tidal_link", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "youtube_link": { + "name": "youtube_link", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "xata_createdat": { + "name": "xata_createdat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "xata_updatedat": { + "name": "xata_updatedat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "xata_version": { + "name": "xata_version", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "artists_sha256_unique": { + "name": "artists_sha256_unique", + "nullsNotDistinct": false, + "columns": [ + "sha256" + ] + }, + "artists_uri_unique": { + "name": "artists_uri_unique", + "nullsNotDistinct": false, + "columns": [ + "uri" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.dropbox_tokens": { + "name": "dropbox_tokens", + "schema": "", + "columns": { + "xata_id": { + "name": "xata_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "refresh_token": { + "name": "refresh_token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "xata_createdat": { + "name": "xata_createdat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "xata_updatedat": { + "name": "xata_updatedat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.google_drive_tokens": { + "name": "google_drive_tokens", + "schema": "", + "columns": { + "xata_id": { + "name": "xata_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "refresh_token": { + "name": "refresh_token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "xata_createdat": { + "name": "xata_createdat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "xata_updatedat": { + "name": "xata_updatedat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.loved_tracks": { + "name": "loved_tracks", + "schema": "", + "columns": { + "xata_id": { + "name": "xata_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "track_id": { + "name": "track_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "uri": { + "name": "uri", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "xata_createdat": { + "name": "xata_createdat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "loved_tracks_user_id_users_xata_id_fk": { + "name": "loved_tracks_user_id_users_xata_id_fk", + "tableFrom": "loved_tracks", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "xata_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "loved_tracks_track_id_tracks_xata_id_fk": { + "name": "loved_tracks_track_id_tracks_xata_id_fk", + "tableFrom": "loved_tracks", + "tableTo": "tracks", + "columnsFrom": [ + "track_id" + ], + "columnsTo": [ + "xata_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "loved_tracks_uri_unique": { + "name": "loved_tracks_uri_unique", + "nullsNotDistinct": false, + "columns": [ + "uri" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.playlist_tracks": { + "name": "playlist_tracks", + "schema": "", + "columns": { + "xata_id": { + "name": "xata_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "playlist_id": { + "name": "playlist_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "track_id": { + "name": "track_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "xata_createdat": { + "name": "xata_createdat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "playlist_tracks_playlist_id_playlists_xata_id_fk": { + "name": "playlist_tracks_playlist_id_playlists_xata_id_fk", + "tableFrom": "playlist_tracks", + "tableTo": "playlists", + "columnsFrom": [ + "playlist_id" + ], + "columnsTo": [ + "xata_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "playlist_tracks_track_id_tracks_xata_id_fk": { + "name": "playlist_tracks_track_id_tracks_xata_id_fk", + "tableFrom": "playlist_tracks", + "tableTo": "tracks", + "columnsFrom": [ + "track_id" + ], + "columnsTo": [ + "xata_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.playlists": { + "name": "playlists", + "schema": "", + "columns": { + "xata_id": { + "name": "xata_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "picture": { + "name": "picture", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "uri": { + "name": "uri", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "spotify_link": { + "name": "spotify_link", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "tidal_link": { + "name": "tidal_link", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "apple_music_link": { + "name": "apple_music_link", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_by": { + "name": "created_by", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "xata_createdat": { + "name": "xata_createdat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "xata_updatedat": { + "name": "xata_updatedat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "playlists_created_by_users_xata_id_fk": { + "name": "playlists_created_by_users_xata_id_fk", + "tableFrom": "playlists", + "tableTo": "users", + "columnsFrom": [ + "created_by" + ], + "columnsTo": [ + "xata_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "playlists_uri_unique": { + "name": "playlists_uri_unique", + "nullsNotDistinct": false, + "columns": [ + "uri" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.profile_shouts": { + "name": "profile_shouts", + "schema": "", + "columns": { + "xata_id": { + "name": "xata_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "shout_id": { + "name": "shout_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "xata_createdat": { + "name": "xata_createdat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "profile_shouts_user_id_users_xata_id_fk": { + "name": "profile_shouts_user_id_users_xata_id_fk", + "tableFrom": "profile_shouts", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "xata_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "profile_shouts_shout_id_shouts_xata_id_fk": { + "name": "profile_shouts_shout_id_shouts_xata_id_fk", + "tableFrom": "profile_shouts", + "tableTo": "shouts", + "columnsFrom": [ + "shout_id" + ], + "columnsTo": [ + "xata_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.scrobbles": { + "name": "scrobbles", + "schema": "", + "columns": { + "xata_id": { + "name": "xata_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "track_id": { + "name": "track_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "album_id": { + "name": "album_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "artist_id": { + "name": "artist_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "uri": { + "name": "uri", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "xata_createdat": { + "name": "xata_createdat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "xata_updatedat": { + "name": "xata_updatedat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "xata_version": { + "name": "xata_version", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "timestamp": { + "name": "timestamp", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "scrobbles_user_id_users_xata_id_fk": { + "name": "scrobbles_user_id_users_xata_id_fk", + "tableFrom": "scrobbles", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "xata_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "scrobbles_track_id_tracks_xata_id_fk": { + "name": "scrobbles_track_id_tracks_xata_id_fk", + "tableFrom": "scrobbles", + "tableTo": "tracks", + "columnsFrom": [ + "track_id" + ], + "columnsTo": [ + "xata_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "scrobbles_album_id_albums_xata_id_fk": { + "name": "scrobbles_album_id_albums_xata_id_fk", + "tableFrom": "scrobbles", + "tableTo": "albums", + "columnsFrom": [ + "album_id" + ], + "columnsTo": [ + "xata_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "scrobbles_artist_id_artists_xata_id_fk": { + "name": "scrobbles_artist_id_artists_xata_id_fk", + "tableFrom": "scrobbles", + "tableTo": "artists", + "columnsFrom": [ + "artist_id" + ], + "columnsTo": [ + "xata_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "scrobbles_uri_unique": { + "name": "scrobbles_uri_unique", + "nullsNotDistinct": false, + "columns": [ + "uri" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.shout_likes": { + "name": "shout_likes", + "schema": "", + "columns": { + "xata_id": { + "name": "xata_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "shout_id": { + "name": "shout_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "xata_createdat": { + "name": "xata_createdat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "uri": { + "name": "uri", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "shout_likes_user_id_users_xata_id_fk": { + "name": "shout_likes_user_id_users_xata_id_fk", + "tableFrom": "shout_likes", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "xata_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "shout_likes_shout_id_shouts_xata_id_fk": { + "name": "shout_likes_shout_id_shouts_xata_id_fk", + "tableFrom": "shout_likes", + "tableTo": "shouts", + "columnsFrom": [ + "shout_id" + ], + "columnsTo": [ + "xata_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "shout_likes_uri_unique": { + "name": "shout_likes_uri_unique", + "nullsNotDistinct": false, + "columns": [ + "uri" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.shout_reports": { + "name": "shout_reports", + "schema": "", + "columns": { + "xata_id": { + "name": "xata_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "shout_id": { + "name": "shout_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "xata_createdat": { + "name": "xata_createdat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "shout_reports_user_id_users_xata_id_fk": { + "name": "shout_reports_user_id_users_xata_id_fk", + "tableFrom": "shout_reports", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "xata_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "shout_reports_shout_id_shouts_xata_id_fk": { + "name": "shout_reports_shout_id_shouts_xata_id_fk", + "tableFrom": "shout_reports", + "tableTo": "shouts", + "columnsFrom": [ + "shout_id" + ], + "columnsTo": [ + "xata_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.shouts": { + "name": "shouts", + "schema": "", + "columns": { + "xata_id": { + "name": "xata_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "track_id": { + "name": "track_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "artist_id": { + "name": "artist_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "album_id": { + "name": "album_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "scrobble_id": { + "name": "scrobble_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "uri": { + "name": "uri", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "author_id": { + "name": "author_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "parent_id": { + "name": "parent_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "xata_createdat": { + "name": "xata_createdat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "xata_updatedat": { + "name": "xata_updatedat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "shouts_track_id_tracks_xata_id_fk": { + "name": "shouts_track_id_tracks_xata_id_fk", + "tableFrom": "shouts", + "tableTo": "tracks", + "columnsFrom": [ + "track_id" + ], + "columnsTo": [ + "xata_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "shouts_artist_id_users_xata_id_fk": { + "name": "shouts_artist_id_users_xata_id_fk", + "tableFrom": "shouts", + "tableTo": "users", + "columnsFrom": [ + "artist_id" + ], + "columnsTo": [ + "xata_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "shouts_album_id_albums_xata_id_fk": { + "name": "shouts_album_id_albums_xata_id_fk", + "tableFrom": "shouts", + "tableTo": "albums", + "columnsFrom": [ + "album_id" + ], + "columnsTo": [ + "xata_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "shouts_scrobble_id_scrobbles_xata_id_fk": { + "name": "shouts_scrobble_id_scrobbles_xata_id_fk", + "tableFrom": "shouts", + "tableTo": "scrobbles", + "columnsFrom": [ + "scrobble_id" + ], + "columnsTo": [ + "xata_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "shouts_author_id_users_xata_id_fk": { + "name": "shouts_author_id_users_xata_id_fk", + "tableFrom": "shouts", + "tableTo": "users", + "columnsFrom": [ + "author_id" + ], + "columnsTo": [ + "xata_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "shouts_parent_id_shouts_xata_id_fk": { + "name": "shouts_parent_id_shouts_xata_id_fk", + "tableFrom": "shouts", + "tableTo": "shouts", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "xata_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "shouts_uri_unique": { + "name": "shouts_uri_unique", + "nullsNotDistinct": false, + "columns": [ + "uri" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.spotify_accounts": { + "name": "spotify_accounts", + "schema": "", + "columns": { + "xata_id": { + "name": "xata_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "xata_version": { + "name": "xata_version", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "is_beta_user": { + "name": "is_beta_user", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "xata_createdat": { + "name": "xata_createdat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "xata_updatedat": { + "name": "xata_updatedat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "spotify_accounts_user_id_users_xata_id_fk": { + "name": "spotify_accounts_user_id_users_xata_id_fk", + "tableFrom": "spotify_accounts", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "xata_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.spotify_tokens": { + "name": "spotify_tokens", + "schema": "", + "columns": { + "xata_id": { + "name": "xata_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "xata_version": { + "name": "xata_version", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "access_token": { + "name": "access_token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "refresh_token": { + "name": "refresh_token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "xata_createdat": { + "name": "xata_createdat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "xata_updatedat": { + "name": "xata_updatedat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "spotify_tokens_user_id_users_xata_id_fk": { + "name": "spotify_tokens_user_id_users_xata_id_fk", + "tableFrom": "spotify_tokens", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "xata_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.tracks": { + "name": "tracks", + "schema": "", + "columns": { + "xata_id": { + "name": "xata_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "artist": { + "name": "artist", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "album_artist": { + "name": "album_artist", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "album_art": { + "name": "album_art", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "album": { + "name": "album", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "track_number": { + "name": "track_number", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "duration": { + "name": "duration", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "mb_id": { + "name": "mb_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "youtube_link": { + "name": "youtube_link", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "spotify_link": { + "name": "spotify_link", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "apple_music_link": { + "name": "apple_music_link", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "tidal_link": { + "name": "tidal_link", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sha256": { + "name": "sha256", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "disc_number": { + "name": "disc_number", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "lyrics": { + "name": "lyrics", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composer": { + "name": "composer", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "genre": { + "name": "genre", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "label": { + "name": "label", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "copyright_message": { + "name": "copyright_message", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "uri": { + "name": "uri", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "album_uri": { + "name": "album_uri", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "artist_uri": { + "name": "artist_uri", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "xata_createdat": { + "name": "xata_createdat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "xata_updatedat": { + "name": "xata_updatedat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "xata_version": { + "name": "xata_version", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "tracks_mb_id_unique": { + "name": "tracks_mb_id_unique", + "nullsNotDistinct": false, + "columns": [ + "mb_id" + ] + }, + "tracks_youtube_link_unique": { + "name": "tracks_youtube_link_unique", + "nullsNotDistinct": false, + "columns": [ + "youtube_link" + ] + }, + "tracks_spotify_link_unique": { + "name": "tracks_spotify_link_unique", + "nullsNotDistinct": false, + "columns": [ + "spotify_link" + ] + }, + "tracks_apple_music_link_unique": { + "name": "tracks_apple_music_link_unique", + "nullsNotDistinct": false, + "columns": [ + "apple_music_link" + ] + }, + "tracks_tidal_link_unique": { + "name": "tracks_tidal_link_unique", + "nullsNotDistinct": false, + "columns": [ + "tidal_link" + ] + }, + "tracks_sha256_unique": { + "name": "tracks_sha256_unique", + "nullsNotDistinct": false, + "columns": [ + "sha256" + ] + }, + "tracks_uri_unique": { + "name": "tracks_uri_unique", + "nullsNotDistinct": false, + "columns": [ + "uri" + ] + }, + "tracks_album_uri_unique": { + "name": "tracks_album_uri_unique", + "nullsNotDistinct": false, + "columns": [ + "album_uri" + ] + }, + "tracks_artist_uri_unique": { + "name": "tracks_artist_uri_unique", + "nullsNotDistinct": false, + "columns": [ + "artist_uri" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.user_albums": { + "name": "user_albums", + "schema": "", + "columns": { + "xata_id": { + "name": "xata_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "album_id": { + "name": "album_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "xata_createdat": { + "name": "xata_createdat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "xata_updatedat": { + "name": "xata_updatedat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "xata_version": { + "name": "xata_version", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "scrobbles": { + "name": "scrobbles", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "uri": { + "name": "uri", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "user_albums_user_id_users_xata_id_fk": { + "name": "user_albums_user_id_users_xata_id_fk", + "tableFrom": "user_albums", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "xata_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "user_albums_album_id_albums_xata_id_fk": { + "name": "user_albums_album_id_albums_xata_id_fk", + "tableFrom": "user_albums", + "tableTo": "albums", + "columnsFrom": [ + "album_id" + ], + "columnsTo": [ + "xata_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "user_albums_uri_unique": { + "name": "user_albums_uri_unique", + "nullsNotDistinct": false, + "columns": [ + "uri" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.user_artists": { + "name": "user_artists", + "schema": "", + "columns": { + "xata_id": { + "name": "xata_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "artist_id": { + "name": "artist_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "xata_createdat": { + "name": "xata_createdat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "xata_updatedat": { + "name": "xata_updatedat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "xata_version": { + "name": "xata_version", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "scrobbles": { + "name": "scrobbles", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "uri": { + "name": "uri", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "user_artists_user_id_users_xata_id_fk": { + "name": "user_artists_user_id_users_xata_id_fk", + "tableFrom": "user_artists", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "xata_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "user_artists_artist_id_artists_xata_id_fk": { + "name": "user_artists_artist_id_artists_xata_id_fk", + "tableFrom": "user_artists", + "tableTo": "artists", + "columnsFrom": [ + "artist_id" + ], + "columnsTo": [ + "xata_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "user_artists_uri_unique": { + "name": "user_artists_uri_unique", + "nullsNotDistinct": false, + "columns": [ + "uri" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.user_playlists": { + "name": "user_playlists", + "schema": "", + "columns": { + "xata_id": { + "name": "xata_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "playlist_id": { + "name": "playlist_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "xata_createdat": { + "name": "xata_createdat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "uri": { + "name": "uri", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "user_playlists_user_id_users_xata_id_fk": { + "name": "user_playlists_user_id_users_xata_id_fk", + "tableFrom": "user_playlists", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "xata_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "user_playlists_playlist_id_tracks_xata_id_fk": { + "name": "user_playlists_playlist_id_tracks_xata_id_fk", + "tableFrom": "user_playlists", + "tableTo": "tracks", + "columnsFrom": [ + "playlist_id" + ], + "columnsTo": [ + "xata_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "user_playlists_uri_unique": { + "name": "user_playlists_uri_unique", + "nullsNotDistinct": false, + "columns": [ + "uri" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.user_tracks": { + "name": "user_tracks", + "schema": "", + "columns": { + "xata_id": { + "name": "xata_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "track_id": { + "name": "track_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "xata_createdat": { + "name": "xata_createdat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "xata_updatedat": { + "name": "xata_updatedat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "xata_version": { + "name": "xata_version", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "uri": { + "name": "uri", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "scrobbles": { + "name": "scrobbles", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "user_tracks_user_id_users_xata_id_fk": { + "name": "user_tracks_user_id_users_xata_id_fk", + "tableFrom": "user_tracks", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "xata_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "user_tracks_track_id_tracks_xata_id_fk": { + "name": "user_tracks_track_id_tracks_xata_id_fk", + "tableFrom": "user_tracks", + "tableTo": "tracks", + "columnsFrom": [ + "track_id" + ], + "columnsTo": [ + "xata_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "user_tracks_uri_unique": { + "name": "user_tracks_uri_unique", + "nullsNotDistinct": false, + "columns": [ + "uri" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.users": { + "name": "users", + "schema": "", + "columns": { + "xata_id": { + "name": "xata_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "did": { + "name": "did", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "display_name": { + "name": "display_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "handle": { + "name": "handle", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "avatar": { + "name": "avatar", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "xata_createdat": { + "name": "xata_createdat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "xata_updatedat": { + "name": "xata_updatedat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "xata_version": { + "name": "xata_version", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_did_unique": { + "name": "users_did_unique", + "nullsNotDistinct": false, + "columns": [ + "did" + ] + }, + "users_handle_unique": { + "name": "users_handle_unique", + "nullsNotDistinct": false, + "columns": [ + "handle" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.webscrobblers": { + "name": "webscrobblers", + "schema": "", + "columns": { + "xata_id": { + "name": "xata_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "uuid": { + "name": "uuid", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "xata_createdat": { + "name": "xata_createdat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "xata_updatedat": { + "name": "xata_updatedat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "webscrobblers_user_id_users_xata_id_fk": { + "name": "webscrobblers_user_id_users_xata_id_fk", + "tableFrom": "webscrobblers", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "xata_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": {}, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/apps/api/drizzle/meta/_journal.json b/apps/api/drizzle/meta/_journal.json new file mode 100644 index 00000000..872ff62e --- /dev/null +++ b/apps/api/drizzle/meta/_journal.json @@ -0,0 +1,13 @@ +{ + "version": "7", + "dialect": "postgresql", + "entries": [ + { + "idx": 0, + "version": "7", + "when": 1750169528964, + "tag": "0000_init", + "breakpoints": true + } + ] +} \ No newline at end of file diff --git a/apps/api/lexicons/actor/defs.json b/apps/api/lexicons/actor/defs.json new file mode 100644 index 00000000..a253b5e2 --- /dev/null +++ b/apps/api/lexicons/actor/defs.json @@ -0,0 +1,78 @@ +{ + "lexicon": 1, + "id": "app.rocksky.actor.defs", + "defs": { + "profileViewDetailed": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The unique identifier of the actor." + }, + "did": { + "type": "string", + "description": "The DID of the actor." + }, + "handle": { + "type": "string", + "description": "The handle of the actor." + }, + "displayName": { + "type": "string", + "description": "The display name of the actor." + }, + "avatar": { + "type": "string", + "description": "The URL of the actor's avatar image.", + "format": "uri" + }, + "createdAt": { + "type": "string", + "description": "The date and time when the actor was created.", + "format": "datetime" + }, + "updatedAt": { + "type": "string", + "description": "The date and time when the actor was last updated.", + "format": "datetime" + } + } + }, + "profileViewBasic": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The unique identifier of the actor." + }, + "did": { + "type": "string", + "description": "The DID of the actor." + }, + "handle": { + "type": "string", + "description": "The handle of the actor." + }, + "displayName": { + "type": "string", + "description": "The display name of the actor." + }, + "avatar": { + "type": "string", + "description": "The URL of the actor's avatar image.", + "format": "uri" + }, + "createdAt": { + "type": "string", + "description": "The date and time when the actor was created.", + "format": "datetime" + }, + "updatedAt": { + "type": "string", + "description": "The date and time when the actor was last updated.", + "format": "datetime" + } + } + } + } +} diff --git a/apps/api/lexicons/actor/getActorAlbums.json b/apps/api/lexicons/actor/getActorAlbums.json new file mode 100644 index 00000000..d420159a --- /dev/null +++ b/apps/api/lexicons/actor/getActorAlbums.json @@ -0,0 +1,48 @@ +{ + "lexicon": 1, + "id": "app.rocksky.actor.getActorAlbums", + "defs": { + "main": { + "type": "query", + "description": "Get albums for an actor", + "parameters": { + "type": "params", + "required": [ + "did" + ], + "properties": { + "did": { + "type": "string", + "description": "The DID or handle of the actor", + "format": "at-identifier" + }, + "limit": { + "type": "integer", + "description": "The maximum number of albums to return", + "minimum": 1 + }, + "offset": { + "type": "integer", + "description": "The offset for pagination", + "minimum": 0 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "properties": { + "albums": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.rocksky.album.defs#albumViewBasic" + } + } + } + } + } + } + } +} diff --git a/apps/api/lexicons/actor/getActorArtists.json b/apps/api/lexicons/actor/getActorArtists.json new file mode 100644 index 00000000..0d06be78 --- /dev/null +++ b/apps/api/lexicons/actor/getActorArtists.json @@ -0,0 +1,48 @@ +{ + "lexicon": 1, + "id": "app.rocksky.actor.getActorArtists", + "defs": { + "main": { + "type": "query", + "description": "Get artists for an actor", + "parameters": { + "type": "params", + "required": [ + "did" + ], + "properties": { + "did": { + "type": "string", + "description": "The DID or handle of the actor", + "format": "at-identifier" + }, + "limit": { + "type": "integer", + "description": "The maximum number of albums to return", + "minimum": 1 + }, + "offset": { + "type": "integer", + "description": "The offset for pagination", + "minimum": 0 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "properties": { + "artists": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.rocksky.artist.defs#artistViewBasic" + } + } + } + } + } + } + } +} diff --git a/apps/api/lexicons/actor/getActorLovedSongs.json b/apps/api/lexicons/actor/getActorLovedSongs.json new file mode 100644 index 00000000..37aba37b --- /dev/null +++ b/apps/api/lexicons/actor/getActorLovedSongs.json @@ -0,0 +1,48 @@ +{ + "lexicon": 1, + "id": "app.rocksky.actor.getActorLovedSongs", + "defs": { + "main": { + "type": "query", + "description": "Get loved songs for an actor", + "parameters": { + "type": "params", + "required": [ + "did" + ], + "properties": { + "did": { + "type": "string", + "description": "The DID or handle of the actor", + "format": "at-identifier" + }, + "limit": { + "type": "integer", + "description": "The maximum number of albums to return", + "minimum": 1 + }, + "offset": { + "type": "integer", + "description": "The offset for pagination", + "minimum": 0 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "properties": { + "tracks": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.rocksky.song.defs#songViewBasic" + } + } + } + } + } + } + } +} diff --git a/apps/api/lexicons/actor/getActorPlaylists.json b/apps/api/lexicons/actor/getActorPlaylists.json new file mode 100644 index 00000000..10b0b50c --- /dev/null +++ b/apps/api/lexicons/actor/getActorPlaylists.json @@ -0,0 +1,48 @@ +{ + "lexicon": 1, + "id": "app.rocksky.actor.getActorPlaylists", + "defs": { + "main": { + "type": "query", + "description": "Get playlists for an actor", + "parameters": { + "type": "params", + "required": [ + "did" + ], + "properties": { + "did": { + "type": "string", + "description": "The DID or handle of the actor", + "format": "at-identifier" + }, + "limit": { + "type": "integer", + "description": "The maximum number of albums to return", + "minimum": 1 + }, + "offset": { + "type": "integer", + "description": "The offset for pagination", + "minimum": 0 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "properties": { + "playlists": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.rocksky.playlist.defs#playlistViewBasic" + } + } + } + } + } + } + } +} diff --git a/apps/api/lexicons/actor/getActorScrobbles.json b/apps/api/lexicons/actor/getActorScrobbles.json new file mode 100644 index 00000000..c076816d --- /dev/null +++ b/apps/api/lexicons/actor/getActorScrobbles.json @@ -0,0 +1,48 @@ +{ + "lexicon": 1, + "id": "app.rocksky.actor.getActorScrobbles", + "defs": { + "main": { + "type": "query", + "description": "Get scrobbles for an actor", + "parameters": { + "type": "params", + "required": [ + "did" + ], + "properties": { + "did": { + "type": "string", + "description": "The DID or handle of the actor", + "format": "at-identifier" + }, + "limit": { + "type": "integer", + "description": "The maximum number of albums to return", + "minimum": 1 + }, + "offset": { + "type": "integer", + "description": "The offset for pagination", + "minimum": 0 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "properties": { + "scrobbles": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.rocksky.scrobble.defs#scrobbleViewBasic" + } + } + } + } + } + } + } +} diff --git a/apps/api/lexicons/actor/getActorSongs.json b/apps/api/lexicons/actor/getActorSongs.json new file mode 100644 index 00000000..42cbf434 --- /dev/null +++ b/apps/api/lexicons/actor/getActorSongs.json @@ -0,0 +1,48 @@ +{ + "lexicon": 1, + "id": "app.rocksky.actor.getActorSongs", + "defs": { + "main": { + "type": "query", + "description": "Get songs for an actor", + "parameters": { + "type": "params", + "required": [ + "did" + ], + "properties": { + "did": { + "type": "string", + "description": "The DID or handle of the actor", + "format": "at-identifier" + }, + "limit": { + "type": "integer", + "description": "The maximum number of albums to return", + "minimum": 1 + }, + "offset": { + "type": "integer", + "description": "The offset for pagination", + "minimum": 0 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "properties": { + "songs": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.rocksky.song.defs#songViewBasic" + } + } + } + } + } + } + } +} diff --git a/apps/api/lexicons/actor/getProfile.json b/apps/api/lexicons/actor/getProfile.json new file mode 100644 index 00000000..cbf4b015 --- /dev/null +++ b/apps/api/lexicons/actor/getProfile.json @@ -0,0 +1,27 @@ +{ + "lexicon": 1, + "id": "app.rocksky.actor.getProfile", + "defs": { + "main": { + "type": "query", + "description": "Get the profile of an actor", + "parameters": { + "type": "params", + "properties": { + "did": { + "type": "string", + "description": "The DID or handle of the actor", + "format": "at-identifier" + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "ref", + "ref": "app.rocksky.actor.defs#profileViewDetailed" + } + } + } + } +} diff --git a/apps/api/lexicons/actor/profile.json b/apps/api/lexicons/actor/profile.json new file mode 100644 index 00000000..75c44ad5 --- /dev/null +++ b/apps/api/lexicons/actor/profile.json @@ -0,0 +1,60 @@ +{ + "lexicon": 1, + "id": "app.bsky.actor.profile", + "defs": { + "main": { + "type": "record", + "description": "A declaration of a Bluesky account profile.", + "key": "literal:self", + "record": { + "type": "object", + "properties": { + "displayName": { + "type": "string", + "maxGraphemes": 64, + "maxLength": 640 + }, + "description": { + "type": "string", + "description": "Free-form profile description text.", + "maxGraphemes": 256, + "maxLength": 2560 + }, + "avatar": { + "type": "blob", + "description": "Small image to be displayed next to posts from account. AKA, 'profile picture'", + "accept": [ + "image/png", + "image/jpeg" + ], + "maxSize": 1000000 + }, + "banner": { + "type": "blob", + "description": "Larger horizontal image to display behind profile view.", + "accept": [ + "image/png", + "image/jpeg" + ], + "maxSize": 10000000 + }, + "labels": { + "type": "union", + "description": "Self-label values, specific to the Bluesky application, on the overall account.", + "refs": [ + "com.atproto.label.defs#selfLabels" + ] + }, + "joinedViaStarterPack": { + "type": "ref", + "ref": "com.atproto.repo.strongRef" + }, + "createdAt": { + "type": "string", + "format": "datetime" + } + } + } + } + } +} diff --git a/apps/api/lexicons/album/album.json b/apps/api/lexicons/album/album.json new file mode 100644 index 00000000..5ca1b55a --- /dev/null +++ b/apps/api/lexicons/album/album.json @@ -0,0 +1,94 @@ +{ + "lexicon": 1, + "id": "app.rocksky.album", + "defs": { + "main": { + "type": "record", + "description": "A declaration of an album.", + "key": "tid", + "record": { + "type": "object", + "required": [ + "title", + "artist", + "createdAt" + ], + "properties": { + "title": { + "type": "string", + "description": "The title of the album.", + "minLength": 1, + "maxLength": 512 + }, + "artist": { + "type": "string", + "description": "The artist of the album.", + "minLength": 1, + "maxLength": 256 + }, + "duration": { + "type": "integer", + "description": "The duration of the album in seconds." + }, + "releaseDate": { + "type": "string", + "description": "The release date of the album.", + "format": "datetime" + }, + "year": { + "type": "integer", + "description": "The year the album was released." + }, + "genre": { + "type": "string", + "description": "The genre of the album.", + "maxLength": 256 + }, + "albumArt": { + "type": "blob", + "description": "The album art of the album.", + "accept": [ + "image/png", + "image/jpeg" + ], + "maxSize": 2000000 + }, + "tags": { + "type": "array", + "description": "The tags of the album.", + "items": { + "type": "string", + "minLength": 1, + "maxLength": 256 + } + }, + "youtubeLink": { + "type": "string", + "description": "The YouTube link of the album.", + "format": "uri" + }, + "spotifyLink": { + "type": "string", + "description": "The Spotify link of the album.", + "format": "uri" + }, + "tidalLink": { + "type": "string", + "description": "The tidal link of the album.", + "format": "uri" + }, + "appleMusicLink": { + "type": "string", + "description": "The Apple Music link of the album.", + "format": "uri" + }, + "createdAt": { + "type": "string", + "description": "The date and time when the album was created.", + "format": "datetime" + } + } + } + } + } +} diff --git a/apps/api/lexicons/album/defs.json b/apps/api/lexicons/album/defs.json new file mode 100644 index 00000000..6f4d4fa9 --- /dev/null +++ b/apps/api/lexicons/album/defs.json @@ -0,0 +1,121 @@ +{ + "lexicon": 1, + "id": "app.rocksky.album.defs", + "defs": { + "albumViewBasic": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The unique identifier of the album." + }, + "uri": { + "type": "string", + "description": "The URI of the album.", + "format": "at-uri" + }, + "title": { + "type": "string", + "description": "The title of the album." + }, + "artist": { + "type": "string", + "description": "The artist of the album." + }, + "artistUri": { + "type": "string", + "description": "The URI of the album's artist.", + "format": "at-uri" + }, + "year": { + "type": "integer", + "description": "The year the album was released." + }, + "albumArt": { + "type": "string", + "description": "The URL of the album art image.", + "format": "uri" + }, + "releaseDate": { + "type": "string", + "description": "The release date of the album." + }, + "sha256": { + "type": "string", + "description": "The SHA256 hash of the album." + }, + "playCount": { + "type": "integer", + "description": "The number of times the album has been played.", + "minimum": 0 + }, + "uniqueListeners": { + "type": "integer", + "description": "The number of unique listeners who have played the album.", + "minimum": 0 + } + } + }, + "albumViewDetailed": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The unique identifier of the album." + }, + "uri": { + "type": "string", + "description": "The URI of the album.", + "format": "at-uri" + }, + "title": { + "type": "string", + "description": "The title of the album." + }, + "artist": { + "type": "string", + "description": "The artist of the album." + }, + "artistUri": { + "type": "string", + "description": "The URI of the album's artist.", + "format": "at-uri" + }, + "year": { + "type": "integer", + "description": "The year the album was released." + }, + "albumArt": { + "type": "string", + "description": "The URL of the album art image.", + "format": "uri" + }, + "releaseDate": { + "type": "string", + "description": "The release date of the album." + }, + "sha256": { + "type": "string", + "description": "The SHA256 hash of the album." + }, + "playCount": { + "type": "integer", + "description": "The number of times the album has been played.", + "minimum": 0 + }, + "uniqueListeners": { + "type": "integer", + "description": "The number of unique listeners who have played the album.", + "minimum": 0 + }, + "tracks": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.rocksky.song.defs.songViewBasic" + } + } + } + } + } +} diff --git a/apps/api/lexicons/album/getAlbum.json b/apps/api/lexicons/album/getAlbum.json new file mode 100644 index 00000000..dce595fc --- /dev/null +++ b/apps/api/lexicons/album/getAlbum.json @@ -0,0 +1,30 @@ +{ + "lexicon": 1, + "id": "app.rocksky.album.getAlbum", + "defs": { + "main": { + "type": "query", + "description": "Get detailed album view", + "parameters": { + "type": "params", + "required": [ + "uri" + ], + "properties": { + "uri": { + "type": "string", + "description": "The URI of the album to retrieve.", + "format": "at-uri" + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "ref", + "ref": "app.rocksky.album.defs#albumViewDetailed" + } + } + } + } +} diff --git a/apps/api/lexicons/album/getAlbumTracks.json b/apps/api/lexicons/album/getAlbumTracks.json new file mode 100644 index 00000000..1f60cd6d --- /dev/null +++ b/apps/api/lexicons/album/getAlbumTracks.json @@ -0,0 +1,38 @@ +{ + "lexicon": 1, + "id": "app.rocksky.album.getAlbumTracks", + "defs": { + "main": { + "type": "query", + "description": "Get tracks for an album", + "parameters": { + "type": "params", + "required": [ + "uri" + ], + "properties": { + "uri": { + "type": "string", + "description": "The URI of the album to retrieve tracks from", + "format": "at-uri" + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "properties": { + "tracks": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.rocksky.song.defs#songViewBasic" + } + } + } + } + } + } + } +} diff --git a/apps/api/lexicons/album/getAlbums.json b/apps/api/lexicons/album/getAlbums.json new file mode 100644 index 00000000..4ff00869 --- /dev/null +++ b/apps/api/lexicons/album/getAlbums.json @@ -0,0 +1,40 @@ +{ + "lexicon": 1, + "id": "app.rocksky.album.getAlbums", + "defs": { + "main": { + "type": "query", + "description": "Get albums", + "parameters": { + "type": "params", + "properties": { + "limit": { + "type": "integer", + "description": "The maximum number of albums to return", + "minimum": 1 + }, + "offset": { + "type": "integer", + "description": "The offset for pagination", + "minimum": 0 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "properties": { + "albums": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.rocksky.album.defs#albumViewBasic" + } + } + } + } + } + } + } +} diff --git a/apps/api/lexicons/apikey/createApikey.json b/apps/api/lexicons/apikey/createApikey.json new file mode 100644 index 00000000..cf652307 --- /dev/null +++ b/apps/api/lexicons/apikey/createApikey.json @@ -0,0 +1,36 @@ +{ + "lexicon": 1, + "id": "app.rocksky.apikey.createApikey", + "defs": { + "main": { + "type": "procedure", + "description": "Create a new API key for the authenticated user", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "description": "The name of the API key." + }, + "description": { + "type": "string", + "description": "A description for the API key." + } + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "ref", + "ref": "app.rocksky.apikey.defs#apiKey" + } + } + } + } +} diff --git a/apps/api/lexicons/apikey/def.json b/apps/api/lexicons/apikey/def.json new file mode 100644 index 00000000..fa81e721 --- /dev/null +++ b/apps/api/lexicons/apikey/def.json @@ -0,0 +1,28 @@ +{ + "lexicon": 1, + "id": "app.rocksky.apikey.defs", + "defs": { + "apiKeyView": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The unique identifier of the API key." + }, + "name": { + "type": "string", + "description": "The name of the API key." + }, + "description": { + "type": "string", + "description": "A description for the API key." + }, + "createdAt": { + "type": "string", + "description": "The date and time when the API key was created.", + "format": "datetime" + } + } + } + } +} diff --git a/apps/api/lexicons/apikey/defs.json b/apps/api/lexicons/apikey/defs.json new file mode 100644 index 00000000..8400a804 --- /dev/null +++ b/apps/api/lexicons/apikey/defs.json @@ -0,0 +1,5 @@ +{ + "lexicon": 1, + "id": "app.rocksky.apikeys.defs", + "defs": {} +} \ No newline at end of file diff --git a/apps/api/lexicons/apikey/getApikeys.json b/apps/api/lexicons/apikey/getApikeys.json new file mode 100644 index 00000000..a33dfae4 --- /dev/null +++ b/apps/api/lexicons/apikey/getApikeys.json @@ -0,0 +1,38 @@ +{ + "lexicon": 1, + "id": "app.rocksky.apikey.getApikeys", + "defs": { + "main": { + "type": "query", + "description": "Get a list of API keys for the authenticated user", + "parameters": { + "type": "params", + "properties": { + "offset": { + "type": "integer", + "description": "The number of API keys to skip before starting to collect the result set." + }, + "limit": { + "type": "integer", + "description": "The number of API keys to return per page." + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "properties": { + "apiKeys": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.rocksky.apikey.defs#apikeyView" + } + } + } + } + } + } + } +} diff --git a/apps/api/lexicons/apikey/removeApikey.json b/apps/api/lexicons/apikey/removeApikey.json new file mode 100644 index 00000000..280546c1 --- /dev/null +++ b/apps/api/lexicons/apikey/removeApikey.json @@ -0,0 +1,29 @@ +{ + "lexicon": 1, + "id": "app.rocksky.apikey.removeApikey", + "defs": { + "main": { + "type": "procedure", + "description": "Remove an API key for the authenticated user", + "parameters": { + "type": "params", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "string", + "description": "The ID of the API key to remove." + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "ref", + "ref": "app.rocksky.apikey.defs#apiKey" + } + } + } + } +} diff --git a/apps/api/lexicons/apikey/updateApikey.json b/apps/api/lexicons/apikey/updateApikey.json new file mode 100644 index 00000000..2cdfbd63 --- /dev/null +++ b/apps/api/lexicons/apikey/updateApikey.json @@ -0,0 +1,41 @@ +{ + "lexicon": 1, + "id": "app.rocksky.apikey.updateApikey", + "defs": { + "main": { + "type": "procedure", + "description": "Update an existing API key for the authenticated user", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "type": "string", + "description": "The ID of the API key to update." + }, + "name": { + "type": "string", + "description": "The new name of the API key." + }, + "description": { + "type": "string", + "description": "A new description for the API key." + } + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "ref", + "ref": "app.rocksky.apikey.defs#apiKey" + } + } + } + } +} diff --git a/apps/api/lexicons/artist/artist.json b/apps/api/lexicons/artist/artist.json new file mode 100644 index 00000000..16304ccc --- /dev/null +++ b/apps/api/lexicons/artist/artist.json @@ -0,0 +1,69 @@ +{ + "lexicon": 1, + "id": "app.rocksky.artist", + "defs": { + "main": { + "type": "record", + "description": "A declaration of an artist.", + "key": "tid", + "record": { + "type": "object", + "required": [ + "name", + "createdAt" + ], + "properties": { + "name": { + "type": "string", + "description": "The name of the artist.", + "minLength": 1, + "maxLength": 512 + }, + "bio": { + "type": "string", + "description": "The biography of the artist.", + "maxLength": 1000 + }, + "picture": { + "type": "blob", + "description": "The picture of the artist.", + "accept": [ + "image/png", + "image/jpeg" + ], + "maxSize": 2000000 + }, + "tags": { + "type": "array", + "description": "The tags of the artist.", + "items": { + "type": "string", + "minLength": 1, + "maxLength": 256 + } + }, + "born": { + "type": "string", + "description": "The birth date of the artist.", + "format": "datetime" + }, + "died": { + "type": "string", + "description": "The death date of the artist.", + "format": "datetime" + }, + "bornIn": { + "type": "string", + "description": "The birth place of the artist.", + "maxLength": 256 + }, + "createdAt": { + "type": "string", + "description": "The date when the artist was created.", + "format": "datetime" + } + } + } + } + } +} diff --git a/apps/api/lexicons/artist/defs.json b/apps/api/lexicons/artist/defs.json new file mode 100644 index 00000000..a025c869 --- /dev/null +++ b/apps/api/lexicons/artist/defs.json @@ -0,0 +1,78 @@ +{ + "lexicon": 1, + "id": "app.rocksky.artist.defs", + "defs": { + "artistViewBasic": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The unique identifier of the artist." + }, + "uri": { + "type": "string", + "description": "The URI of the artist.", + "format": "at-uri" + }, + "name": { + "type": "string", + "description": "The name of the artist." + }, + "picture": { + "type": "string", + "description": "The picture of the artist." + }, + "sha256": { + "type": "string", + "description": "The SHA256 hash of the artist." + }, + "playCount": { + "type": "integer", + "description": "The number of times the artist has been played.", + "minimum": 0 + }, + "uniqueListeners": { + "type": "integer", + "description": "The number of unique listeners who have played the artist.", + "minimum": 0 + } + } + }, + "artistViewDetailed": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The unique identifier of the artist." + }, + "uri": { + "type": "string", + "description": "The URI of the artist.", + "format": "at-uri" + }, + "name": { + "type": "string", + "description": "The name of the artist." + }, + "picture": { + "type": "string", + "description": "The picture of the artist." + }, + "sha256": { + "type": "string", + "description": "The SHA256 hash of the artist." + }, + "playCount": { + "type": "integer", + "description": "The number of times the artist has been played.", + "minimum": 0 + }, + "uniqueListeners": { + "type": "integer", + "description": "The number of unique listeners who have played the artist.", + "minimum": 0 + } + } + } + } +} diff --git a/apps/api/lexicons/artist/getArtist.json b/apps/api/lexicons/artist/getArtist.json new file mode 100644 index 00000000..00f8197f --- /dev/null +++ b/apps/api/lexicons/artist/getArtist.json @@ -0,0 +1,30 @@ +{ + "lexicon": 1, + "id": "app.rocksky.artist.getArtist", + "defs": { + "main": { + "type": "query", + "description": "Get artist details", + "parameters": { + "type": "params", + "required": [ + "uri" + ], + "properties": { + "uri": { + "type": "string", + "description": "The URI of the artist to retrieve details from", + "format": "at-uri" + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "ref", + "ref": "app.rocksky.artist.defs#artistViewDetailed" + } + } + } + } +} diff --git a/apps/api/lexicons/artist/getArtistAlbums.json b/apps/api/lexicons/artist/getArtistAlbums.json new file mode 100644 index 00000000..f119c4d2 --- /dev/null +++ b/apps/api/lexicons/artist/getArtistAlbums.json @@ -0,0 +1,38 @@ +{ + "lexicon": 1, + "id": "app.rocksky.artist.getArtistAlbums", + "defs": { + "main": { + "type": "query", + "description": "Get artist's albums", + "parameters": { + "type": "params", + "required": [ + "uri" + ], + "properties": { + "uri": { + "type": "string", + "description": "The URI of the artist to retrieve albums from", + "format": "at-uri" + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "properties": { + "albums": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.rocksky.album.defs#albumViewBasic" + } + } + } + } + } + } + } +} diff --git a/apps/api/lexicons/artist/getArtistTracks.json b/apps/api/lexicons/artist/getArtistTracks.json new file mode 100644 index 00000000..c7b96822 --- /dev/null +++ b/apps/api/lexicons/artist/getArtistTracks.json @@ -0,0 +1,45 @@ +{ + "lexicon": 1, + "id": "app.rocksky.artist.getArtistTracks", + "defs": { + "main": { + "type": "query", + "description": "Get artist's tracks", + "parameters": { + "type": "params", + "properties": { + "uri": { + "type": "string", + "description": "The URI of the artist to retrieve albums from", + "format": "at-uri" + }, + "limit": { + "type": "integer", + "description": "The maximum number of tracks to return", + "minimum": 1 + }, + "offset": { + "type": "integer", + "description": "The offset for pagination", + "minimum": 0 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "properties": { + "tracks": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.rocksky.song.defs#songViewBasic" + } + } + } + } + } + } + } +} diff --git a/apps/api/lexicons/artist/getArtists.json b/apps/api/lexicons/artist/getArtists.json new file mode 100644 index 00000000..f579cc37 --- /dev/null +++ b/apps/api/lexicons/artist/getArtists.json @@ -0,0 +1,40 @@ +{ + "lexicon": 1, + "id": "app.rocksky.artist.getArtists", + "defs": { + "main": { + "type": "query", + "description": "Get artists", + "parameters": { + "type": "params", + "properties": { + "limit": { + "type": "integer", + "description": "The maximum number of artists to return", + "minimum": 1 + }, + "offset": { + "type": "integer", + "description": "The offset for pagination", + "minimum": 0 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "properties": { + "artists": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.rocksky.artist.defs#artistViewBasic" + } + } + } + } + } + } + } +} diff --git a/apps/api/lexicons/charts/defs.json b/apps/api/lexicons/charts/defs.json new file mode 100644 index 00000000..ed62cf2b --- /dev/null +++ b/apps/api/lexicons/charts/defs.json @@ -0,0 +1,32 @@ +{ + "lexicon": 1, + "id": "app.rocksky.charts.defs", + "defs": { + "chartsView": { + "type": "object", + "properties": { + "scrobbles": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.rocksky.charts.defs#scrobbleViewBasic" + } + } + } + }, + "scrobbleViewBasic": { + "type": "object", + "properties": { + "date": { + "type": "string", + "description": "The date of the scrobble.", + "format": "datetime" + }, + "count": { + "type": "integer", + "description": "The number of scrobbles on this date." + } + } + } + } +} diff --git a/apps/api/lexicons/charts/getScrobblesChart.json b/apps/api/lexicons/charts/getScrobblesChart.json new file mode 100644 index 00000000..dbf5f8c6 --- /dev/null +++ b/apps/api/lexicons/charts/getScrobblesChart.json @@ -0,0 +1,42 @@ +{ + "lexicon": 1, + "id": "app.rocksky.charts.getScrobblesChart", + "defs": { + "main": { + "type": "query", + "description": "Get the scrobbles chart", + "parameters": { + "type": "params", + "properties": { + "did": { + "type": "string", + "description": "The DID or handle of the actor", + "format": "at-identifier" + }, + "artisturi": { + "type": "string", + "description": "The URI of the artist to filter by", + "format": "at-uri" + }, + "albumuri": { + "type": "string", + "description": "The URI of the album to filter by", + "format": "at-uri" + }, + "songuri": { + "type": "string", + "description": "The URI of the track to filter by", + "format": "at-uri" + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "ref", + "ref": "app.rocksky.charts.defs#chartsView" + } + } + } + } +} diff --git a/apps/api/lexicons/dropbox/defs.json b/apps/api/lexicons/dropbox/defs.json new file mode 100644 index 00000000..8d974ffe --- /dev/null +++ b/apps/api/lexicons/dropbox/defs.json @@ -0,0 +1,60 @@ +{ + "lexicon": 1, + "id": "app.rocksky.dropbox.defs", + "defs": { + "fileView": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The unique identifier of the file." + }, + "name": { + "type": "string", + "description": "The name of the file." + }, + "pathLower": { + "type": "string", + "description": "The lowercased path of the file." + }, + "pathDisplay": { + "type": "string", + "description": "The display path of the file." + }, + "clientModified": { + "type": "string", + "description": "The last modified date and time of the file on the client.", + "format": "datetime" + }, + "serverModified": { + "type": "string", + "description": "The last modified date and time of the file on the server.", + "format": "datetime" + } + } + }, + "fileListView": { + "type": "object", + "properties": { + "files": { + "type": "array", + "description": "A list of files in the Dropbox.", + "items": { + "type": "ref", + "ref": "app.rocksky.dropbox.defs#fileView" + } + } + } + }, + "temporaryLinkView": { + "type": "object", + "properties": { + "link": { + "type": "string", + "description": "The temporary link to access the file.", + "format": "uri" + } + } + } + } +} diff --git a/apps/api/lexicons/dropbox/downloadFile.json b/apps/api/lexicons/dropbox/downloadFile.json new file mode 100644 index 00000000..058afdd9 --- /dev/null +++ b/apps/api/lexicons/dropbox/downloadFile.json @@ -0,0 +1,25 @@ +{ + "lexicon": 1, + "id": "app.rocksky.dropbox.downloadFile", + "defs": { + "main": { + "type": "query", + "description": "Download a file from Dropbox by its unique identifier", + "parameters": { + "type": "params", + "required": [ + "fileId" + ], + "properties": { + "fileId": { + "type": "string", + "description": "The unique identifier of the file to download" + } + } + }, + "output": { + "encoding": "application/octet-stream" + } + } + } +} diff --git a/apps/api/lexicons/dropbox/getFiles.json b/apps/api/lexicons/dropbox/getFiles.json new file mode 100644 index 00000000..eac0a772 --- /dev/null +++ b/apps/api/lexicons/dropbox/getFiles.json @@ -0,0 +1,26 @@ +{ + "lexicon": 1, + "id": "app.rocksky.dropbox.getFiles", + "defs": { + "main": { + "type": "query", + "description": "Retrieve a list of files from Dropbox", + "parameters": { + "type": "params", + "properties": { + "at": { + "type": "string", + "description": "Path to the Dropbox folder or root directory" + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "ref", + "ref": "app.rocksky.dropbox.defs#fileListView" + } + } + } + } +} diff --git a/apps/api/lexicons/dropbox/getMetadata.json b/apps/api/lexicons/dropbox/getMetadata.json new file mode 100644 index 00000000..895c126e --- /dev/null +++ b/apps/api/lexicons/dropbox/getMetadata.json @@ -0,0 +1,29 @@ +{ + "lexicon": 1, + "id": "app.rocksky.dropbox.getMetadata", + "defs": { + "main": { + "type": "query", + "description": "Retrieve metadata of a file or folder in Dropbox", + "parameters": { + "type": "params", + "required": [ + "path" + ], + "properties": { + "path": { + "type": "string", + "description": "Path to the file or folder in Dropbox" + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "ref", + "ref": "app.rocksky.dropbox.defs#fileView" + } + } + } + } +} diff --git a/apps/api/lexicons/dropbox/getTemporaryLink.json b/apps/api/lexicons/dropbox/getTemporaryLink.json new file mode 100644 index 00000000..be539bdc --- /dev/null +++ b/apps/api/lexicons/dropbox/getTemporaryLink.json @@ -0,0 +1,29 @@ +{ + "lexicon": 1, + "id": "app.rocksky.dropbox.getTemporaryLink", + "defs": { + "main": { + "type": "query", + "description": "Retrieve a temporary link to access a file in Dropbox", + "parameters": { + "type": "params", + "required": [ + "path" + ], + "properties": { + "path": { + "type": "string", + "description": "Path to the file in Dropbox" + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "ref", + "ref": "app.rocksky.dropbox.defs#temporaryLinkView" + } + } + } + } +} diff --git a/apps/api/lexicons/feed/defs.json b/apps/api/lexicons/feed/defs.json new file mode 100644 index 00000000..2c404d15 --- /dev/null +++ b/apps/api/lexicons/feed/defs.json @@ -0,0 +1,105 @@ +{ + "lexicon": 1, + "id": "app.rocksky.feed.defs", + "defs": { + "searchResultsView": { + "type": "object", + "properties": { + "hits": { + "type": "array", + "items": { + "type": "union", + "refs": [ + "app.rocksky.song.defs#songViewBasic", + "app.rocksky.album.defs#albumViewBasic", + "app.rocksky.artist.defs#artistViewBasic", + "app.rocksky.playlist.defs#playlistViewBasic", + "app.rocksky.actor.defs#profileViewBasic" + ] + } + }, + "processingTimeMs": { + "type": "integer" + }, + "limit": { + "type": "integer" + }, + "offset": { + "type": "integer" + }, + "estimatedTotalHits": { + "type": "integer" + } + } + }, + "nowPlayingView": { + "type": "object", + "properties": { + "album": { + "type": "string" + }, + "albumArt": { + "type": "string", + "format": "uri" + }, + "albumArtist": { + "type": "string" + }, + "albumUri": { + "type": "string", + "format": "at-uri" + }, + "artist": { + "type": "string" + }, + "artistUri": { + "type": "string", + "format": "at-uri" + }, + "avatar": { + "type": "string", + "format": "uri" + }, + "createdAt": { + "type": "string" + }, + "did": { + "type": "string", + "format": "at-identifier" + }, + "handle": { + "type": "string" + }, + "id": { + "type": "string" + }, + "title": { + "type": "string" + }, + "trackId": { + "type": "string" + }, + "trackUri": { + "type": "string", + "format": "at-uri" + }, + "uri": { + "type": "string", + "format": "at-uri" + } + } + }, + "nowPlayingsView": { + "type": "object", + "properties": { + "nowPlayings": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.rocksky.feed.defs#nowPlayingView" + } + } + } + } + } +} diff --git a/apps/api/lexicons/feed/getNowPlayings.json b/apps/api/lexicons/feed/getNowPlayings.json new file mode 100644 index 00000000..4aa9aa9c --- /dev/null +++ b/apps/api/lexicons/feed/getNowPlayings.json @@ -0,0 +1,27 @@ +{ + "lexicon": 1, + "id": "app.rocksky.feed.getNowPlayings", + "defs": { + "main": { + "type": "query", + "description": "Get all currently playing tracks by users", + "parameters": { + "type": "params", + "properties": { + "size": { + "type": "integer", + "description": "The maximum number of now playing tracks to return.", + "minimum": 1 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "ref", + "ref": "app.rocksky.feed.defs#nowPlayingsView" + } + } + } + } +} diff --git a/apps/api/lexicons/feed/search.json b/apps/api/lexicons/feed/search.json new file mode 100644 index 00000000..e8eaf7c6 --- /dev/null +++ b/apps/api/lexicons/feed/search.json @@ -0,0 +1,29 @@ +{ + "lexicon": 1, + "id": "app.rocksky.feed.search", + "defs": { + "main": { + "type": "query", + "description": "Search for content in the feed", + "parameters": { + "type": "params", + "required": [ + "query" + ], + "properties": { + "query": { + "type": "string", + "description": "The search query string" + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "ref", + "ref": "app.rocksky.feed.defs#searchResultsView" + } + } + } + } +} diff --git a/apps/api/lexicons/googledrive/defs.json b/apps/api/lexicons/googledrive/defs.json new file mode 100644 index 00000000..0dcd9c05 --- /dev/null +++ b/apps/api/lexicons/googledrive/defs.json @@ -0,0 +1,27 @@ +{ + "lexicon": 1, + "id": "app.rocksky.googledrive.defs", + "defs": { + "fileView": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The unique identifier of the file." + } + } + }, + "fileListView": { + "type": "object", + "properties": { + "files": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.rocksky.googledrive.defs#fileView" + } + } + } + } + } +} diff --git a/apps/api/lexicons/googledrive/downloadFile.json b/apps/api/lexicons/googledrive/downloadFile.json new file mode 100644 index 00000000..8f1199d2 --- /dev/null +++ b/apps/api/lexicons/googledrive/downloadFile.json @@ -0,0 +1,25 @@ +{ + "lexicon": 1, + "id": "app.rocksky.googledrive.downloadFile", + "defs": { + "main": { + "type": "query", + "description": "Download a file from Google Drive by its unique identifier", + "parameters": { + "type": "params", + "required": [ + "fileId" + ], + "properties": { + "fileId": { + "type": "string", + "description": "The unique identifier of the file to download" + } + } + }, + "output": { + "encoding": "application/octet-stream" + } + } + } +} diff --git a/apps/api/lexicons/googledrive/getFile.json b/apps/api/lexicons/googledrive/getFile.json new file mode 100644 index 00000000..1ff9fd6a --- /dev/null +++ b/apps/api/lexicons/googledrive/getFile.json @@ -0,0 +1,29 @@ +{ + "lexicon": 1, + "id": "app.rocksky.googledrive.getFile", + "defs": { + "main": { + "type": "query", + "description": "Get a file from Google Drive by its unique identifier", + "parameters": { + "type": "params", + "required": [ + "fileId" + ], + "properties": { + "fileId": { + "type": "string", + "description": "The unique identifier of the file to retrieve" + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "ref", + "ref": "app.rocksky.googledrive.defs#fileView" + } + } + } + } +} diff --git a/apps/api/lexicons/googledrive/getFiles.json b/apps/api/lexicons/googledrive/getFiles.json new file mode 100644 index 00000000..f1f0d5c0 --- /dev/null +++ b/apps/api/lexicons/googledrive/getFiles.json @@ -0,0 +1,26 @@ +{ + "lexicon": 1, + "id": "app.rocksky.googledrive.getFiles", + "defs": { + "main": { + "type": "query", + "description": "Get a list of files from Google Drive", + "parameters": { + "type": "params", + "properties": { + "at": { + "type": "string", + "description": "Path to the Google Drive folder or root directory" + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "ref", + "ref": "app.rocksky.googledrive.defs#fileListView" + } + } + } + } +} diff --git a/apps/api/lexicons/like/dislikeShout.json b/apps/api/lexicons/like/dislikeShout.json new file mode 100644 index 00000000..665de008 --- /dev/null +++ b/apps/api/lexicons/like/dislikeShout.json @@ -0,0 +1,30 @@ +{ + "lexicon": 1, + "id": "app.rocksky.like.dislikeShout", + "defs": { + "main": { + "type": "procedure", + "description": "Dislike a shout", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "properties": { + "uri": { + "type": "string", + "description": "The unique identifier of the shout to dislike", + "format": "at-uri" + } + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "ref", + "ref": "app.rocksky.shout.defs#shoutView" + } + } + } + } +} diff --git a/apps/api/lexicons/like/dislikeSong.json b/apps/api/lexicons/like/dislikeSong.json new file mode 100644 index 00000000..5d61186e --- /dev/null +++ b/apps/api/lexicons/like/dislikeSong.json @@ -0,0 +1,30 @@ +{ + "lexicon": 1, + "id": "app.rocksky.like.dislikeSong", + "defs": { + "main": { + "type": "procedure", + "description": "Dislike a song", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "properties": { + "uri": { + "type": "string", + "description": "The unique identifier of the song to dislike", + "format": "at-uri" + } + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "ref", + "ref": "app.rocksky.song.defs#songViewDetailed" + } + } + } + } +} diff --git a/apps/api/lexicons/like/like.json b/apps/api/lexicons/like/like.json new file mode 100644 index 00000000..128f1f85 --- /dev/null +++ b/apps/api/lexicons/like/like.json @@ -0,0 +1,29 @@ +{ + "lexicon": 1, + "id": "app.rocksky.like", + "defs": { + "main": { + "type": "record", + "description": "A declaration of a like.", + "key": "tid", + "record": { + "type": "object", + "required": [ + "createdAt", + "subject" + ], + "properties": { + "createdAt": { + "type": "string", + "description": "The date when the like was created.", + "format": "datetime" + }, + "subject": { + "type": "ref", + "ref": "com.atproto.repo.strongRef" + } + } + } + } + } +} diff --git a/apps/api/lexicons/like/likeShout.json b/apps/api/lexicons/like/likeShout.json new file mode 100644 index 00000000..e15203e2 --- /dev/null +++ b/apps/api/lexicons/like/likeShout.json @@ -0,0 +1,30 @@ +{ + "lexicon": 1, + "id": "app.rocksky.like.likeShout", + "defs": { + "main": { + "type": "procedure", + "description": "Like a shout", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "properties": { + "uri": { + "type": "string", + "description": "The unique identifier of the shout to like", + "format": "at-uri" + } + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "ref", + "ref": "app.rocksky.shout.defs#shoutView" + } + } + } + } +} diff --git a/apps/api/lexicons/like/likeSong.json b/apps/api/lexicons/like/likeSong.json new file mode 100644 index 00000000..5f54e2be --- /dev/null +++ b/apps/api/lexicons/like/likeSong.json @@ -0,0 +1,30 @@ +{ + "lexicon": 1, + "id": "app.rocksky.like.likeSong", + "defs": { + "main": { + "type": "procedure", + "description": "Like a song", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "properties": { + "uri": { + "type": "string", + "description": "The unique identifier of the song to like", + "format": "at-uri" + } + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "ref", + "ref": "app.rocksky.song.defs#songViewDetailed" + } + } + } + } +} diff --git a/apps/api/lexicons/player/defs.json b/apps/api/lexicons/player/defs.json new file mode 100644 index 00000000..cdb221de --- /dev/null +++ b/apps/api/lexicons/player/defs.json @@ -0,0 +1,15 @@ +{ + "lexicon": 1, + "id": "app.rocksky.player.defs", + "defs": { + "currentlyPlayingViewDetailed": { + "type": "object", + "properties": { + "title": { + "type": "string", + "description": "The title of the currently playing track" + } + } + } + } +} diff --git a/apps/api/lexicons/player/getCurrentlyPlaying.json b/apps/api/lexicons/player/getCurrentlyPlaying.json new file mode 100644 index 00000000..43bcccee --- /dev/null +++ b/apps/api/lexicons/player/getCurrentlyPlaying.json @@ -0,0 +1,27 @@ +{ + "lexicon": 1, + "id": "app.rocksky.player.getCurrentlyPlaying", + "defs": { + "main": { + "type": "query", + "description": "Get the currently playing track", + "parameters": { + "type": "params", + "properties": { + "actor": { + "type": "string", + "description": "Handle or DID of the actor to retrieve the currently playing track for. If not provided, defaults to the current user.", + "format": "at-identifier" + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "ref", + "ref": "app.rocksky.player.defs#currentlyPlayingViewDetailed" + } + } + } + } +} diff --git a/apps/api/lexicons/player/next.json b/apps/api/lexicons/player/next.json new file mode 100644 index 00000000..b9e340be --- /dev/null +++ b/apps/api/lexicons/player/next.json @@ -0,0 +1,10 @@ +{ + "lexicon": 1, + "id": "app.rocksky.player.next", + "defs": { + "main": { + "type": "procedure", + "description": "Play the next track in the queue" + } + } +} diff --git a/apps/api/lexicons/player/pause.json b/apps/api/lexicons/player/pause.json new file mode 100644 index 00000000..38758a6e --- /dev/null +++ b/apps/api/lexicons/player/pause.json @@ -0,0 +1,10 @@ +{ + "lexicon": 1, + "id": "app.rocksky.player.pause", + "defs": { + "main": { + "type": "procedure", + "description": "Pause the currently playing track" + } + } +} diff --git a/apps/api/lexicons/player/play.json b/apps/api/lexicons/player/play.json new file mode 100644 index 00000000..e27bc466 --- /dev/null +++ b/apps/api/lexicons/player/play.json @@ -0,0 +1,10 @@ +{ + "lexicon": 1, + "id": "app.rocksky.player.play", + "defs": { + "main": { + "type": "procedure", + "description": "Resume playback of the currently paused track" + } + } +} diff --git a/apps/api/lexicons/player/previous.json b/apps/api/lexicons/player/previous.json new file mode 100644 index 00000000..ae2904d3 --- /dev/null +++ b/apps/api/lexicons/player/previous.json @@ -0,0 +1,10 @@ +{ + "lexicon": 1, + "id": "app.rocksky.player.previous", + "defs": { + "main": { + "type": "procedure", + "description": "Play the previous track in the queue" + } + } +} diff --git a/apps/api/lexicons/player/seek.json b/apps/api/lexicons/player/seek.json new file mode 100644 index 00000000..59dbe256 --- /dev/null +++ b/apps/api/lexicons/player/seek.json @@ -0,0 +1,22 @@ +{ + "lexicon": 1, + "id": "app.rocksky.player.seek", + "defs": { + "main": { + "type": "procedure", + "description": "Seek to a specific position in the currently playing track", + "parameters": { + "type": "params", + "required": [ + "position" + ], + "properties": { + "position": { + "type": "integer", + "description": "The position in seconds to seek to" + } + } + } + } + } +} diff --git a/apps/api/lexicons/playlist/defs.json b/apps/api/lexicons/playlist/defs.json new file mode 100644 index 00000000..fda7a81a --- /dev/null +++ b/apps/api/lexicons/playlist/defs.json @@ -0,0 +1,123 @@ +{ + "lexicon": 1, + "id": "app.rocksky.playlist.defs", + "defs": { + "playlistViewDetailed": { + "type": "object", + "description": "Detailed view of a playlist, including its tracks and metadata", + "properties": { + "id": { + "type": "string", + "description": "The unique identifier of the playlist." + }, + "title": { + "type": "string", + "description": "The title of the playlist." + }, + "uri": { + "type": "string", + "description": "The URI of the playlist.", + "format": "at-uri" + }, + "curatorDid": { + "type": "string", + "description": "The DID of the curator of the playlist.", + "format": "at-identifier" + }, + "curatorHandle": { + "type": "string", + "description": "The handle of the curator of the playlist.", + "format": "at-identifier" + }, + "curatorName": { + "type": "string", + "description": "The name of the curator of the playlist." + }, + "curatorAvatarUrl": { + "type": "string", + "description": "The URL of the avatar image of the curator.", + "format": "uri" + }, + "description": { + "type": "string", + "description": "A description of the playlist." + }, + "coverImageUrl": { + "type": "string", + "description": "The URL of the cover image for the playlist.", + "format": "uri" + }, + "createdAt": { + "type": "string", + "description": "The date and time when the playlist was created.", + "format": "datetime" + }, + "tracks": { + "type": "array", + "description": "A list of tracks in the playlist.", + "items": { + "type": "ref", + "ref": "app.rocksky.song.defs#songViewBasic" + } + } + } + }, + "playlistViewBasic": { + "type": "object", + "description": "Basic view of a playlist, including its metadata", + "properties": { + "id": { + "type": "string", + "description": "The unique identifier of the playlist." + }, + "title": { + "type": "string", + "description": "The title of the playlist." + }, + "uri": { + "type": "string", + "description": "The URI of the playlist.", + "format": "at-uri" + }, + "curatorDid": { + "type": "string", + "description": "The DID of the curator of the playlist.", + "format": "at-identifier" + }, + "curatorHandle": { + "type": "string", + "description": "The handle of the curator of the playlist.", + "format": "at-identifier" + }, + "curatorName": { + "type": "string", + "description": "The name of the curator of the playlist." + }, + "curatorAvatarUrl": { + "type": "string", + "description": "The URL of the avatar image of the curator.", + "format": "uri" + }, + "description": { + "type": "string", + "description": "A description of the playlist." + }, + "coverImageUrl": { + "type": "string", + "description": "The URL of the cover image for the playlist.", + "format": "uri" + }, + "createdAt": { + "type": "string", + "description": "The date and time when the playlist was created.", + "format": "datetime" + }, + "trackCount": { + "type": "integer", + "description": "The number of tracks in the playlist.", + "minimum": 0 + } + } + } + } +} diff --git a/apps/api/lexicons/playlist/getPlaylist.json b/apps/api/lexicons/playlist/getPlaylist.json new file mode 100644 index 00000000..57b3bad6 --- /dev/null +++ b/apps/api/lexicons/playlist/getPlaylist.json @@ -0,0 +1,30 @@ +{ + "lexicon": 1, + "id": "app.rocksky.playlist.getPlaylist", + "defs": { + "main": { + "type": "query", + "description": "Retrieve a playlist by its ID", + "parameters": { + "type": "params", + "required": [ + "uri" + ], + "properties": { + "uri": { + "type": "string", + "description": "The URI of the playlist to retrieve.", + "format": "at-uri" + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "ref", + "ref": "app.rocksky.playlist.defs#playlistViewDetailed" + } + } + } + } +} diff --git a/apps/api/lexicons/playlist/getPlaylists.json b/apps/api/lexicons/playlist/getPlaylists.json new file mode 100644 index 00000000..cd4627cd --- /dev/null +++ b/apps/api/lexicons/playlist/getPlaylists.json @@ -0,0 +1,38 @@ +{ + "lexicon": 1, + "id": "app.rocksky.playlist.getPlaylists", + "defs": { + "main": { + "type": "query", + "description": "Retrieve a list of playlists", + "parameters": { + "type": "params", + "properties": { + "limit": { + "type": "integer", + "description": "The maximum number of playlists to return." + }, + "offset": { + "type": "integer", + "description": "The offset for pagination, used to skip a number of playlists." + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "properties": { + "playlists": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.rocksky.playlist.defs#playlistViewBasic" + } + } + } + } + } + } + } +} diff --git a/apps/api/lexicons/playlist/playlist.json b/apps/api/lexicons/playlist/playlist.json new file mode 100644 index 00000000..b0afce08 --- /dev/null +++ b/apps/api/lexicons/playlist/playlist.json @@ -0,0 +1,70 @@ +{ + "lexicon": 1, + "id": "app.rocksky.playlist", + "defs": { + "main": { + "type": "record", + "description": "A declaration of a playlist.", + "key": "tid", + "record": { + "type": "object", + "required": [ + "name", + "createdAt" + ], + "properties": { + "name": { + "type": "string", + "description": "The name of the playlist.", + "minLength": 1, + "maxLength": 512 + }, + "description": { + "type": "string", + "description": "The playlist description.", + "minLength": 1, + "maxLength": 256 + }, + "picture": { + "type": "blob", + "description": "The picture of the playlist.", + "accept": [ + "image/png", + "image/jpeg" + ], + "maxSize": 2000000 + }, + "tracks": { + "type": "array", + "description": "The tracks in the playlist.", + "items": { + "type": "ref", + "ref": "app.rocksky.song#record" + } + }, + "createdAt": { + "type": "string", + "description": "The date the playlist was created.", + "format": "datetime" + }, + "spotifyLink": { + "type": "string", + "description": "The Spotify link of the playlist." + }, + "tidalLink": { + "type": "string", + "description": "The Tidal link of the playlist." + }, + "youtubeLink": { + "type": "string", + "description": "The YouTube link of the playlist." + }, + "appleMusicLink": { + "type": "string", + "description": "The Apple Music link of the playlist." + } + } + } + } + } +} diff --git a/apps/api/lexicons/radio/defs.json b/apps/api/lexicons/radio/defs.json new file mode 100644 index 00000000..47a14de7 --- /dev/null +++ b/apps/api/lexicons/radio/defs.json @@ -0,0 +1,68 @@ +{ + "lexicon": 1, + "id": "app.rocksky.radio.defs", + "defs": { + "radioViewBasic": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The unique identifier of the radio." + }, + "name": { + "type": "string", + "description": "The name of the radio." + }, + "description": { + "type": "string", + "description": "A brief description of the radio." + }, + "createdAt": { + "type": "string", + "description": "The date and time when the radio was created.", + "format": "datetime" + } + } + }, + "radioViewDetailed": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The unique identifier of the radio." + }, + "name": { + "type": "string", + "description": "The name of the radio." + }, + "description": { + "type": "string", + "description": "A brief description of the radio." + }, + "website": { + "type": "string", + "description": "The website of the radio.", + "format": "uri" + }, + "url": { + "type": "string", + "description": "The streaming URL of the radio.", + "format": "uri" + }, + "genre": { + "type": "string", + "description": "The genre of the radio." + }, + "logo": { + "type": "string", + "description": "The logo of the radio station." + }, + "createdAt": { + "type": "string", + "description": "The date and time when the radio was created.", + "format": "datetime" + } + } + } + } +} diff --git a/apps/api/lexicons/radio/radio.json b/apps/api/lexicons/radio/radio.json new file mode 100644 index 00000000..3dfd4809 --- /dev/null +++ b/apps/api/lexicons/radio/radio.json @@ -0,0 +1,63 @@ +{ + "lexicon": 1, + "id": "app.rocksky.radio", + "defs": { + "main": { + "type": "record", + "description": "A declaration of a radio station.", + "key": "tid", + "record": { + "type": "object", + "required": [ + "name", + "url", + "createdAt" + ], + "properties": { + "name": { + "type": "string", + "description": "The name of the radio station.", + "minLength": 1, + "maxLength": 512 + }, + "url": { + "type": "string", + "description": "The URL of the radio station.", + "format": "uri" + }, + "description": { + "type": "string", + "description": "A description of the radio station.", + "minLength": 1, + "maxLength": 1000 + }, + "genre": { + "type": "string", + "description": "The genre of the radio station.", + "minLength": 1, + "maxLength": 256 + }, + "logo": { + "type": "blob", + "description": "The logo of the radio station.", + "accept": [ + "image/png", + "image/jpeg" + ], + "maxSize": 2000000 + }, + "website": { + "type": "string", + "description": "The website of the radio station.", + "format": "uri" + }, + "createdAt": { + "type": "string", + "description": "The date when the radio station was created.", + "format": "datetime" + } + } + } + } + } +} diff --git a/apps/api/lexicons/scrobble/createScrobble.json b/apps/api/lexicons/scrobble/createScrobble.json new file mode 100644 index 00000000..ea947a68 --- /dev/null +++ b/apps/api/lexicons/scrobble/createScrobble.json @@ -0,0 +1,125 @@ +{ + "lexicon": 1, + "id": "app.rocksky.scrobble.createScrobble", + "defs": { + "main": { + "type": "procedure", + "description": "Create a new scrobble", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": [ + "title", + "artist" + ], + "properties": { + "title": { + "type": "string", + "description": "The title of the track being scrobbled" + }, + "artist": { + "type": "string", + "description": "The artist of the track being scrobbled" + }, + "album": { + "type": "string", + "description": "The album of the track being scrobbled" + }, + "duration": { + "type": "integer", + "description": "The duration of the track in seconds" + }, + "mbId": { + "type": "string", + "description": "The MusicBrainz ID of the track, if available" + }, + "albumArt": { + "type": "string", + "description": "The URL of the album art for the track", + "format": "uri" + }, + "trackNumber": { + "type": "integer", + "description": "The track number of the track in the album" + }, + "releaseDate": { + "type": "string", + "description": "The release date of the track, formatted as YYYY-MM-DD" + }, + "year": { + "type": "integer", + "description": "The year the track was released" + }, + "discNumber": { + "type": "integer", + "description": "The disc number of the track in the album, if applicable" + }, + "lyrics": { + "type": "string", + "description": "The lyrics of the track, if available" + }, + "composer": { + "type": "string", + "description": "The composer of the track, if available" + }, + "copyrightMessage": { + "type": "string", + "description": "The copyright message for the track, if available" + }, + "label": { + "type": "string", + "description": "The record label of the track, if available" + }, + "artistPicture": { + "type": "string", + "description": "The URL of the artist's picture, if available", + "format": "uri" + }, + "spotifyLink": { + "type": "string", + "description": "The Spotify link for the track, if available", + "format": "uri" + }, + "lastfmLink": { + "type": "string", + "description": "The Last.fm link for the track, if available", + "format": "uri" + }, + "tidalLink": { + "type": "string", + "description": "The Tidal link for the track, if available", + "format": "uri" + }, + "appleMusicLink": { + "type": "string", + "description": "The Apple Music link for the track, if available", + "format": "uri" + }, + "youtubeLink": { + "type": "string", + "description": "The Youtube link for the track, if available", + "format": "uri" + }, + "deezerLink": { + "type": "string", + "description": "The Deezer link for the track, if available", + "format": "uri" + }, + "timestamp": { + "type": "integer", + "description": "The timestamp of the scrobble in milliseconds since epoch" + } + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "ref", + "ref": "app.rocksky.scrobble.defs#scrobbleViewBasic" + } + } + } + } +} diff --git a/apps/api/lexicons/scrobble/defs.json b/apps/api/lexicons/scrobble/defs.json new file mode 100644 index 00000000..001b7172 --- /dev/null +++ b/apps/api/lexicons/scrobble/defs.json @@ -0,0 +1,122 @@ +{ + "lexicon": 1, + "id": "app.rocksky.scrobble.defs", + "defs": { + "scrobbleViewBasic": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The unique identifier of the scrobble." + }, + "user": { + "type": "string", + "description": "The handle of the user who created the scrobble." + }, + "title": { + "type": "string", + "description": "The title of the scrobble." + }, + "artist": { + "type": "string", + "description": "The artist of the song." + }, + "artistUri": { + "type": "string", + "description": "The URI of the artist.", + "format": "at-uri" + }, + "album": { + "type": "string", + "description": "The album of the song." + }, + "albumUri": { + "type": "string", + "description": "The URI of the album.", + "format": "at-uri" + }, + "cover": { + "type": "string", + "description": "The album art URL of the song.", + "format": "uri" + }, + "date": { + "type": "string", + "description": "The timestamp when the scrobble was created.", + "format": "datetime" + }, + "uri": { + "type": "string", + "description": "The URI of the scrobble.", + "format": "uri" + }, + "sha256": { + "type": "string", + "description": "The SHA256 hash of the scrobble data." + } + } + }, + "scrobbleViewDetailed": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The unique identifier of the scrobble." + }, + "user": { + "type": "string", + "description": "The handle of the user who created the scrobble." + }, + "title": { + "type": "string", + "description": "The title of the scrobble." + }, + "artist": { + "type": "string", + "description": "The artist of the song." + }, + "artistUri": { + "type": "string", + "description": "The URI of the artist.", + "format": "at-uri" + }, + "album": { + "type": "string", + "description": "The album of the song." + }, + "albumUri": { + "type": "string", + "description": "The URI of the album.", + "format": "at-uri" + }, + "cover": { + "type": "string", + "description": "The album art URL of the song.", + "format": "uri" + }, + "date": { + "type": "string", + "description": "The timestamp when the scrobble was created.", + "format": "datetime" + }, + "uri": { + "type": "string", + "description": "The URI of the scrobble.", + "format": "uri" + }, + "sha256": { + "type": "string", + "description": "The SHA256 hash of the scrobble data." + }, + "listeners": { + "type": "integer", + "description": "The number of listeners" + }, + "scrobbles": { + "type": "integer", + "description": "The number of scrobbles for this song" + } + } + } + } +} diff --git a/apps/api/lexicons/scrobble/getScrobble.json b/apps/api/lexicons/scrobble/getScrobble.json new file mode 100644 index 00000000..f8259ccf --- /dev/null +++ b/apps/api/lexicons/scrobble/getScrobble.json @@ -0,0 +1,30 @@ +{ + "lexicon": 1, + "id": "app.rocksky.scrobble.getScrobble", + "defs": { + "main": { + "type": "query", + "description": "Get a scrobble by its unique identifier", + "parameters": { + "type": "params", + "required": [ + "uri" + ], + "properties": { + "uri": { + "type": "string", + "description": "The unique identifier of the scrobble", + "format": "at-uri" + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "ref", + "ref": "app.rocksky.scrobble.defs#scrobbleViewDetailed" + } + } + } + } +} diff --git a/apps/api/lexicons/scrobble/getScrobbles.json b/apps/api/lexicons/scrobble/getScrobbles.json new file mode 100644 index 00000000..d74f4f72 --- /dev/null +++ b/apps/api/lexicons/scrobble/getScrobbles.json @@ -0,0 +1,45 @@ +{ + "lexicon": 1, + "id": "app.rocksky.scrobble.getScrobbles", + "defs": { + "main": { + "type": "query", + "description": "Get scrobbles all scrobbles", + "parameters": { + "type": "params", + "properties": { + "did": { + "type": "string", + "description": "The DID or handle of the actor", + "format": "at-identifier" + }, + "limit": { + "type": "integer", + "description": "The maximum number of scrobbles to return", + "minimum": 1 + }, + "offset": { + "type": "integer", + "description": "The offset for pagination", + "minimum": 0 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "properties": { + "scrobbles": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.rocksky.scrobble.defs#scrobbleViewBasic" + } + } + } + } + } + } + } +} diff --git a/apps/api/lexicons/scrobble/scrobble.json b/apps/api/lexicons/scrobble/scrobble.json new file mode 100644 index 00000000..e158f616 --- /dev/null +++ b/apps/api/lexicons/scrobble/scrobble.json @@ -0,0 +1,149 @@ +{ + "lexicon": 1, + "id": "app.rocksky.scrobble", + "defs": { + "main": { + "type": "record", + "description": "A declaration of a scrobble.", + "key": "tid", + "record": { + "type": "object", + "required": [ + "title", + "artist", + "album", + "albumArtist", + "duration", + "createdAt" + ], + "properties": { + "title": { + "type": "string", + "description": "The title of the song.", + "minLength": 1, + "maxLength": 512 + }, + "artist": { + "type": "string", + "description": "The artist of the song.", + "minLength": 1, + "maxLength": 256 + }, + "albumArtist": { + "type": "string", + "description": "The album artist of the song.", + "minLength": 1, + "maxLength": 256 + }, + "album": { + "type": "string", + "description": "The album of the song.", + "minLength": 1, + "maxLength": 256 + }, + "duration": { + "type": "integer", + "description": "The duration of the song in seconds.", + "minimum": 1 + }, + "trackNumber": { + "type": "integer", + "description": "The track number of the song in the album.", + "minimum": 1 + }, + "discNumber": { + "type": "integer", + "description": "The disc number of the song in the album.", + "minimum": 1 + }, + "releaseDate": { + "type": "string", + "description": "The release date of the song.", + "format": "datetime" + }, + "year": { + "type": "integer", + "description": "The year the song was released." + }, + "genre": { + "type": "string", + "description": "The genre of the song.", + "maxLength": 256 + }, + "tags": { + "type": "array", + "description": "The tags of the song.", + "items": { + "type": "string", + "minLength": 1, + "maxLength": 256 + } + }, + "composer": { + "type": "string", + "description": "The composer of the song.", + "maxLength": 256 + }, + "lyrics": { + "type": "string", + "description": "The lyrics of the song.", + "maxLength": 10000 + }, + "copyrightMessage": { + "type": "string", + "description": "The copyright message of the song.", + "maxLength": 256 + }, + "wiki": { + "type": "string", + "description": "Informations about the song", + "maxLength": 10000 + }, + "albumArt": { + "type": "blob", + "description": "The album art of the song.", + "accept": [ + "image/png", + "image/jpeg" + ], + "maxSize": 2000000 + }, + "youtubeLink": { + "type": "string", + "description": "The YouTube link of the song.", + "format": "uri" + }, + "spotifyLink": { + "type": "string", + "description": "The Spotify link of the song.", + "format": "uri" + }, + "tidalLink": { + "type": "string", + "description": "The Tidal link of the song.", + "format": "uri" + }, + "appleMusicLink": { + "type": "string", + "description": "The Apple Music link of the song.", + "format": "uri" + }, + "createdAt": { + "type": "string", + "description": "The date when the song was created.", + "format": "datetime" + }, + "mbid": { + "type": "string", + "description": "The MusicBrainz ID of the song." + }, + "label": { + "type": "string", + "description": "The label of the song.", + "maxLength": 256 + } + } + } + } + } +} diff --git a/apps/api/lexicons/shout/createShout.json b/apps/api/lexicons/shout/createShout.json new file mode 100644 index 00000000..e9bf97f3 --- /dev/null +++ b/apps/api/lexicons/shout/createShout.json @@ -0,0 +1,30 @@ +{ + "lexicon": 1, + "id": "app.rocksky.shout.createShout", + "defs": { + "main": { + "type": "procedure", + "description": "Create a new shout", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "The content of the shout", + "minLength": 1 + } + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "ref", + "ref": "app.rocksky.shout.defs#shoutView" + } + } + } + } +} diff --git a/apps/api/lexicons/shout/defs.json b/apps/api/lexicons/shout/defs.json new file mode 100644 index 00000000..d3b7df42 --- /dev/null +++ b/apps/api/lexicons/shout/defs.json @@ -0,0 +1,61 @@ +{ + "lexicon": 1, + "id": "app.rocksky.shout.defs", + "defs": { + "author": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The unique identifier of the author." + }, + "did": { + "type": "string", + "description": "The decentralized identifier (DID) of the author.", + "format": "at-identifier" + }, + "handle": { + "type": "string", + "description": "The handle of the author.", + "format": "at-identifier" + }, + "displayName": { + "type": "string", + "description": "The display name of the author." + }, + "avatar": { + "type": "string", + "description": "The URL of the author's avatar image.", + "format": "uri" + } + } + }, + "shoutView": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The unique identifier of the shout." + }, + "message": { + "type": "string", + "description": "The content of the shout." + }, + "parent": { + "type": "string", + "description": "The ID of the parent shout if this is a reply, otherwise null." + }, + "createdAt": { + "type": "string", + "description": "The date and time when the shout was created.", + "format": "datetime" + }, + "author": { + "type": "ref", + "description": "The author of the shout.", + "ref": "app.rocksky.shout.defs#author" + } + } + } + } +} diff --git a/apps/api/lexicons/shout/getAlbumShouts.json b/apps/api/lexicons/shout/getAlbumShouts.json new file mode 100644 index 00000000..16f0e4f3 --- /dev/null +++ b/apps/api/lexicons/shout/getAlbumShouts.json @@ -0,0 +1,48 @@ +{ + "lexicon": 1, + "id": "app.rocksky.shout.getAlbumShouts", + "defs": { + "main": { + "type": "query", + "description": "Get shouts for an album", + "parameters": { + "type": "params", + "required": [ + "uri" + ], + "properties": { + "uri": { + "type": "string", + "description": "The unique identifier of the album to retrieve shouts for", + "format": "at-uri" + }, + "limit": { + "type": "integer", + "description": "The maximum number of shouts to return", + "minimum": 1 + }, + "offset": { + "type": "integer", + "description": "The number of shouts to skip before starting to collect the result set", + "minimum": 0 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "properties": { + "shouts": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.rocksky.shout.defs#shoutViewBasic" + } + } + } + } + } + } + } +} diff --git a/apps/api/lexicons/shout/getArtistShouts.json b/apps/api/lexicons/shout/getArtistShouts.json new file mode 100644 index 00000000..5d8a5527 --- /dev/null +++ b/apps/api/lexicons/shout/getArtistShouts.json @@ -0,0 +1,48 @@ +{ + "lexicon": 1, + "id": "app.rocksky.shout.getArtistShouts", + "defs": { + "main": { + "type": "query", + "description": "Get shouts for an artist", + "parameters": { + "type": "params", + "required": [ + "uri" + ], + "properties": { + "uri": { + "type": "string", + "description": "The URI of the artist to retrieve shouts for", + "format": "at-uri" + }, + "limit": { + "type": "integer", + "description": "The maximum number of shouts to return", + "minimum": 1 + }, + "offset": { + "type": "integer", + "description": "The number of shouts to skip before starting to collect the result set", + "minimum": 0 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "properties": { + "shouts": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.rocksky.shout.defs#shoutViewBasic" + } + } + } + } + } + } + } +} diff --git a/apps/api/lexicons/shout/getProfileShouts.json b/apps/api/lexicons/shout/getProfileShouts.json new file mode 100644 index 00000000..05b16ce8 --- /dev/null +++ b/apps/api/lexicons/shout/getProfileShouts.json @@ -0,0 +1,48 @@ +{ + "lexicon": 1, + "id": "app.rocksky.shout.getProfileShouts", + "defs": { + "main": { + "type": "query", + "description": "Get the shouts of an actor's profile", + "parameters": { + "type": "params", + "required": [ + "did" + ], + "properties": { + "did": { + "type": "string", + "description": "The DID or handle of the actor", + "format": "at-identifier" + }, + "offset": { + "type": "integer", + "description": "The offset for pagination", + "minimum": 0 + }, + "limit": { + "type": "integer", + "description": "The maximum number of shouts to return", + "minimum": 1 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "properties": { + "shouts": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.rocksky.shout.defs#shoutViewBasic" + } + } + } + } + } + } + } +} diff --git a/apps/api/lexicons/shout/getShoutReplies.json b/apps/api/lexicons/shout/getShoutReplies.json new file mode 100644 index 00000000..b75d7e48 --- /dev/null +++ b/apps/api/lexicons/shout/getShoutReplies.json @@ -0,0 +1,48 @@ +{ + "lexicon": 1, + "id": "app.rocksky.shout.getShoutReplies", + "defs": { + "main": { + "type": "query", + "description": "Get replies to a shout", + "parameters": { + "type": "params", + "required": [ + "uri" + ], + "properties": { + "uri": { + "type": "string", + "description": "The URI of the shout to retrieve replies for", + "format": "at-uri" + }, + "limit": { + "type": "integer", + "description": "The maximum number of shouts to return", + "minimum": 1 + }, + "offset": { + "type": "integer", + "description": "The number of shouts to skip before starting to collect the result set", + "minimum": 0 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "properties": { + "shouts": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.rocksky.shout.defs#shoutViewBasic" + } + } + } + } + } + } + } +} diff --git a/apps/api/lexicons/shout/getTrackShouts.json b/apps/api/lexicons/shout/getTrackShouts.json new file mode 100644 index 00000000..6ae7d0bf --- /dev/null +++ b/apps/api/lexicons/shout/getTrackShouts.json @@ -0,0 +1,38 @@ +{ + "lexicon": 1, + "id": "app.rocksky.shout.getTrackShouts", + "defs": { + "main": { + "type": "query", + "description": "Get all shouts for a specific track", + "parameters": { + "type": "params", + "required": [ + "uri" + ], + "properties": { + "uri": { + "type": "string", + "description": "The URI of the track to retrieve shouts for", + "format": "at-uri" + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "properties": { + "shouts": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.rocksky.shout.defs#shoutViewBasic" + } + } + } + } + } + } + } +} diff --git a/apps/api/lexicons/shout/removeShout.json b/apps/api/lexicons/shout/removeShout.json new file mode 100644 index 00000000..a4dad517 --- /dev/null +++ b/apps/api/lexicons/shout/removeShout.json @@ -0,0 +1,29 @@ +{ + "lexicon": 1, + "id": "app.rocksky.shout.removeShout", + "defs": { + "main": { + "type": "procedure", + "description": "Remove a shout by its ID", + "parameters": { + "type": "params", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "string", + "description": "The ID of the shout to be removed" + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "ref", + "ref": "app.rocksky.shout.defs#shoutView" + } + } + } + } +} diff --git a/apps/api/lexicons/shout/replyShout.json b/apps/api/lexicons/shout/replyShout.json new file mode 100644 index 00000000..18f1fbec --- /dev/null +++ b/apps/api/lexicons/shout/replyShout.json @@ -0,0 +1,38 @@ +{ + "lexicon": 1, + "id": "app.rocksky.shout.replyShout", + "defs": { + "main": { + "type": "procedure", + "description": "Reply to a shout", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": [ + "shoutId", + "message" + ], + "properties": { + "shoutId": { + "type": "string", + "description": "The unique identifier of the shout to reply to" + }, + "message": { + "type": "string", + "description": "The content of the reply", + "minLength": 1 + } + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "ref", + "ref": "app.rocksky.shout.defs#shoutView" + } + } + } + } +} diff --git a/apps/api/lexicons/shout/reportShout.json b/apps/api/lexicons/shout/reportShout.json new file mode 100644 index 00000000..f67fff1b --- /dev/null +++ b/apps/api/lexicons/shout/reportShout.json @@ -0,0 +1,37 @@ +{ + "lexicon": 1, + "id": "app.rocksky.shout.reportShout", + "defs": { + "main": { + "type": "procedure", + "description": "Report a shout for moderation", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": [ + "shoutId" + ], + "properties": { + "shoutId": { + "type": "string", + "description": "The unique identifier of the shout to report" + }, + "reason": { + "type": "string", + "description": "The reason for reporting the shout", + "minLength": 1 + } + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "ref", + "ref": "app.rocksky.shout.defs#shoutView" + } + } + } + } +} diff --git a/apps/api/lexicons/shout/shout.json b/apps/api/lexicons/shout/shout.json new file mode 100644 index 00000000..54b0dd3a --- /dev/null +++ b/apps/api/lexicons/shout/shout.json @@ -0,0 +1,40 @@ +{ + "lexicon": 1, + "id": "app.rocksky.shout", + "defs": { + "main": { + "type": "record", + "description": "A declaration of a shout.", + "key": "tid", + "record": { + "type": "object", + "required": [ + "message", + "createdAt", + "subject" + ], + "properties": { + "message": { + "type": "string", + "description": "The message of the shout.", + "minLength": 1, + "maxLength": 1000 + }, + "createdAt": { + "type": "string", + "description": "The date when the shout was created.", + "format": "datetime" + }, + "parent": { + "type": "ref", + "ref": "com.atproto.repo.strongRef" + }, + "subject": { + "type": "ref", + "ref": "com.atproto.repo.strongRef" + } + } + } + } + } +} diff --git a/apps/api/lexicons/song/createSong.json b/apps/api/lexicons/song/createSong.json new file mode 100644 index 00000000..d0414c6b --- /dev/null +++ b/apps/api/lexicons/song/createSong.json @@ -0,0 +1,80 @@ +{ + "lexicon": 1, + "id": "app.rocksky.song.createSong", + "defs": { + "main": { + "type": "procedure", + "description": "Create a new song", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": [ + "title", + "artist", + "album", + "albumArtist" + ], + "properties": { + "title": { + "type": "string", + "description": "The title of the song" + }, + "artist": { + "type": "string", + "description": "The artist of the song" + }, + "albumArtist": { + "type": "string", + "description": "The album artist of the song, if different from the main artist" + }, + "album": { + "type": "string", + "description": "The album of the song, if applicable" + }, + "duration": { + "type": "integer", + "description": "The duration of the song in seconds" + }, + "mbId": { + "type": "string", + "description": "The MusicBrainz ID of the song, if available" + }, + "albumArt": { + "type": "string", + "description": "The URL of the album art for the song", + "format": "uri" + }, + "trackNumber": { + "type": "integer", + "description": "The track number of the song in the album, if applicable" + }, + "releaseDate": { + "type": "string", + "description": "The release date of the song, formatted as YYYY-MM-DD" + }, + "year": { + "type": "integer", + "description": "The year the song was released" + }, + "discNumber": { + "type": "integer", + "description": "The disc number of the song in the album, if applicable" + }, + "lyrics": { + "type": "string", + "description": "The lyrics of the song, if available" + } + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "ref", + "ref": "app.rocksky.song.defs#songViewDetailed" + } + } + } + } +} diff --git a/apps/api/lexicons/song/defs.json b/apps/api/lexicons/song/defs.json new file mode 100644 index 00000000..6c43a75f --- /dev/null +++ b/apps/api/lexicons/song/defs.json @@ -0,0 +1,158 @@ +{ + "lexicon": 1, + "id": "app.rocksky.song.defs", + "defs": { + "songViewBasic": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The unique identifier of the song." + }, + "title": { + "type": "string", + "description": "The title of the song." + }, + "artist": { + "type": "string", + "description": "The artist of the song." + }, + "albumArtist": { + "type": "string", + "description": "The artist of the album the song belongs to." + }, + "albumArt": { + "type": "string", + "description": "The URL of the album art image.", + "format": "uri" + }, + "uri": { + "type": "string", + "description": "The URI of the song.", + "format": "at-uri" + }, + "album": { + "type": "string", + "description": "The album of the song." + }, + "duration": { + "type": "integer", + "description": "The duration of the song in milliseconds." + }, + "trackNumber": { + "type": "integer", + "description": "The track number of the song in the album." + }, + "discNumber": { + "type": "integer", + "description": "The disc number of the song in the album." + }, + "playCount": { + "type": "integer", + "description": "The number of times the song has been played.", + "minimum": 0 + }, + "uniqueListeners": { + "type": "integer", + "description": "The number of unique listeners who have played the song.", + "minimum": 0 + }, + "albumUri": { + "type": "string", + "description": "The URI of the album the song belongs to.", + "format": "at-uri" + }, + "artistUri": { + "type": "string", + "description": "The URI of the artist of the song.", + "format": "at-uri" + }, + "sha256": { + "type": "string", + "description": "The SHA256 hash of the song." + }, + "createdAt": { + "type": "string", + "description": "The timestamp when the song was created.", + "format": "datetime" + } + } + }, + "songViewDetailed": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The unique identifier of the song." + }, + "title": { + "type": "string", + "description": "The title of the song." + }, + "artist": { + "type": "string", + "description": "The artist of the song." + }, + "albumArtist": { + "type": "string", + "description": "The artist of the album the song belongs to." + }, + "albumArt": { + "type": "string", + "description": "The URL of the album art image.", + "format": "uri" + }, + "uri": { + "type": "string", + "description": "The URI of the song.", + "format": "at-uri" + }, + "album": { + "type": "string", + "description": "The album of the song." + }, + "duration": { + "type": "integer", + "description": "The duration of the song in milliseconds." + }, + "trackNumber": { + "type": "integer", + "description": "The track number of the song in the album." + }, + "discNumber": { + "type": "integer", + "description": "The disc number of the song in the album." + }, + "playCount": { + "type": "integer", + "description": "The number of times the song has been played.", + "minimum": 0 + }, + "uniqueListeners": { + "type": "integer", + "description": "The number of unique listeners who have played the song.", + "minimum": 0 + }, + "albumUri": { + "type": "string", + "description": "The URI of the album the song belongs to.", + "format": "at-uri" + }, + "artistUri": { + "type": "string", + "description": "The URI of the artist of the song.", + "format": "at-uri" + }, + "sha256": { + "type": "string", + "description": "The SHA256 hash of the song." + }, + "createdAt": { + "type": "string", + "description": "The timestamp when the song was created.", + "format": "datetime" + } + } + } + } +} diff --git a/apps/api/lexicons/song/getSong.json b/apps/api/lexicons/song/getSong.json new file mode 100644 index 00000000..fb0ae342 --- /dev/null +++ b/apps/api/lexicons/song/getSong.json @@ -0,0 +1,30 @@ +{ + "lexicon": 1, + "id": "app.rocksky.song.getSong", + "defs": { + "main": { + "type": "query", + "description": "Get a song by its uri", + "parameters": { + "type": "params", + "required": [ + "uri" + ], + "properties": { + "uri": { + "type": "string", + "description": "The unique identifier of the song to retrieve", + "format": "at-uri" + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "ref", + "ref": "app.rocksky.song.defs#songViewDetailed" + } + } + } + } +} diff --git a/apps/api/lexicons/song/getSongs.json b/apps/api/lexicons/song/getSongs.json new file mode 100644 index 00000000..3b346715 --- /dev/null +++ b/apps/api/lexicons/song/getSongs.json @@ -0,0 +1,40 @@ +{ + "lexicon": 1, + "id": "app.rocksky.song.getSongs", + "defs": { + "main": { + "type": "query", + "description": "Get songs", + "parameters": { + "type": "params", + "properties": { + "limit": { + "type": "integer", + "description": "The maximum number of songs to return", + "minimum": 1 + }, + "offset": { + "type": "integer", + "description": "The offset for pagination", + "minimum": 0 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "properties": { + "songs": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.rocksky.song.defs#songViewBasic" + } + } + } + } + } + } + } +} diff --git a/apps/api/lexicons/song/lovedSong.json b/apps/api/lexicons/song/lovedSong.json new file mode 100644 index 00000000..82da25bf --- /dev/null +++ b/apps/api/lexicons/song/lovedSong.json @@ -0,0 +1,140 @@ +{ + "lexicon": 1, + "id": "app.rocksky.lovedSong", + "defs": { + "main": { + "type": "record", + "description": "A declaration of a song.", + "key": "tid", + "record": { + "type": "object", + "required": [ + "title", + "artist", + "album", + "duration", + "createdAt" + ], + "properties": { + "title": { + "type": "string", + "description": "The title of the song.", + "minLength": 1, + "maxLength": 512 + }, + "artist": { + "type": "string", + "description": "The artist of the song.", + "minLength": 1, + "maxLength": 256 + }, + "albumArtist": { + "type": "string", + "description": "The album artist of the song.", + "minLength": 1, + "maxLength": 256 + }, + "album": { + "type": "string", + "description": "The album of the song.", + "minLength": 1, + "maxLength": 256 + }, + "duration": { + "type": "integer", + "description": "The duration of the song in seconds.", + "minimum": 1 + }, + "trackNumber": { + "type": "integer", + "description": "The track number of the song in the album.", + "minimum": 1 + }, + "discNumber": { + "type": "integer", + "description": "The disc number of the song in the album.", + "minimum": 1 + }, + "releaseDate": { + "type": "string", + "description": "The release date of the song.", + "format": "datetime" + }, + "year": { + "type": "integer", + "description": "The year the song was released." + }, + "genre": { + "type": "string", + "description": "The genre of the song.", + "maxLength": 256 + }, + "tags": { + "type": "array", + "description": "The tags of the song.", + "items": { + "type": "string", + "minLength": 1, + "maxLength": 256 + } + }, + "composer": { + "type": "string", + "description": "The composer of the song.", + "maxLength": 256 + }, + "lyrics": { + "type": "string", + "description": "The lyrics of the song.", + "maxLength": 10000 + }, + "copyrightMessage": { + "type": "string", + "description": "The copyright message of the song.", + "minLength": 1, + "maxLength": 256 + }, + "wiki": { + "type": "string", + "description": "Informations about the song", + "maxLength": 10000 + }, + "albumArt": { + "type": "blob", + "description": "The album art of the song.", + "accept": [ + "image/png", + "image/jpeg" + ], + "maxSize": 2000000 + }, + "youtubeLink": { + "type": "string", + "description": "The YouTube link of the song.", + "format": "uri" + }, + "spotifyLink": { + "type": "string", + "description": "The Spotify link of the song.", + "format": "uri" + }, + "tidalLink": { + "type": "string", + "description": "The Tidal link of the song.", + "format": "uri" + }, + "appleMusicLink": { + "type": "string", + "description": "The Apple Music link of the song.", + "format": "uri" + }, + "createdAt": { + "type": "string", + "description": "The date when the song was created.", + "format": "datetime" + } + } + } + } + } +} diff --git a/apps/api/lexicons/song/song.json b/apps/api/lexicons/song/song.json new file mode 100644 index 00000000..4f59f5d9 --- /dev/null +++ b/apps/api/lexicons/song/song.json @@ -0,0 +1,150 @@ +{ + "lexicon": 1, + "id": "app.rocksky.song", + "defs": { + "main": { + "type": "record", + "description": "A declaration of a song.", + "key": "tid", + "record": { + "type": "object", + "required": [ + "title", + "artist", + "album", + "albumArtist", + "duration", + "createdAt" + ], + "properties": { + "title": { + "type": "string", + "description": "The title of the song.", + "minLength": 1, + "maxLength": 512 + }, + "artist": { + "type": "string", + "description": "The artist of the song.", + "minLength": 1, + "maxLength": 256 + }, + "albumArtist": { + "type": "string", + "description": "The album artist of the song.", + "minLength": 1, + "maxLength": 256 + }, + "album": { + "type": "string", + "description": "The album of the song.", + "minLength": 1, + "maxLength": 256 + }, + "duration": { + "type": "integer", + "description": "The duration of the song in seconds.", + "minimum": 1 + }, + "trackNumber": { + "type": "integer", + "description": "The track number of the song in the album.", + "minimum": 1 + }, + "discNumber": { + "type": "integer", + "description": "The disc number of the song in the album.", + "minimum": 1 + }, + "releaseDate": { + "type": "string", + "description": "The release date of the song.", + "format": "datetime" + }, + "year": { + "type": "integer", + "description": "The year the song was released." + }, + "genre": { + "type": "string", + "description": "The genre of the song.", + "minLength": 1, + "maxLength": 256 + }, + "tags": { + "type": "array", + "description": "The tags of the song.", + "items": { + "type": "string", + "minLength": 1, + "maxLength": 256 + } + }, + "composer": { + "type": "string", + "description": "The composer of the song.", + "maxLength": 256 + }, + "lyrics": { + "type": "string", + "description": "The lyrics of the song.", + "maxLength": 10000 + }, + "copyrightMessage": { + "type": "string", + "description": "The copyright message of the song.", + "maxLength": 256 + }, + "wiki": { + "type": "string", + "description": "Informations about the song", + "maxLength": 10000 + }, + "albumArt": { + "type": "blob", + "description": "The album art of the song.", + "accept": [ + "image/png", + "image/jpeg" + ], + "maxSize": 2000000 + }, + "youtubeLink": { + "type": "string", + "description": "The YouTube link of the song.", + "format": "uri" + }, + "spotifyLink": { + "type": "string", + "description": "The Spotify link of the song.", + "format": "uri" + }, + "tidalLink": { + "type": "string", + "description": "The Tidal link of the song.", + "format": "uri" + }, + "appleMusicLink": { + "type": "string", + "description": "The Apple Music link of the song.", + "format": "uri" + }, + "createdAt": { + "type": "string", + "description": "The date when the song was created.", + "format": "datetime" + }, + "mbid": { + "type": "string", + "description": "The MusicBrainz ID of the song." + }, + "label": { + "type": "string", + "description": "The label of the song.", + "maxLength": 256 + } + } + } + } + } +} diff --git a/apps/api/lexicons/spotify/defs.json b/apps/api/lexicons/spotify/defs.json new file mode 100644 index 00000000..2958e5db --- /dev/null +++ b/apps/api/lexicons/spotify/defs.json @@ -0,0 +1,35 @@ +{ + "lexicon": 1, + "id": "app.rocksky.spotify.defs", + "defs": { + "spotifyTrackView": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The unique identifier of the Spotify track." + }, + "name": { + "type": "string", + "description": "The name of the track." + }, + "artist": { + "type": "string", + "description": "The name of the artist." + }, + "album": { + "type": "string", + "description": "The name of the album." + }, + "duration": { + "type": "integer", + "description": "The duration of the track in milliseconds." + }, + "previewUrl": { + "type": "string", + "description": "A URL to a preview of the track." + } + } + } + } +} diff --git a/apps/api/lexicons/spotify/getCurrentlyPlaying.json b/apps/api/lexicons/spotify/getCurrentlyPlaying.json new file mode 100644 index 00000000..1a358747 --- /dev/null +++ b/apps/api/lexicons/spotify/getCurrentlyPlaying.json @@ -0,0 +1,27 @@ +{ + "lexicon": 1, + "id": "app.rocksky.spotify.getCurrentlyPlaying", + "defs": { + "main": { + "type": "query", + "description": "Get the currently playing track", + "parameters": { + "type": "params", + "properties": { + "actor": { + "type": "string", + "description": "Handle or DID of the actor to retrieve the currently playing track for. If not provided, defaults to the current user.", + "format": "at-identifier" + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "ref", + "ref": "app.rocksky.player.defs#currentlyPlayingViewDetailed" + } + } + } + } +} diff --git a/apps/api/lexicons/spotify/next.json b/apps/api/lexicons/spotify/next.json new file mode 100644 index 00000000..c580505f --- /dev/null +++ b/apps/api/lexicons/spotify/next.json @@ -0,0 +1,10 @@ +{ + "lexicon": 1, + "id": "app.rocksky.spotify.next", + "defs": { + "main": { + "type": "procedure", + "description": "Play the next track in the queue" + } + } +} diff --git a/apps/api/lexicons/spotify/pause.json b/apps/api/lexicons/spotify/pause.json new file mode 100644 index 00000000..7cb1bcbd --- /dev/null +++ b/apps/api/lexicons/spotify/pause.json @@ -0,0 +1,10 @@ +{ + "lexicon": 1, + "id": "app.rocksky.spotify.pause", + "defs": { + "main": { + "type": "procedure", + "description": "Pause the currently playing track" + } + } +} diff --git a/apps/api/lexicons/spotify/play.json b/apps/api/lexicons/spotify/play.json new file mode 100644 index 00000000..7cfbc524 --- /dev/null +++ b/apps/api/lexicons/spotify/play.json @@ -0,0 +1,10 @@ +{ + "lexicon": 1, + "id": "app.rocksky.spotify.play", + "defs": { + "main": { + "type": "procedure", + "description": "Resume playback of the currently paused track" + } + } +} diff --git a/apps/api/lexicons/spotify/previous.json b/apps/api/lexicons/spotify/previous.json new file mode 100644 index 00000000..ac5561d1 --- /dev/null +++ b/apps/api/lexicons/spotify/previous.json @@ -0,0 +1,10 @@ +{ + "lexicon": 1, + "id": "app.rocksky.spotify.previous", + "defs": { + "main": { + "type": "procedure", + "description": "Play the previous track in the queue" + } + } +} diff --git a/apps/api/lexicons/spotify/seek.json b/apps/api/lexicons/spotify/seek.json new file mode 100644 index 00000000..bbf679ba --- /dev/null +++ b/apps/api/lexicons/spotify/seek.json @@ -0,0 +1,22 @@ +{ + "lexicon": 1, + "id": "app.rocksky.spotify.seek", + "defs": { + "main": { + "type": "procedure", + "description": "Seek to a specific position in the currently playing track", + "parameters": { + "type": "params", + "required": [ + "position" + ], + "properties": { + "position": { + "type": "integer", + "description": "The position in seconds to seek to" + } + } + } + } + } +} diff --git a/apps/api/lexicons/stats/defs.json b/apps/api/lexicons/stats/defs.json new file mode 100644 index 00000000..e4b52788 --- /dev/null +++ b/apps/api/lexicons/stats/defs.json @@ -0,0 +1,31 @@ +{ + "lexicon": 1, + "id": "app.rocksky.stats.defs", + "defs": { + "statsView": { + "type": "object", + "properties": { + "scrobbles": { + "type": "integer", + "description": "The total number of scrobbles." + }, + "artists": { + "type": "integer", + "description": "The total number of unique artists scrobbled." + }, + "lovedTracks": { + "type": "integer", + "description": "The total number of tracks marked as loved." + }, + "albums": { + "type": "integer", + "description": "The total number of unique albums scrobbled." + }, + "tracks": { + "type": "integer", + "description": "The total number of unique tracks scrobbled." + } + } + } + } +} diff --git a/apps/api/lexicons/stats/getStats.json b/apps/api/lexicons/stats/getStats.json new file mode 100644 index 00000000..90bc3481 --- /dev/null +++ b/apps/api/lexicons/stats/getStats.json @@ -0,0 +1,29 @@ +{ + "lexicon": 1, + "id": "app.rocksky.stats.getStats", + "defs": { + "main": { + "type": "query", + "parameters": { + "type": "params", + "required": [ + "did" + ], + "properties": { + "did": { + "type": "string", + "description": "The DID or handle of the user to get stats for.", + "format": "at-identifier" + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "ref", + "ref": "app.rocksky.stats.defs#statsView" + } + } + } + } +} diff --git a/apps/api/lexicons/strongRef.json b/apps/api/lexicons/strongRef.json new file mode 100644 index 00000000..8a57a2fa --- /dev/null +++ b/apps/api/lexicons/strongRef.json @@ -0,0 +1,24 @@ +{ + "lexicon": 1, + "id": "com.atproto.repo.strongRef", + "description": "A URI with a content-hash fingerprint.", + "defs": { + "main": { + "type": "object", + "required": [ + "uri", + "cid" + ], + "properties": { + "uri": { + "type": "string", + "format": "at-uri" + }, + "cid": { + "type": "string", + "format": "cid" + } + } + } + } +} diff --git a/apps/api/package-lock.json b/apps/api/package-lock.json new file mode 100644 index 00000000..e34e91af --- /dev/null +++ b/apps/api/package-lock.json @@ -0,0 +1,4677 @@ +{ + "name": "rocksky-auth", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "rocksky-auth", + "version": "0.0.1", + "dependencies": { + "@atproto/api": "^0.13.31", + "@atproto/common": "^0.4.6", + "@atproto/identity": "^0.4.5", + "@atproto/lex-cli": "^0.5.6", + "@atproto/lexicon": "^0.4.5", + "@atproto/oauth-client-node": "^0.2.8", + "@atproto/sync": "^0.1.11", + "@atproto/syntax": "^0.3.1", + "@atproto/xrpc-server": "^0.7.8", + "@hono/node-server": "^1.13.8", + "@xata.io/client": "^0.0.0-next.va121e4207b94bfe0a3c025fc00b247b923880930", + "assert": "^2.1.0", + "better-sqlite3": "^11.8.1", + "chanfana": "^2.0.2", + "dotenv": "^16.4.7", + "envalid": "^8.0.0", + "hono": "^4.4.7", + "iron-session": "^8.0.4", + "jsonwebtoken": "^9.0.2", + "kysely": "^0.27.5", + "unstorage": "^1.14.4", + "url": "^0.11.4", + "zod": "^3.23.8" + }, + "devDependencies": { + "@types/node": "^22.13.0", + "@types/service-worker-mock": "^2.0.1", + "pkgroll": "^2.6.1", + "tsx": "^4.19.2" + } + }, + "node_modules/@asteasolutions/zod-to-openapi": { + "version": "7.3.0", + "license": "MIT", + "dependencies": { + "openapi3-ts": "^4.1.2" + }, + "peerDependencies": { + "zod": "^3.20.2" + } + }, + "node_modules/@atproto-labs/did-resolver": { + "version": "0.1.8", + "license": "MIT", + "dependencies": { + "@atproto-labs/fetch": "0.2.0", + "@atproto-labs/pipe": "0.1.0", + "@atproto-labs/simple-store": "0.1.1", + "@atproto-labs/simple-store-memory": "0.1.1", + "@atproto/did": "0.1.3", + "zod": "^3.23.8" + } + }, + "node_modules/@atproto-labs/fetch": { + "version": "0.2.0", + "license": "MIT", + "dependencies": { + "@atproto-labs/pipe": "0.1.0" + }, + "optionalDependencies": { + "zod": "^3.23.8" + } + }, + "node_modules/@atproto-labs/fetch-node": { + "version": "0.1.6", + "license": "MIT", + "dependencies": { + "@atproto-labs/fetch": "0.2.0", + "@atproto-labs/pipe": "0.1.0", + "ipaddr.js": "^2.1.0", + "psl": "^1.9.0", + "undici": "^6.14.1" + } + }, + "node_modules/@atproto-labs/fetch-node/node_modules/undici": { + "version": "6.21.1", + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, + "node_modules/@atproto-labs/handle-resolver": { + "version": "0.1.5", + "license": "MIT", + "dependencies": { + "@atproto-labs/simple-store": "0.1.1", + "@atproto-labs/simple-store-memory": "0.1.1", + "@atproto/did": "0.1.3", + "zod": "^3.23.8" + } + }, + "node_modules/@atproto-labs/handle-resolver-node": { + "version": "0.1.11", + "license": "MIT", + "dependencies": { + "@atproto-labs/fetch-node": "0.1.6", + "@atproto-labs/handle-resolver": "0.1.5", + "@atproto/did": "0.1.3" + } + }, + "node_modules/@atproto-labs/identity-resolver": { + "version": "0.1.10", + "license": "MIT", + "dependencies": { + "@atproto-labs/did-resolver": "0.1.8", + "@atproto-labs/handle-resolver": "0.1.5", + "@atproto/syntax": "0.3.1" + } + }, + "node_modules/@atproto-labs/pipe": { + "version": "0.1.0", + "license": "MIT" + }, + "node_modules/@atproto-labs/simple-store": { + "version": "0.1.1", + "license": "MIT" + }, + "node_modules/@atproto-labs/simple-store-memory": { + "version": "0.1.1", + "license": "MIT", + "dependencies": { + "@atproto-labs/simple-store": "0.1.1", + "lru-cache": "^10.2.0" + } + }, + "node_modules/@atproto/api": { + "version": "0.13.31", + "license": "MIT", + "dependencies": { + "@atproto/common-web": "^0.3.2", + "@atproto/lexicon": "^0.4.5", + "@atproto/syntax": "^0.3.1", + "@atproto/xrpc": "^0.6.6", + "await-lock": "^2.2.2", + "multiformats": "^9.9.0", + "tlds": "^1.234.0", + "zod": "^3.23.8" + } + }, + "node_modules/@atproto/common": { + "version": "0.4.6", + "license": "MIT", + "dependencies": { + "@atproto/common-web": "^0.3.2", + "@ipld/dag-cbor": "^7.0.3", + "cbor-x": "^1.5.1", + "iso-datestring-validator": "^2.2.2", + "multiformats": "^9.9.0", + "pino": "^8.21.0" + } + }, + "node_modules/@atproto/common-web": { + "version": "0.3.2", + "license": "MIT", + "dependencies": { + "graphemer": "^1.4.0", + "multiformats": "^9.9.0", + "uint8arrays": "3.0.0", + "zod": "^3.23.8" + } + }, + "node_modules/@atproto/crypto": { + "version": "0.4.3", + "license": "MIT", + "dependencies": { + "@noble/curves": "^1.7.0", + "@noble/hashes": "^1.6.1", + "uint8arrays": "3.0.0" + } + }, + "node_modules/@atproto/did": { + "version": "0.1.3", + "license": "MIT", + "dependencies": { + "zod": "^3.23.8" + } + }, + "node_modules/@atproto/identity": { + "version": "0.4.5", + "license": "MIT", + "dependencies": { + "@atproto/common-web": "^0.3.2", + "@atproto/crypto": "^0.4.3" + } + }, + "node_modules/@atproto/jwk": { + "version": "0.1.2", + "license": "MIT", + "dependencies": { + "multiformats": "^9.9.0", + "zod": "^3.23.8" + } + }, + "node_modules/@atproto/jwk-jose": { + "version": "0.1.3", + "license": "MIT", + "dependencies": { + "@atproto/jwk": "0.1.2", + "jose": "^5.2.0" + } + }, + "node_modules/@atproto/jwk-webcrypto": { + "version": "0.1.3", + "license": "MIT", + "dependencies": { + "@atproto/jwk": "0.1.2", + "@atproto/jwk-jose": "0.1.3", + "zod": "^3.23.8" + } + }, + "node_modules/@atproto/lex-cli": { + "version": "0.5.6", + "license": "MIT", + "dependencies": { + "@atproto/lexicon": "^0.4.5", + "@atproto/syntax": "^0.3.1", + "chalk": "^4.1.2", + "commander": "^9.4.0", + "prettier": "^3.2.5", + "ts-morph": "^16.0.0", + "yesno": "^0.4.0", + "zod": "^3.23.8" + }, + "bin": { + "lex": "dist/index.js" + } + }, + "node_modules/@atproto/lexicon": { + "version": "0.4.5", + "license": "MIT", + "dependencies": { + "@atproto/common-web": "^0.3.2", + "@atproto/syntax": "^0.3.1", + "iso-datestring-validator": "^2.2.2", + "multiformats": "^9.9.0", + "zod": "^3.23.8" + } + }, + "node_modules/@atproto/oauth-client": { + "version": "0.3.7", + "license": "MIT", + "dependencies": { + "@atproto-labs/did-resolver": "0.1.8", + "@atproto-labs/fetch": "0.2.0", + "@atproto-labs/handle-resolver": "0.1.5", + "@atproto-labs/identity-resolver": "0.1.10", + "@atproto-labs/simple-store": "0.1.1", + "@atproto-labs/simple-store-memory": "0.1.1", + "@atproto/did": "0.1.3", + "@atproto/jwk": "0.1.2", + "@atproto/oauth-types": "0.2.2", + "@atproto/xrpc": "0.6.6", + "multiformats": "^9.9.0", + "zod": "^3.23.8" + } + }, + "node_modules/@atproto/oauth-client-node": { + "version": "0.2.8", + "license": "MIT", + "dependencies": { + "@atproto-labs/did-resolver": "0.1.8", + "@atproto-labs/handle-resolver-node": "0.1.11", + "@atproto-labs/simple-store": "0.1.1", + "@atproto/did": "0.1.3", + "@atproto/jwk": "0.1.2", + "@atproto/jwk-jose": "0.1.3", + "@atproto/jwk-webcrypto": "0.1.3", + "@atproto/oauth-client": "0.3.7", + "@atproto/oauth-types": "0.2.2" + } + }, + "node_modules/@atproto/oauth-types": { + "version": "0.2.2", + "license": "MIT", + "dependencies": { + "@atproto/jwk": "0.1.2", + "zod": "^3.23.8" + } + }, + "node_modules/@atproto/repo": { + "version": "0.6.2", + "license": "MIT", + "dependencies": { + "@atproto/common": "^0.4.6", + "@atproto/common-web": "^0.3.2", + "@atproto/crypto": "^0.4.3", + "@atproto/lexicon": "^0.4.5", + "@ipld/car": "^3.2.3", + "@ipld/dag-cbor": "^7.0.0", + "multiformats": "^9.9.0", + "uint8arrays": "3.0.0", + "zod": "^3.23.8" + } + }, + "node_modules/@atproto/sync": { + "version": "0.1.11", + "license": "MIT", + "dependencies": { + "@atproto/common": "^0.4.6", + "@atproto/identity": "^0.4.5", + "@atproto/lexicon": "^0.4.5", + "@atproto/repo": "^0.6.2", + "@atproto/syntax": "^0.3.1", + "@atproto/xrpc-server": "^0.7.8", + "multiformats": "^9.9.0", + "p-queue": "^6.6.2", + "ws": "^8.12.0" + } + }, + "node_modules/@atproto/syntax": { + "version": "0.3.1", + "license": "MIT" + }, + "node_modules/@atproto/xrpc": { + "version": "0.6.6", + "license": "MIT", + "dependencies": { + "@atproto/lexicon": "^0.4.5", + "zod": "^3.23.8" + } + }, + "node_modules/@atproto/xrpc-server": { + "version": "0.7.8", + "license": "MIT", + "dependencies": { + "@atproto/common": "^0.4.6", + "@atproto/crypto": "^0.4.3", + "@atproto/lexicon": "^0.4.5", + "@atproto/xrpc": "^0.6.6", + "cbor-x": "^1.5.1", + "express": "^4.17.2", + "http-errors": "^2.0.0", + "mime-types": "^2.1.35", + "rate-limiter-flexible": "^2.4.1", + "uint8arrays": "3.0.0", + "ws": "^8.12.0", + "zod": "^3.23.8" + } + }, + "node_modules/@cbor-extract/cbor-extract-linux-x64": { + "version": "2.2.0", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.23.1", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@hono/node-server": { + "version": "1.13.8", + "license": "MIT", + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "hono": "^4" + } + }, + "node_modules/@ipld/car": { + "version": "3.2.4", + "license": "(Apache-2.0 AND MIT)", + "dependencies": { + "@ipld/dag-cbor": "^7.0.0", + "multiformats": "^9.5.4", + "varint": "^6.0.0" + } + }, + "node_modules/@ipld/dag-cbor": { + "version": "7.0.3", + "license": "(Apache-2.0 AND MIT)", + "dependencies": { + "cborg": "^1.6.0", + "multiformats": "^9.5.4" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@noble/curves": { + "version": "1.8.1", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.7.1" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.7.1", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "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", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rollup/plugin-alias": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-alias/-/plugin-alias-5.1.1.tgz", + "integrity": "sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-commonjs": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.2.tgz", + "integrity": "sha512-BEFI2EDqzl+vA1rl97IDRZ61AIwGH093d9nz8+dThxJNH8oSoB7MjWvPCX3dkaK1/RCJ/1v/R1XB15FuSs0fQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "commondir": "^1.0.1", + "estree-walker": "^2.0.2", + "fdir": "^6.2.0", + "is-reference": "1.2.1", + "magic-string": "^0.30.3", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=16.0.0 || 14 >= 14.17" + }, + "peerDependencies": { + "rollup": "^2.68.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-commonjs/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/plugin-commonjs/node_modules/fdir": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", + "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-commonjs/node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/@rollup/plugin-commonjs/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@rollup/plugin-dynamic-import-vars": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@rollup/plugin-dynamic-import-vars/-/plugin-dynamic-import-vars-2.1.5.tgz", + "integrity": "sha512-Mymi24fd9hlRifdZV/jYIFj1dn99F34imiYu3KzlAcgBcRi3i9SucgW/VRo5SQ9K4NuQ7dCep6pFWgNyhRdFHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "astring": "^1.8.5", + "estree-walker": "^2.0.2", + "fast-glob": "^3.2.12", + "magic-string": "^0.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-dynamic-import-vars/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/plugin-dynamic-import-vars/node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/@rollup/plugin-inject": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.5.tgz", + "integrity": "sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-inject/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/plugin-inject/node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/@rollup/plugin-json": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz", + "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.1.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.0.tgz", + "integrity": "sha512-0FPvAeVUT/zdWoO0jnb/V5BlBsUSNfkIOtFHzMO4H9MOklrmQFY6FduVHKucNb/aTFxvnGhj4MNj/T1oNdDfNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-replace": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-6.0.2.tgz", + "integrity": "sha512-7QaYCf8bqF04dOy7w/eHmJeNExxTYwvKAmlSAH/EaWWUzbT0h5sbF6bktFoX/0F/0qwng5/dWFMyf3gzaM8DsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "magic-string": "^0.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-replace/node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", + "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.34.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.0.tgz", + "integrity": "sha512-Eeao7ewDq79jVEsrtWIj5RNqB8p2knlm9fhR6uJ2gqP7UfbLrTrxevudVrEPDM7Wkpn/HpRC2QfazH7MXLz3vQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.34.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.0.tgz", + "integrity": "sha512-yVh0Kf1f0Fq4tWNf6mWcbQBCLDpDrDEl88lzPgKhrgTcDrTtlmun92ywEF9dCjmYO3EFiSuJeeo9cYRxl2FswA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.34.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.0.tgz", + "integrity": "sha512-gCs0ErAZ9s0Osejpc3qahTsqIPUDjSKIyxK/0BGKvL+Tn0n3Kwvj8BrCv7Y5sR1Ypz1K2qz9Ny0VvkVyoXBVUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.34.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.0.tgz", + "integrity": "sha512-aIB5Anc8hngk15t3GUkiO4pv42ykXHfmpXGS+CzM9CTyiWyT8HIS5ygRAy7KcFb/wiw4Br+vh1byqcHRTfq2tQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.34.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.0.tgz", + "integrity": "sha512-kpdsUdMlVJMRMaOf/tIvxk8TQdzHhY47imwmASOuMajg/GXpw8GKNd8LNwIHE5Yd1onehNpcUB9jHY6wgw9nHQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.34.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.0.tgz", + "integrity": "sha512-D0RDyHygOBCQiqookcPevrvgEarN0CttBecG4chOeIYCNtlKHmf5oi5kAVpXV7qs0Xh/WO2RnxeicZPtT50V0g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.34.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.0.tgz", + "integrity": "sha512-mCIw8j5LPDXmCOW8mfMZwT6F/Kza03EnSr4wGYEswrEfjTfVsFOxvgYfuRMxTuUF/XmRb9WSMD5GhCWDe2iNrg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.34.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.0.tgz", + "integrity": "sha512-AwwldAu4aCJPob7zmjuDUMvvuatgs8B/QiVB0KwkUarAcPB3W+ToOT+18TQwY4z09Al7G0BvCcmLRop5zBLTag==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.34.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.0.tgz", + "integrity": "sha512-e7kDUGVP+xw05pV65ZKb0zulRploU3gTu6qH1qL58PrULDGxULIS0OSDQJLH7WiFnpd3ZKUU4VM3u/Z7Zw+e7Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.34.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.0.tgz", + "integrity": "sha512-SXYJw3zpwHgaBqTXeAZ31qfW/v50wq4HhNVvKFhRr5MnptRX2Af4KebLWR1wpxGJtLgfS2hEPuALRIY3LPAAcA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.34.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.0.tgz", + "integrity": "sha512-e5XiCinINCI4RdyU3sFyBH4zzz7LiQRvHqDtRe9Dt8o/8hTBaYpdPimayF00eY2qy5j4PaaWK0azRgUench6WQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.34.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.0.tgz", + "integrity": "sha512-3SWN3e0bAsm9ToprLFBSro8nJe6YN+5xmB11N4FfNf92wvLye/+Rh5JGQtKOpwLKt6e61R1RBc9g+luLJsc23A==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.34.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.0.tgz", + "integrity": "sha512-B1Oqt3GLh7qmhvfnc2WQla4NuHlcxAD5LyueUi5WtMc76ZWY+6qDtQYqnxARx9r+7mDGfamD+8kTJO0pKUJeJA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.34.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.0.tgz", + "integrity": "sha512-UfUCo0h/uj48Jq2lnhX0AOhZPSTAq3Eostas+XZ+GGk22pI+Op1Y6cxQ1JkUuKYu2iU+mXj1QjPrZm9nNWV9rg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.34.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.0.tgz", + "integrity": "sha512-chZLTUIPbgcpm+Z7ALmomXW8Zh+wE2icrG+K6nt/HenPLmtwCajhQC5flNSk1Xy5EDMt/QAOz2MhzfOfJOLSiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.34.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.0.tgz", + "integrity": "sha512-jo0UolK70O28BifvEsFD/8r25shFezl0aUk2t0VJzREWHkq19e+pcLu4kX5HiVXNz5qqkD+aAq04Ct8rkxgbyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.34.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.0.tgz", + "integrity": "sha512-Vmg0NhAap2S54JojJchiu5An54qa6t/oKT7LmDaWggpIcaiL8WcWHEN6OQrfTdL6mQ2GFyH7j2T5/3YPEDOOGA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.34.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.0.tgz", + "integrity": "sha512-CV2aqhDDOsABKHKhNcs1SZFryffQf8vK2XrxP6lxC99ELZAdvsDgPklIBfd65R8R+qvOm1SmLaZ/Fdq961+m7A==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.34.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.0.tgz", + "integrity": "sha512-g2ASy1QwHP88y5KWvblUolJz9rN+i4ZOsYzkEwcNfaNooxNUXG+ON6F5xFo0NIItpHqxcdAyls05VXpBnludGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@ts-morph/common": { + "version": "0.17.0", + "license": "MIT", + "dependencies": { + "fast-glob": "^3.2.11", + "minimatch": "^5.1.0", + "mkdirp": "^1.0.4", + "path-browserify": "^1.0.1" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.13.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.0.tgz", + "integrity": "sha512-ClIbNe36lawluuvq3+YYhnIN2CELi+6q8NpnM7PYp4hBn/TatfboPgVSm2rwKRfnV2M+Ty9GWDFI64KEe+kysA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "node_modules/@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/service-worker-mock": { + "version": "2.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@xata.io/client": { + "version": "0.0.0-next.va121e4207b94bfe0a3c025fc00b247b923880930", + "resolved": "https://registry.npmjs.org/@xata.io/client/-/client-0.0.0-next.va121e4207b94bfe0a3c025fc00b247b923880930.tgz", + "integrity": "sha512-tRhsrV6vSJk4r+Cn7WkE1hyV2WfnHOoMzpQeLujqrbemPtVj82R1uhqHM2fPFuUKMfD+19PVF+Gist0ePlX5SQ==", + "license": "Apache-2.0", + "peerDependencies": { + "typescript": ">=4.5" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "license": "Python-2.0" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/assert": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" + } + }, + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "dev": true, + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/await-lock": { + "version": "2.2.2", + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "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/better-sqlite3": { + "version": "11.8.1", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "bindings": "^1.5.0", + "prebuild-install": "^7.1.1" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "license": "MIT", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "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": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/body-parser": { + "version": "1.20.3", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "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": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "license": "BSD-3-Clause" + }, + "node_modules/bytes": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.3", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/cbor-extract": { + "version": "2.2.0", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-gyp-build-optional-packages": "5.1.1" + }, + "bin": { + "download-cbor-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@cbor-extract/cbor-extract-darwin-arm64": "2.2.0", + "@cbor-extract/cbor-extract-darwin-x64": "2.2.0", + "@cbor-extract/cbor-extract-linux-arm": "2.2.0", + "@cbor-extract/cbor-extract-linux-arm64": "2.2.0", + "@cbor-extract/cbor-extract-linux-x64": "2.2.0", + "@cbor-extract/cbor-extract-win32-x64": "2.2.0" + } + }, + "node_modules/cbor-x": { + "version": "1.6.0", + "license": "MIT", + "optionalDependencies": { + "cbor-extract": "^2.2.0" + } + }, + "node_modules/cborg": { + "version": "1.10.2", + "license": "Apache-2.0", + "bin": { + "cborg": "cli.js" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chanfana": { + "version": "2.6.3", + "license": "MIT", + "dependencies": { + "@asteasolutions/zod-to-openapi": "^7.2.0", + "js-yaml": "^4.1.0", + "openapi3-ts": "^4.4.0", + "zod": "^3.23.8" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "license": "ISC" + }, + "node_modules/code-block-writer": { + "version": "11.0.3", + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/commander": { + "version": "9.5.0", + "license": "MIT", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true, + "license": "MIT" + }, + "node_modules/consola": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.0.tgz", + "integrity": "sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==", + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-es": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.2.tgz", + "integrity": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==", + "license": "MIT" + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "license": "MIT" + }, + "node_modules/crossws": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.3.tgz", + "integrity": "sha512-/71DJT3xJlqSnBr83uGJesmVHSzZEvgxHt/fIKxBAAngqMHmnBWQNxCphVxxJ2XL3xleu5+hJD6IQ3TglBedcw==", + "license": "MIT", + "dependencies": { + "uncrypto": "^0.1.3" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/defu": { + "version": "6.1.4", + "license": "MIT" + }, + "node_modules/depd": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destr": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.3.tgz", + "integrity": "sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==", + "license": "MIT" + }, + "node_modules/destroy": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.4.7", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "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/ecdsa-sig-formatter": { + "version": "1.0.11", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/envalid": { + "version": "8.0.0", + "license": "MIT", + "dependencies": { + "tslib": "2.6.2" + }, + "engines": { + "node": ">=8.12" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.23.1", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.23.1", + "@esbuild/android-arm": "0.23.1", + "@esbuild/android-arm64": "0.23.1", + "@esbuild/android-x64": "0.23.1", + "@esbuild/darwin-arm64": "0.23.1", + "@esbuild/darwin-x64": "0.23.1", + "@esbuild/freebsd-arm64": "0.23.1", + "@esbuild/freebsd-x64": "0.23.1", + "@esbuild/linux-arm": "0.23.1", + "@esbuild/linux-arm64": "0.23.1", + "@esbuild/linux-ia32": "0.23.1", + "@esbuild/linux-loong64": "0.23.1", + "@esbuild/linux-mips64el": "0.23.1", + "@esbuild/linux-ppc64": "0.23.1", + "@esbuild/linux-riscv64": "0.23.1", + "@esbuild/linux-s390x": "0.23.1", + "@esbuild/linux-x64": "0.23.1", + "@esbuild/netbsd-x64": "0.23.1", + "@esbuild/openbsd-arm64": "0.23.1", + "@esbuild/openbsd-x64": "0.23.1", + "@esbuild/sunos-x64": "0.23.1", + "@esbuild/win32-arm64": "0.23.1", + "@esbuild/win32-ia32": "0.23.1", + "@esbuild/win32-x64": "0.23.1" + } + }, + "node_modules/esbuild/node_modules/@esbuild/aix-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", + "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/android-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", + "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/android-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", + "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/android-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", + "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/darwin-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", + "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/darwin-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", + "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/freebsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", + "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/freebsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", + "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", + "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", + "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", + "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-loong64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", + "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-mips64el": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", + "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", + "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-riscv64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", + "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-s390x": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", + "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/netbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", + "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", + "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/openbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", + "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/sunos-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", + "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/win32-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", + "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/win32-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", + "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/win32-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", + "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "license": "(MIT OR WTFPL)", + "engines": { + "node": ">=6" + } + }, + "node_modules/express": { + "version": "4.21.2", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.7.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.12", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "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-redact": { + "version": "3.5.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/fastq": { + "version": "1.19.0", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/fill-range": { + "version": "7.1.1", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/for-each": { + "version": "0.3.4", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.7", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "function-bind": "^1.1.2", + "get-proto": "^1.0.0", + "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", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-tsconfig": { + "version": "4.10.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "license": "MIT" + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "license": "MIT" + }, + "node_modules/h3": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.14.0.tgz", + "integrity": "sha512-ao22eiONdgelqcnknw0iD645qW0s9NnrJHr5OBz4WOMdBdycfSas1EQf1wXRsm+PcB2Yoj43pjBPwqIpJQTeWg==", + "license": "MIT", + "dependencies": { + "cookie-es": "^1.2.2", + "crossws": "^0.3.2", + "defu": "^6.1.4", + "destr": "^2.0.3", + "iron-webcrypto": "^1.2.1", + "ohash": "^1.1.4", + "radix3": "^1.1.2", + "ufo": "^1.5.4", + "uncrypto": "^0.1.3", + "unenv": "^1.10.0" + } + }, + "node_modules/h3/node_modules/unenv": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/unenv/-/unenv-1.10.0.tgz", + "integrity": "sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ==", + "license": "MIT", + "dependencies": { + "consola": "^3.2.3", + "defu": "^6.1.4", + "mime": "^3.0.0", + "node-fetch-native": "^1.6.4", + "pathe": "^1.1.2" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "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", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hono": { + "version": "4.6.19", + "license": "MIT", + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "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/inherits": { + "version": "2.0.4", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/iron-session": { + "version": "8.0.4", + "funding": [ + "https://github.com/sponsors/vvo", + "https://github.com/sponsors/brc-dd" + ], + "license": "MIT", + "dependencies": { + "cookie": "^0.7.2", + "iron-webcrypto": "^1.2.1", + "uncrypto": "^0.1.3" + } + }, + "node_modules/iron-webcrypto": { + "version": "1.2.1", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/brc-dd" + } + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-nan": { + "version": "1.3.2", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/iso-datestring-validator": { + "version": "2.2.2", + "license": "MIT" + }, + "node_modules/jose": { + "version": "5.9.6", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "license": "MIT", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jwa": { + "version": "1.4.1", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "license": "MIT", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/kysely": { + "version": "0.27.5", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "license": "ISC" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "3.0.0", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "5.1.6", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/multiformats": { + "version": "9.9.0", + "license": "(Apache-2.0 AND MIT)" + }, + "node_modules/napi-build-utils": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-abi": { + "version": "3.74.0", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-fetch-native": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.6.tgz", + "integrity": "sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==", + "license": "MIT" + }, + "node_modules/node-gyp-build-optional-packages": { + "version": "5.1.1", + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.1" + }, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.3", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ofetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.4.1.tgz", + "integrity": "sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==", + "license": "MIT", + "dependencies": { + "destr": "^2.0.3", + "node-fetch-native": "^1.6.4", + "ufo": "^1.5.4" + } + }, + "node_modules/ohash": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/openapi3-ts": { + "version": "4.4.0", + "license": "MIT", + "dependencies": { + "yaml": "^2.5.0" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-queue": { + "version": "6.6.2", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathe": { + "version": "1.1.2", + "license": "MIT" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pino": { + "version": "8.21.0", + "license": "MIT", + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^1.2.0", + "pino-std-serializers": "^6.0.0", + "process-warning": "^3.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^3.7.0", + "thread-stream": "^2.6.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "readable-stream": "^4.0.0", + "split2": "^4.0.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "6.2.2", + "license": "MIT" + }, + "node_modules/pkgroll": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/pkgroll/-/pkgroll-2.6.1.tgz", + "integrity": "sha512-n9ll3LHCvFVsoXzxAFN/Z+kO4E1ByRW/6YdcreLGKj6b7qpRnZI14Xd7nSfhhWcrF67aAVoT/00wGG7VQsSu9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/plugin-alias": "^5.1.1", + "@rollup/plugin-commonjs": "^28.0.2", + "@rollup/plugin-dynamic-import-vars": "^2.1.5", + "@rollup/plugin-inject": "^5.0.5", + "@rollup/plugin-json": "^6.1.0", + "@rollup/plugin-node-resolve": "^16.0.0", + "@rollup/plugin-replace": "^6.0.2", + "@rollup/pluginutils": "^5.1.4", + "esbuild": "^0.24.2", + "magic-string": "^0.30.17", + "rollup": "^4.29.1" + }, + "bin": { + "pkgroll": "dist/cli.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/privatenumber/pkgroll?sponsor=1" + }, + "peerDependencies": { + "typescript": "^4.1 || ^5.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/pkgroll/node_modules/@esbuild/linux-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/pkgroll/node_modules/esbuild": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" + } + }, + "node_modules/pkgroll/node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.3", + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^2.0.0", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prettier": { + "version": "3.4.2", + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/process": { + "version": "0.11.10", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-warning": { + "version": "3.0.0", + "license": "MIT" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "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", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/psl": { + "version": "1.15.0", + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } + }, + "node_modules/psl/node_modules/punycode": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pump": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "1.4.1", + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.13.0", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "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", + "license": "MIT" + }, + "node_modules/radix3": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", + "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", + "license": "MIT" + }, + "node_modules/range-parser": { + "version": "1.2.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/rate-limiter-flexible": { + "version": "2.4.2", + "license": "ISC" + }, + "node_modules/raw-body": { + "version": "2.5.2", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/readable-stream": { + "version": "4.7.0", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/real-require": { + "version": "0.2.0", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.34.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.0.tgz", + "integrity": "sha512-+4C/cgJ9w6sudisA0nZz0+O7lTP9a3CzNLsoDwaRumM8QHwghUsu6tqHXiTmNUp/rqNiM14++7dkzHDyCRs0Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.34.0", + "@rollup/rollup-android-arm64": "4.34.0", + "@rollup/rollup-darwin-arm64": "4.34.0", + "@rollup/rollup-darwin-x64": "4.34.0", + "@rollup/rollup-freebsd-arm64": "4.34.0", + "@rollup/rollup-freebsd-x64": "4.34.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.34.0", + "@rollup/rollup-linux-arm-musleabihf": "4.34.0", + "@rollup/rollup-linux-arm64-gnu": "4.34.0", + "@rollup/rollup-linux-arm64-musl": "4.34.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.34.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.34.0", + "@rollup/rollup-linux-riscv64-gnu": "4.34.0", + "@rollup/rollup-linux-s390x-gnu": "4.34.0", + "@rollup/rollup-linux-x64-gnu": "4.34.0", + "@rollup/rollup-linux-x64-musl": "4.34.0", + "@rollup/rollup-win32-arm64-msvc": "4.34.0", + "@rollup/rollup-win32-ia32-msvc": "4.34.0", + "@rollup/rollup-win32-x64-msvc": "4.34.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "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-buffer": { + "version": "5.2.1", + "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/safe-regex-test": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.0", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.0", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/serve-static": { + "version": "1.16.2", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "license": "ISC" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "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/simple-get": { + "version": "4.0.1", + "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": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/sonic-boom": { + "version": "3.8.1", + "license": "MIT", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tar-fs": { + "version": "2.1.2", + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "license": "MIT", + "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" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.2", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/thread-stream": { + "version": "2.7.0", + "license": "MIT", + "dependencies": { + "real-require": "^0.2.0" + } + }, + "node_modules/tlds": { + "version": "1.255.0", + "license": "MIT", + "bin": { + "tlds": "bin.js" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/ts-morph": { + "version": "16.0.0", + "license": "MIT", + "dependencies": { + "@ts-morph/common": "~0.17.0", + "code-block-writer": "^11.0.3" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" + }, + "node_modules/tsx": { + "version": "4.19.2", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.23.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.5.4", + "license": "MIT" + }, + "node_modules/uint8arrays": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "multiformats": "^9.4.2" + } + }, + "node_modules/uncrypto": { + "version": "0.1.3", + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "6.20.0", + "dev": true, + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unstorage": { + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.14.4.tgz", + "integrity": "sha512-1SYeamwuYeQJtJ/USE1x4l17LkmQBzg7deBJ+U9qOBoHo15d1cDxG4jM31zKRgF7pG0kirZy4wVMX6WL6Zoscg==", + "license": "MIT", + "dependencies": { + "anymatch": "^3.1.3", + "chokidar": "^3.6.0", + "destr": "^2.0.3", + "h3": "^1.13.0", + "lru-cache": "^10.4.3", + "node-fetch-native": "^1.6.4", + "ofetch": "^1.4.1", + "ufo": "^1.5.4" + }, + "peerDependencies": { + "@azure/app-configuration": "^1.8.0", + "@azure/cosmos": "^4.2.0", + "@azure/data-tables": "^13.3.0", + "@azure/identity": "^4.5.0", + "@azure/keyvault-secrets": "^4.9.0", + "@azure/storage-blob": "^12.26.0", + "@capacitor/preferences": "^6.0.3", + "@deno/kv": ">=0.8.4", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0", + "@planetscale/database": "^1.19.0", + "@upstash/redis": "^1.34.3", + "@vercel/blob": ">=0.27.0", + "@vercel/kv": "^1.0.1", + "aws4fetch": "^1.0.20", + "db0": ">=0.2.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.4.2", + "uploadthing": "^7.4.1" + }, + "peerDependenciesMeta": { + "@azure/app-configuration": { + "optional": true + }, + "@azure/cosmos": { + "optional": true + }, + "@azure/data-tables": { + "optional": true + }, + "@azure/identity": { + "optional": true + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@capacitor/preferences": { + "optional": true + }, + "@deno/kv": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/blob": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "aws4fetch": { + "optional": true + }, + "db0": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "uploadthing": { + "optional": true + } + } + }, + "node_modules/url": { + "version": "0.11.4", + "license": "MIT", + "dependencies": { + "punycode": "^1.4.1", + "qs": "^6.12.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/util": { + "version": "0.12.5", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/varint": { + "version": "6.0.0", + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.18", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.18.0", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/yaml": { + "version": "2.7.0", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yesno": { + "version": "0.4.0", + "license": "BSD" + }, + "node_modules/zod": { + "version": "3.24.1", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/apps/api/package.json b/apps/api/package.json new file mode 100644 index 00000000..ebe3da1d --- /dev/null +++ b/apps/api/package.json @@ -0,0 +1,87 @@ +{ + "name": "@rocksky/api", + "version": "0.0.1", + "private": true, + "type": "module", + "module": "dist/index.js", + "scripts": { + "lexgen": "lex gen-server ./src/lexicon ./lexicons/**/* ./lexicons/*", + "dev": "tsx --watch ./src/index.ts", + "prod": "tsx ./src/index.ts", + "build": "pkgroll", + "sync": "tsx ./src/scripts/sync.ts", + "meili:sync": "tsx ./src/scripts/meili.ts", + "avatar": "tsx ./src/scripts/avatar.ts", + "pkl:eval": "pkl eval -f json", + "pkl:gen": "tsx ./scripts/pkl.ts", + "dev:xrpc": "tsx --watch ./src/server.ts", + "db:migrate": "drizzle-kit migrate" + }, + "dependencies": { + "@atproto/api": "^0.13.31", + "@atproto/common": "^0.4.6", + "@atproto/identity": "^0.4.5", + "@atproto/lex-cli": "^0.5.6", + "@atproto/lexicon": "^0.4.5", + "@atproto/oauth-client-node": "^0.2.14", + "@atproto/sync": "^0.1.11", + "@atproto/syntax": "^0.3.1", + "@atproto/xrpc-server": "^0.7.8", + "@hono/node-server": "^1.13.8", + "@hono/node-ws": "^1.1.0", + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/auto-instrumentations-node": "^0.58.0", + "@opentelemetry/exporter-metrics-otlp-http": "^0.200.0", + "@opentelemetry/exporter-trace-otlp-http": "^0.200.0", + "@opentelemetry/resources": "^2.0.0", + "@opentelemetry/sdk-metrics": "^2.0.0", + "@opentelemetry/sdk-node": "^0.200.0", + "@opentelemetry/semantic-conventions": "^1.32.0", + "@pyroscope/nodejs": "^0.4.5", + "@xata.io/client": "^0.0.0-next.va121e4207b94bfe0a3c025fc00b247b923880930", + "assert": "^2.1.0", + "axios": "^1.7.9", + "better-sqlite3": "^11.8.1", + "chalk": "^5.4.1", + "chanfana": "^2.0.2", + "dayjs": "^1.11.13", + "dotenv": "^16.4.7", + "drizzle-orm": "^0.44.2", + "dropbox": "^10.34.0", + "effect": "^3.14.22", + "envalid": "^8.0.0", + "express": "^5.1.0", + "googleapis": "^146.0.0", + "hono": "^4.4.7", + "iron-session": "^8.0.4", + "jsonwebtoken": "^9.0.2", + "kysely": "^0.27.5", + "lodash": "^4.17.21", + "nats": "^2.29.2", + "pg": "^8.13.3", + "ramda": "^0.30.1", + "redis": "^4.7.0", + "unstorage": "^1.14.4", + "url": "^0.11.4", + "uuid": "^11.1.0", + "ws": "^8.18.1", + "zod": "^3.24.1" + }, + "devDependencies": { + "@pkl-community/pkl": "^0.28.2", + "@types/express": "^5.0.2", + "@types/lodash": "^4.17.17", + "@types/node": "^22.13.0", + "@types/ramda": "^0.30.2", + "@types/service-worker-mock": "^2.0.1", + "drizzle-kit": "^0.31.1", + "pkgroll": "^2.6.1", + "tsx": "^4.19.2", + "zx": "^8.5.4" + }, + "exports": { + ".": { + "import": "./dist/index.js" + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/actor/defs.pkl b/apps/api/pkl/defs/actor/defs.pkl new file mode 100644 index 00000000..0d0218b6 --- /dev/null +++ b/apps/api/pkl/defs/actor/defs.pkl @@ -0,0 +1,91 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.actor.defs" +defs = new Mapping { + ["profileViewDetailed"] { + type = "object" + properties { + ["id"] = new StringType { + type = "string" + description = "The unique identifier of the actor." + } + + ["did"] = new StringType { + type = "string" + description = "The DID of the actor." + } + + ["handle"] = new StringType { + type = "string" + description = "The handle of the actor." + } + + ["displayName"] = new StringType { + type = "string" + description = "The display name of the actor." + } + + ["avatar"] = new StringType { + type = "string" + format = "uri" + description = "The URL of the actor's avatar image." + } + + ["createdAt"] = new StringType { + type = "string" + format = "datetime" + description = "The date and time when the actor was created." + } + + ["updatedAt"] = new StringType { + type = "string" + format = "datetime" + description = "The date and time when the actor was last updated." + } + + } + } + ["profileViewBasic"] { + type = "object" + properties { + ["id"] = new StringType { + type = "string" + description = "The unique identifier of the actor." + } + + ["did"] = new StringType { + type = "string" + description = "The DID of the actor." + } + + ["handle"] = new StringType { + type = "string" + description = "The handle of the actor." + } + + ["displayName"] = new StringType { + type = "string" + description = "The display name of the actor." + } + + ["avatar"] = new StringType { + type = "string" + format = "uri" + description = "The URL of the actor's avatar image." + } + + ["createdAt"] = new StringType { + type = "string" + format = "datetime" + description = "The date and time when the actor was created." + } + + ["updatedAt"] = new StringType { + type = "string" + format = "datetime" + description = "The date and time when the actor was last updated." + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/actor/getActorAlbums.pkl b/apps/api/pkl/defs/actor/getActorAlbums.pkl new file mode 100644 index 00000000..f88f413e --- /dev/null +++ b/apps/api/pkl/defs/actor/getActorAlbums.pkl @@ -0,0 +1,43 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.actor.getActorAlbums" +defs = new Mapping { + ["main"] { + type = "query" + description = "Get albums for an actor" + parameters = new Params { + required = List("did") + properties { + ["did"] = new StringType { + description = "The DID or handle of the actor" + format = "at-identifier" + } + ["limit"] = new IntegerType { + type = "integer" + description = "The maximum number of albums to return" + minimum = 1 + } + ["offset"] = new IntegerType { + type = "integer" + description = "The offset for pagination" + minimum = 0 + } + } + } + output { + encoding = "application/json" + schema = new ObjectType { + type = "object" + properties = new Mapping { + ["albums"] = new Array { + type = "array" + items = new Ref { + ref = "app.rocksky.album.defs#albumViewBasic" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/actor/getActorArtists.pkl b/apps/api/pkl/defs/actor/getActorArtists.pkl new file mode 100644 index 00000000..a27669c9 --- /dev/null +++ b/apps/api/pkl/defs/actor/getActorArtists.pkl @@ -0,0 +1,43 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.actor.getActorArtists" +defs = new Mapping { + ["main"] { + type = "query" + description = "Get artists for an actor" + parameters = new Params { + required = List("did") + properties { + ["did"] = new StringType { + description = "The DID or handle of the actor" + format = "at-identifier" + } + ["limit"] = new IntegerType { + type = "integer" + description = "The maximum number of albums to return" + minimum = 1 + } + ["offset"] = new IntegerType { + type = "integer" + description = "The offset for pagination" + minimum = 0 + } + } + } + output { + encoding = "application/json" + schema = new ObjectType { + type = "object" + properties = new Mapping { + ["artists"] = new Array { + type = "array" + items = new Ref { + ref = "app.rocksky.artist.defs#artistViewBasic" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/actor/getActorLovedSongs.pkl b/apps/api/pkl/defs/actor/getActorLovedSongs.pkl new file mode 100644 index 00000000..707f9bed --- /dev/null +++ b/apps/api/pkl/defs/actor/getActorLovedSongs.pkl @@ -0,0 +1,43 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.actor.getActorLovedSongs" +defs = new Mapping { + ["main"] { + type = "query" + description = "Get loved songs for an actor" + parameters = new Params { + required = List("did") + properties { + ["did"] = new StringType { + description = "The DID or handle of the actor" + format = "at-identifier" + } + ["limit"] = new IntegerType { + type = "integer" + description = "The maximum number of albums to return" + minimum = 1 + } + ["offset"] = new IntegerType { + type = "integer" + description = "The offset for pagination" + minimum = 0 + } + } + } + output { + encoding = "application/json" + schema = new ObjectType { + type = "object" + properties = new Mapping { + ["tracks"] = new Array { + type = "array" + items = new Ref { + ref = "app.rocksky.song.defs#songViewBasic" + } + } + } + } + } + } +} diff --git a/apps/api/pkl/defs/actor/getActorPlaylists.pkl b/apps/api/pkl/defs/actor/getActorPlaylists.pkl new file mode 100644 index 00000000..80695212 --- /dev/null +++ b/apps/api/pkl/defs/actor/getActorPlaylists.pkl @@ -0,0 +1,43 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.actor.getActorPlaylists" +defs = new Mapping { + ["main"] { + type = "query" + description = "Get playlists for an actor" + parameters = new Params { + required = List("did") + properties { + ["did"] = new StringType { + description = "The DID or handle of the actor" + format = "at-identifier" + } + ["limit"] = new IntegerType { + type = "integer" + description = "The maximum number of albums to return" + minimum = 1 + } + ["offset"] = new IntegerType { + type = "integer" + description = "The offset for pagination" + minimum = 0 + } + } + } + output { + encoding = "application/json" + schema = new ObjectType { + type = "object" + properties = new Mapping { + ["playlists"] = new Array { + type = "array" + items = new Ref { + ref = "app.rocksky.playlist.defs#playlistViewBasic" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/actor/getActorScrobbles.pkl b/apps/api/pkl/defs/actor/getActorScrobbles.pkl new file mode 100644 index 00000000..82ab5ccc --- /dev/null +++ b/apps/api/pkl/defs/actor/getActorScrobbles.pkl @@ -0,0 +1,43 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.actor.getActorScrobbles" +defs = new Mapping { + ["main"] { + type = "query" + description = "Get scrobbles for an actor" + parameters = new Params { + required = List("did") + properties { + ["did"] = new StringType { + description = "The DID or handle of the actor" + format = "at-identifier" + } + ["limit"] = new IntegerType { + type = "integer" + description = "The maximum number of albums to return" + minimum = 1 + } + ["offset"] = new IntegerType { + type = "integer" + description = "The offset for pagination" + minimum = 0 + } + } + } + output { + encoding = "application/json" + schema = new ObjectType { + type = "object" + properties = new Mapping { + ["scrobbles"] = new Array { + type = "array" + items = new Ref { + ref = "app.rocksky.scrobble.defs#scrobbleViewBasic" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/actor/getActorSongs.pkl b/apps/api/pkl/defs/actor/getActorSongs.pkl new file mode 100644 index 00000000..02d5b116 --- /dev/null +++ b/apps/api/pkl/defs/actor/getActorSongs.pkl @@ -0,0 +1,43 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.actor.getActorSongs" +defs = new Mapping { + ["main"] { + type = "query" + description = "Get songs for an actor" + parameters = new Params { + required = List("did") + properties { + ["did"] = new StringType { + description = "The DID or handle of the actor" + format = "at-identifier" + } + ["limit"] = new IntegerType { + type = "integer" + description = "The maximum number of albums to return" + minimum = 1 + } + ["offset"] = new IntegerType { + type = "integer" + description = "The offset for pagination" + minimum = 0 + } + } + } + output { + encoding = "application/json" + schema = new ObjectType { + type = "object" + properties = new Mapping { + ["songs"] = new Array { + type = "array" + items = new Ref { + ref = "app.rocksky.song.defs#songViewBasic" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/actor/getProfile.pkl b/apps/api/pkl/defs/actor/getProfile.pkl new file mode 100644 index 00000000..99d1aea3 --- /dev/null +++ b/apps/api/pkl/defs/actor/getProfile.pkl @@ -0,0 +1,24 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.actor.getProfile" +defs = new Mapping { + ["main"] { + type = "query" + description = "Get the profile of an actor" + parameters = new Params { + properties { + ["did"] = new StringType { + description = "The DID or handle of the actor" + format = "at-identifier" + } + } + } + output { + encoding = "application/json" + schema = new Ref { + ref = "app.rocksky.actor.defs#profileViewDetailed" + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/actor/profile.pkl b/apps/api/pkl/defs/actor/profile.pkl new file mode 100644 index 00000000..8252ec05 --- /dev/null +++ b/apps/api/pkl/defs/actor/profile.pkl @@ -0,0 +1,52 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.bsky.actor.profile" +defs = new Mapping { + ["main"] { + type = "record" + description = "A declaration of a Bluesky account profile." + key = "literal:self" + `record` { + type = "object" + properties { + ["displayName"] = new StringType { + type = "string" + maxGraphemes = 64 + maxLength = 640 + } + ["description"] = new StringType { + type = "string" + description = "Free-form profile description text." + maxGraphemes = 256 + maxLength = 2560 + } + ["avatar"] = new Blob { + type = "blob" + description = "Small image to be displayed next to posts from account. AKA, 'profile picture'" + accept = List("image/png", "image/jpeg") + maxSize = 1000000 + } + ["banner"] = new Blob { + type = "blob" + description = "Larger horizontal image to display behind profile view." + accept = List("image/png", "image/jpeg") + maxSize = 10000000 + } + ["labels"] = new Union { + type = "union" + description = "Self-label values, specific to the Bluesky application, on the overall account." + refs = List("com.atproto.label.defs#selfLabels") + } + ["joinedViaStarterPack"] = new Ref { + type = "ref" + ref = "com.atproto.repo.strongRef" + } + ["createdAt"] = new StringType { + type = "string" + format = "datetime" + } + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/album/album.pkl b/apps/api/pkl/defs/album/album.pkl new file mode 100644 index 00000000..d44fc592 --- /dev/null +++ b/apps/api/pkl/defs/album/album.pkl @@ -0,0 +1,99 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.album" +defs = new Mapping { + ["main"] { + type = "record" + key = "tid" + description = "A declaration of an album." + `record` { + type = "object" + required = List("title", "artist", "createdAt") + properties { + ["title"] = new StringType { + type = "string" + description = "The title of the album." + minLength = 1 + maxLength = 512 + } + + ["artist"] = new StringType { + type = "string" + description = "The artist of the album." + minLength = 1 + maxLength = 256 + } + + ["duration"] = new IntegerType { + type = "integer" + description = "The duration of the album in seconds." + } + + ["releaseDate"] = new StringType { + type = "string" + description = "The release date of the album." + format = "datetime" + } + + ["year"] = new IntegerType { + type = "integer" + description = "The year the album was released." + } + + ["genre"] = new StringType { + type = "string" + description = "The genre of the album." + maxLength = 256 + } + + ["albumArt"] = new Blob { + type = "blob" + description = "The album art of the album." + accept = List("image/png", "image/jpeg") + maxSize = 2000000 + } + + ["tags"] = new Array { + type = "array" + description = "The tags of the album." + items = new StringType { + type = "string" + minLength = 1 + maxLength = 256 + } + } + + ["youtubeLink"] = new StringType { + type = "string" + description = "The YouTube link of the album." + format = "uri" + } + + ["spotifyLink"] = new StringType { + type = "string" + description = "The Spotify link of the album." + format = "uri" + } + + ["tidalLink"] = new StringType { + type = "string" + description = "The tidal link of the album." + format = "uri" + } + + ["appleMusicLink"] = new StringType { + type = "string" + description = "The Apple Music link of the album." + format = "uri" + } + + ["createdAt"] = new StringType { + type = "string" + description = "The date and time when the album was created." + format = "datetime" + } + } + } + } +} diff --git a/apps/api/pkl/defs/album/defs.pkl b/apps/api/pkl/defs/album/defs.pkl new file mode 100644 index 00000000..5663033b --- /dev/null +++ b/apps/api/pkl/defs/album/defs.pkl @@ -0,0 +1,142 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.album.defs" +defs = new Mapping { + ["albumViewBasic"] { + type = "object" + properties { + ["id"] = new StringType { + type = "string" + description = "The unique identifier of the album." + } + + ["uri"] = new StringType { + type = "string" + format = "at-uri" + description = "The URI of the album." + } + + ["title"] = new StringType { + type = "string" + description = "The title of the album." + } + + ["artist"] = new StringType { + type = "string" + description = "The artist of the album." + } + + ["artistUri"] = new StringType { + type = "string" + format = "at-uri" + description = "The URI of the album's artist." + } + + ["year"] = new IntegerType { + type = "integer" + description = "The year the album was released." + } + + ["albumArt"] = new StringType { + type = "string" + format = "uri" + description = "The URL of the album art image." + } + + ["releaseDate"] = new StringType { + type = "string" + description = "The release date of the album." + } + + ["sha256"] = new StringType { + type = "string" + description = "The SHA256 hash of the album." + } + + ["playCount"] = new IntegerType { + type = "integer" + description = "The number of times the album has been played." + minimum = 0 + } + + ["uniqueListeners"] = new IntegerType { + type = "integer" + description = "The number of unique listeners who have played the album." + minimum = 0 + } + } + } + ["albumViewDetailed"] { + type = "object" + properties { + ["id"] = new StringType { + type = "string" + description = "The unique identifier of the album." + } + + ["uri"] = new StringType { + type = "string" + format = "at-uri" + description = "The URI of the album." + } + + ["title"] = new StringType { + type = "string" + description = "The title of the album." + } + + ["artist"] = new StringType { + type = "string" + description = "The artist of the album." + } + + ["artistUri"] = new StringType { + type = "string" + format = "at-uri" + description = "The URI of the album's artist." + } + + ["year"] = new IntegerType { + type = "integer" + description = "The year the album was released." + } + + ["albumArt"] = new StringType { + type = "string" + format = "uri" + description = "The URL of the album art image." + } + + ["releaseDate"] = new StringType { + type = "string" + description = "The release date of the album." + } + + ["sha256"] = new StringType { + type = "string" + description = "The SHA256 hash of the album." + } + + ["playCount"] = new IntegerType { + type = "integer" + description = "The number of times the album has been played." + minimum = 0 + } + + ["uniqueListeners"] = new IntegerType { + type = "integer" + description = "The number of unique listeners who have played the album." + minimum = 0 + } + + ["tracks"] = new Array { + type = "array" + items = new Ref { + type = "ref" + ref = "app.rocksky.song.defs.songViewBasic" + } + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/album/getAlbum.pkl b/apps/api/pkl/defs/album/getAlbum.pkl new file mode 100644 index 00000000..1952c3d0 --- /dev/null +++ b/apps/api/pkl/defs/album/getAlbum.pkl @@ -0,0 +1,28 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.album.getAlbum" +defs = new Mapping { + ["main"] { + type = "query" + description = "Get detailed album view" + parameters { + type = "params" + required = List("uri") + properties { + ["uri"] = new StringType { + type = "string" + format = "at-uri" + description = "The URI of the album to retrieve." + } + } + } + output { + encoding = "application/json" + schema = new Ref { + type = "ref" + ref = "app.rocksky.album.defs#albumViewDetailed" + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/album/getAlbumTracks.pkl b/apps/api/pkl/defs/album/getAlbumTracks.pkl new file mode 100644 index 00000000..d83d429e --- /dev/null +++ b/apps/api/pkl/defs/album/getAlbumTracks.pkl @@ -0,0 +1,33 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.album.getAlbumTracks" +defs = new Mapping { + ["main"] { + type = "query" + description = "Get tracks for an album" + parameters = new Params { + required = List("uri") + properties { + ["uri"] = new StringType { + description = "The URI of the album to retrieve tracks from" + format = "at-uri" + } + } + } + output { + encoding = "application/json" + schema = new ObjectType { + type = "object" + properties = new Mapping { + ["tracks"] = new Array { + type = "array" + items = new Ref { + ref = "app.rocksky.song.defs#songViewBasic" + } + } + } + } + } + } +} diff --git a/apps/api/pkl/defs/album/getAlbums.pkl b/apps/api/pkl/defs/album/getAlbums.pkl new file mode 100644 index 00000000..f0360625 --- /dev/null +++ b/apps/api/pkl/defs/album/getAlbums.pkl @@ -0,0 +1,38 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.album.getAlbums" +defs = new Mapping { + ["main"] { + type = "query" + description = "Get albums" + parameters = new Params { + properties { + ["limit"] = new IntegerType { + type = "integer" + description = "The maximum number of albums to return" + minimum = 1 + } + ["offset"] = new IntegerType { + type = "integer" + description = "The offset for pagination" + minimum = 0 + } + } + } + output { + encoding = "application/json" + schema = new ObjectType { + type = "object" + properties = new Mapping { + ["albums"] = new Array { + type = "array" + items = new Ref { + ref = "app.rocksky.album.defs#albumViewBasic" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/apikey/createApikey.pkl b/apps/api/pkl/defs/apikey/createApikey.pkl new file mode 100644 index 00000000..952da252 --- /dev/null +++ b/apps/api/pkl/defs/apikey/createApikey.pkl @@ -0,0 +1,34 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.apikey.createApikey" +defs = new Mapping { + ["main"] { + type = "procedure" + description = "Create a new API key for the authenticated user" + input { + encoding = "application/json" + schema = new ObjectType { + type = "object" + required = List("name") + properties { + ["name"] = new StringType { + type = "string" + description = "The name of the API key." + } + ["description"] = new StringType { + type = "string" + description = "A description for the API key." + } + } + } + } + output { + encoding = "application/json" + schema = new Ref { + type = "ref" + ref = "app.rocksky.apikey.defs#apiKey" + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/apikey/def.pkl b/apps/api/pkl/defs/apikey/def.pkl new file mode 100644 index 00000000..ffb7d376 --- /dev/null +++ b/apps/api/pkl/defs/apikey/def.pkl @@ -0,0 +1,28 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.apikey.defs" +defs = new Mapping { + ["apiKeyView"] { + type = "object" + properties { + ["id"] = new StringType { + type = "string" + description = "The unique identifier of the API key." + } + ["name"] = new StringType { + type = "string" + description = "The name of the API key." + } + ["description"] = new StringType { + type = "string" + description = "A description for the API key." + } + ["createdAt"] = new StringType { + type = "string" + format = "datetime" + description = "The date and time when the API key was created." + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/apikey/getApikeys.pkl b/apps/api/pkl/defs/apikey/getApikeys.pkl new file mode 100644 index 00000000..2f0f8722 --- /dev/null +++ b/apps/api/pkl/defs/apikey/getApikeys.pkl @@ -0,0 +1,39 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.apikey.getApikeys" +defs = new Mapping { + ["main"] { + type = "query" + description = "Get a list of API keys for the authenticated user" + parameters { + type = "params" + properties { + ["offset"] = new IntegerType { + type = "integer" + description = "The number of API keys to skip before starting to collect the result set." + } + + ["limit"] = new IntegerType { + type = "integer" + description = "The number of API keys to return per page." + } + + } + } + output { + encoding = "application/json" + schema = new ObjectType { + type = "object" + properties = new Mapping { + ["apiKeys"] = new Array { + type = "array" + items = new Ref { + ref = "app.rocksky.apikey.defs#apikeyView" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/apikey/removeApikey.pkl b/apps/api/pkl/defs/apikey/removeApikey.pkl new file mode 100644 index 00000000..0206d683 --- /dev/null +++ b/apps/api/pkl/defs/apikey/removeApikey.pkl @@ -0,0 +1,27 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.apikey.removeApikey" +defs = new Mapping { + ["main"] { + type = "procedure" + description = "Remove an API key for the authenticated user" + parameters { + type = "params" + required = List("id") + properties { + ["id"] = new StringType { + type = "string" + description = "The ID of the API key to remove." + } + } + } + output { + encoding = "application/json" + schema = new Ref { + type = "ref" + ref = "app.rocksky.apikey.defs#apiKey" + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/apikey/updateApikey.pkl b/apps/api/pkl/defs/apikey/updateApikey.pkl new file mode 100644 index 00000000..f341b2a6 --- /dev/null +++ b/apps/api/pkl/defs/apikey/updateApikey.pkl @@ -0,0 +1,38 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.apikey.updateApikey" +defs = new Mapping { + ["main"] { + type = "procedure" + description = "Update an existing API key for the authenticated user" + input { + encoding = "application/json" + schema = new ObjectType { + type = "object" + required = List("id", "name") + properties { + ["id"] = new StringType { + type = "string" + description = "The ID of the API key to update." + } + ["name"] = new StringType { + type = "string" + description = "The new name of the API key." + } + ["description"] = new StringType { + type = "string" + description = "A new description for the API key." + } + } + } + } + output { + encoding = "application/json" + schema = new Ref { + type = "ref" + ref = "app.rocksky.apikey.defs#apiKey" + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/artist/artist.pkl b/apps/api/pkl/defs/artist/artist.pkl new file mode 100644 index 00000000..f4597478 --- /dev/null +++ b/apps/api/pkl/defs/artist/artist.pkl @@ -0,0 +1,66 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.artist" +defs = new Mapping { + ["main"] { + type = "record" + key = "tid" + description = "A declaration of an artist." + `record` { + type = "object" + required = List("name", "createdAt") + properties { + ["name"] = new StringType { + type = "string" + description = "The name of the artist." + minLength = 1 + maxLength = 512 + } + + ["bio"] = new StringType { + type = "string" + description = "The biography of the artist." + maxLength = 1000 + } + + ["picture"] = new Blob { + type = "blob" + description = "The picture of the artist." + accept = List("image/png", "image/jpeg") + maxSize = 2000000 + } + + ["tags"] = new Array { + type = "array" + description = "The tags of the artist." + items = new StringType { + type = "string" + minLength = 1 + maxLength = 256 + } + } + ["born"] = new StringType { + type = "string" + description = "The birth date of the artist." + format = "datetime" + } + ["died"] = new StringType { + type = "string" + description = "The death date of the artist." + format = "datetime" + } + ["bornIn"] = new StringType { + type = "string" + description = "The birth place of the artist." + maxLength = 256 + } + ["createdAt"] = new StringType { + type = "string" + description = "The date when the artist was created." + format = "datetime" + } + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/artist/defs.pkl b/apps/api/pkl/defs/artist/defs.pkl new file mode 100644 index 00000000..7b935ac0 --- /dev/null +++ b/apps/api/pkl/defs/artist/defs.pkl @@ -0,0 +1,93 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.artist.defs" +defs = new Mapping { + ["artistViewBasic"] { + type = "object" + properties { + ["id"] = new StringType { + type = "string" + description = "The unique identifier of the artist." + } + + ["uri"] = new StringType { + type = "string" + format = "at-uri" + description = "The URI of the artist." + } + + ["name"] = new StringType { + type = "string" + description = "The name of the artist." + } + + ["picture"] = new StringType { + type = "string" + description = "The picture of the artist." + } + + ["sha256"] = new StringType { + type = "string" + description = "The SHA256 hash of the artist." + } + + ["playCount"] = new IntegerType { + type = "integer" + description = "The number of times the artist has been played." + minimum = 0 + } + + ["uniqueListeners"] = new IntegerType { + type = "integer" + description = "The number of unique listeners who have played the artist." + minimum = 0 + } + + } + } + + ["artistViewDetailed"] { + type = "object" + properties { + ["id"] = new StringType { + type = "string" + description = "The unique identifier of the artist." + } + + ["uri"] = new StringType { + type = "string" + format = "at-uri" + description = "The URI of the artist." + } + + ["name"] = new StringType { + type = "string" + description = "The name of the artist." + } + + ["picture"] = new StringType { + type = "string" + description = "The picture of the artist." + } + + ["sha256"] = new StringType { + type = "string" + description = "The SHA256 hash of the artist." + } + + ["playCount"] = new IntegerType { + type = "integer" + description = "The number of times the artist has been played." + minimum = 0 + } + + ["uniqueListeners"] = new IntegerType { + type = "integer" + description = "The number of unique listeners who have played the artist." + minimum = 0 + } + + } + } +} diff --git a/apps/api/pkl/defs/artist/getArtist.pkl b/apps/api/pkl/defs/artist/getArtist.pkl new file mode 100644 index 00000000..84d59998 --- /dev/null +++ b/apps/api/pkl/defs/artist/getArtist.pkl @@ -0,0 +1,26 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.artist.getArtist" +defs = new Mapping { + ["main"] { + type = "query" + description = "Get artist details" + parameters = new Params { + required = List("uri") + properties { + ["uri"] = new StringType { + description = "The URI of the artist to retrieve details from" + format = "at-uri" + } + } + } + output { + encoding = "application/json" + schema = new Ref { + type = "ref" + ref = "app.rocksky.artist.defs#artistViewDetailed" + } + } + } +} diff --git a/apps/api/pkl/defs/artist/getArtistAlbums.pkl b/apps/api/pkl/defs/artist/getArtistAlbums.pkl new file mode 100644 index 00000000..451f8403 --- /dev/null +++ b/apps/api/pkl/defs/artist/getArtistAlbums.pkl @@ -0,0 +1,33 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.artist.getArtistAlbums" +defs = new Mapping { + ["main"] { + type = "query" + description = "Get artist's albums" + parameters = new Params { + required = List("uri") + properties { + ["uri"] = new StringType { + description = "The URI of the artist to retrieve albums from" + format = "at-uri" + } + } + } + output { + encoding = "application/json" + schema = new ObjectType { + type = "object" + properties = new Mapping { + ["albums"] = new Array { + type = "array" + items = new Ref { + ref = "app.rocksky.album.defs#albumViewBasic" + } + } + } + } + } + } +} diff --git a/apps/api/pkl/defs/artist/getArtistTracks.pkl b/apps/api/pkl/defs/artist/getArtistTracks.pkl new file mode 100644 index 00000000..52f06949 --- /dev/null +++ b/apps/api/pkl/defs/artist/getArtistTracks.pkl @@ -0,0 +1,42 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.artist.getArtistTracks" +defs = new Mapping { + ["main"] { + type = "query" + description = "Get artist's tracks" + parameters = new Params { + properties { + ["uri"] = new StringType { + description = "The URI of the artist to retrieve albums from" + format = "at-uri" + } + ["limit"] = new IntegerType { + type = "integer" + description = "The maximum number of tracks to return" + minimum = 1 + } + ["offset"] = new IntegerType { + type = "integer" + description = "The offset for pagination" + minimum = 0 + } + } + } + output { + encoding = "application/json" + schema = new ObjectType { + type = "object" + properties = new Mapping { + ["tracks"] = new Array { + type = "array" + items = new Ref { + ref = "app.rocksky.song.defs#songViewBasic" + } + } + } + } + } + } +} diff --git a/apps/api/pkl/defs/artist/getArtists.pkl b/apps/api/pkl/defs/artist/getArtists.pkl new file mode 100644 index 00000000..3c8961b9 --- /dev/null +++ b/apps/api/pkl/defs/artist/getArtists.pkl @@ -0,0 +1,38 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.artist.getArtists" +defs = new Mapping { + ["main"] { + type = "query" + description = "Get artists" + parameters = new Params { + properties { + ["limit"] = new IntegerType { + type = "integer" + description = "The maximum number of artists to return" + minimum = 1 + } + ["offset"] = new IntegerType { + type = "integer" + description = "The offset for pagination" + minimum = 0 + } + } + } + output { + encoding = "application/json" + schema = new ObjectType { + type = "object" + properties = new Mapping { + ["artists"] = new Array { + type = "array" + items = new Ref { + ref = "app.rocksky.artist.defs#artistViewBasic" + } + } + } + } + } + } +} diff --git a/apps/api/pkl/defs/charts/defs.pkl b/apps/api/pkl/defs/charts/defs.pkl new file mode 100644 index 00000000..a12b352b --- /dev/null +++ b/apps/api/pkl/defs/charts/defs.pkl @@ -0,0 +1,32 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.charts.defs" +defs = new Mapping { + ["chartsView"] { + type = "object" + properties { + ["scrobbles"] = new Array { + type = "array" + items = new Ref { + type = "ref" + ref = "app.rocksky.charts.defs#scrobbleViewBasic" + } + } + } + } + ["scrobbleViewBasic"] { + type = "object" + properties { + ["date"] = new StringType { + type = "string" + description = "The date of the scrobble." + format = "datetime" + } + ["count"] = new IntegerType { + type = "integer" + description = "The number of scrobbles on this date." + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/charts/getScrobblesChart.pkl b/apps/api/pkl/defs/charts/getScrobblesChart.pkl new file mode 100644 index 00000000..5f0bde06 --- /dev/null +++ b/apps/api/pkl/defs/charts/getScrobblesChart.pkl @@ -0,0 +1,39 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.charts.getScrobblesChart" +defs = new Mapping { + ["main"] { + type = "query" + description = "Get the scrobbles chart" + parameters = new Params { + properties { + ["did"] = new StringType { + description = "The DID or handle of the actor" + format = "at-identifier" + } + + ["artisturi"] = new StringType { + description = "The URI of the artist to filter by" + format = "at-uri" + } + + ["albumuri"] = new StringType { + description = "The URI of the album to filter by" + format = "at-uri" + } + + ["songuri"] = new StringType { + description = "The URI of the track to filter by" + format = "at-uri" + } + } + } + output { + encoding = "application/json" + schema = new Ref { + ref = "app.rocksky.charts.defs#chartsView" + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/dropbox/defs.pkl b/apps/api/pkl/defs/dropbox/defs.pkl new file mode 100644 index 00000000..9e66f882 --- /dev/null +++ b/apps/api/pkl/defs/dropbox/defs.pkl @@ -0,0 +1,65 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.dropbox.defs" +defs = new Mapping { + ["fileView"] { + type = "object" + properties { + ["id"] = new StringType { + type = "string" + description = "The unique identifier of the file." + } + + ["name"] = new StringType { + type = "string" + description = "The name of the file." + } + + ["pathLower"] = new StringType { + type = "string" + description = "The lowercased path of the file." + } + + ["pathDisplay"] = new StringType { + type = "string" + description = "The display path of the file." + } + + ["clientModified"] = new StringType { + type = "string" + format = "datetime" + description = "The last modified date and time of the file on the client." + } + + ["serverModified"] = new StringType { + type = "string" + format = "datetime" + description = "The last modified date and time of the file on the server." + } + } + } + ["fileListView"] { + type = "object" + properties { + ["files"] = new Array { + type = "array" + items = new Ref { + type = "ref" + ref = "app.rocksky.dropbox.defs#fileView" + } + description = "A list of files in the Dropbox." + } + } + } + ["temporaryLinkView"] { + type = "object" + properties { + ["link"] = new StringType { + type = "string" + format = "uri" + description = "The temporary link to access the file." + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/dropbox/downloadFile.pkl b/apps/api/pkl/defs/dropbox/downloadFile.pkl new file mode 100644 index 00000000..73011aa2 --- /dev/null +++ b/apps/api/pkl/defs/dropbox/downloadFile.pkl @@ -0,0 +1,21 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.dropbox.downloadFile" +defs = new Mapping { + ["main"] { + type = "query" + description = "Download a file from Dropbox by its unique identifier" + parameters = new Params { + required = List("fileId") + properties { + ["fileId"] = new StringType { + description = "The unique identifier of the file to download" + } + } + } + output { + encoding = "application/octet-stream" + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/dropbox/getFiles.pkl b/apps/api/pkl/defs/dropbox/getFiles.pkl new file mode 100644 index 00000000..1a2a47bd --- /dev/null +++ b/apps/api/pkl/defs/dropbox/getFiles.pkl @@ -0,0 +1,24 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.dropbox.getFiles" +defs = new Mapping { + ["main"] { + type = "query" + description = "Retrieve a list of files from Dropbox" + parameters { + properties { + ["at"] = new StringType { + description = "Path to the Dropbox folder or root directory" + } + } + } + output { + encoding = "application/json" + schema = new Ref { + type = "ref" + ref = "app.rocksky.dropbox.defs#fileListView" + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/dropbox/getMetadata.pkl b/apps/api/pkl/defs/dropbox/getMetadata.pkl new file mode 100644 index 00000000..5cd01875 --- /dev/null +++ b/apps/api/pkl/defs/dropbox/getMetadata.pkl @@ -0,0 +1,25 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.dropbox.getMetadata" +defs = new Mapping { + ["main"] { + type = "query" + description = "Retrieve metadata of a file or folder in Dropbox" + parameters { + required = List("path") + properties { + ["path"] = new StringType { + description = "Path to the file or folder in Dropbox" + } + } + } + output { + encoding = "application/json" + schema = new Ref { + type = "ref" + ref = "app.rocksky.dropbox.defs#fileView" + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/dropbox/getTemporaryLink.pkl b/apps/api/pkl/defs/dropbox/getTemporaryLink.pkl new file mode 100644 index 00000000..e508576e --- /dev/null +++ b/apps/api/pkl/defs/dropbox/getTemporaryLink.pkl @@ -0,0 +1,25 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.dropbox.getTemporaryLink" +defs = new Mapping { + ["main"] { + type = "query" + description = "Retrieve a temporary link to access a file in Dropbox" + parameters { + required = List("path") + properties { + ["path"] = new StringType { + description = "Path to the file in Dropbox" + } + } + } + output { + encoding = "application/json" + schema = new Ref { + type = "ref" + ref = "app.rocksky.dropbox.defs#temporaryLinkView" + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/feed/defs.pkl b/apps/api/pkl/defs/feed/defs.pkl new file mode 100644 index 00000000..99e4a62f --- /dev/null +++ b/apps/api/pkl/defs/feed/defs.pkl @@ -0,0 +1,106 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.feed.defs" +defs = new Mapping { + ["searchResultsView"] = new ObjectType { + type = "object" + properties { + ["hits"] = new Array { + type = "array" + items = new Union { + type = "union" + refs = List( + "app.rocksky.song.defs#songViewBasic", + "app.rocksky.album.defs#albumViewBasic", + "app.rocksky.artist.defs#artistViewBasic", + "app.rocksky.playlist.defs#playlistViewBasic", + "app.rocksky.actor.defs#profileViewBasic" + ) + } + } + ["processingTimeMs"] = new IntegerType { + type = "integer" + } + ["limit"] = new IntegerType { + type = "integer" + } + ["offset"] = new IntegerType { + type = "integer" + } + ["estimatedTotalHits"] = new IntegerType { + type = "integer" + } + } + + } + ["nowPlayingView"] = new ObjectType { + type = "object" + properties { + ["album"] = new StringType { + type = "string" + } + ["albumArt"] = new StringType { + type = "string" + format = "uri" + } + ["albumArtist"] = new StringType { + type = "string" + } + ["albumUri"] = new StringType { + type = "string" + format = "at-uri" + } + ["artist"] = new StringType { + type = "string" + } + ["artistUri"] = new StringType { + type = "string" + format = "at-uri" + } + ["avatar"] = new StringType { + type = "string" + format = "uri" + } + ["createdAt"] = new StringType { + type = "string" + } + ["did"] = new StringType { + type = "string" + format = "at-identifier" + } + ["handle"] = new StringType { + type = "string" + } + ["id"] = new StringType { + type = "string" + } + ["title"] = new StringType { + type = "string" + } + ["trackId"] = new StringType { + type = "string" + } + ["trackUri"] = new StringType { + type = "string" + format = "at-uri" + } + ["uri"] = new StringType { + type = "string" + format = "at-uri" + } + } + } + ["nowPlayingsView"] = new ObjectType { + type = "object" + properties { + ["nowPlayings"] = new Array { + type = "array" + items = new Ref { + type = "ref" + ref = "app.rocksky.feed.defs#nowPlayingView" + } + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/feed/getNowPlayings.pkl b/apps/api/pkl/defs/feed/getNowPlayings.pkl new file mode 100644 index 00000000..c7464bbd --- /dev/null +++ b/apps/api/pkl/defs/feed/getNowPlayings.pkl @@ -0,0 +1,27 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.feed.getNowPlayings" +defs = new Mapping { + ["main"] { + type = "query" + description = "Get all currently playing tracks by users" + parameters { + type = "params" + properties { + ["size"] = new IntegerType { + type = "integer" + description = "The maximum number of now playing tracks to return." + minimum = 1 + } + } + } + output { + encoding = "application/json" + schema = new Ref { + type = "ref" + ref = "app.rocksky.feed.defs#nowPlayingsView" + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/feed/search.pkl b/apps/api/pkl/defs/feed/search.pkl new file mode 100644 index 00000000..e9d05299 --- /dev/null +++ b/apps/api/pkl/defs/feed/search.pkl @@ -0,0 +1,26 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.feed.search" +defs = new Mapping { + ["main"] { + type = "query" + description = "Search for content in the feed" + parameters { + type = "params" + required = List("query") + properties { + ["query"] = new StringType { + description = "The search query string" + } + } + } + output { + encoding = "application/json" + schema = new Ref { + type = "ref" + ref = "app.rocksky.feed.defs#searchResultsView" + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/googledrive/defs.pkl b/apps/api/pkl/defs/googledrive/defs.pkl new file mode 100644 index 00000000..b1a0e4ce --- /dev/null +++ b/apps/api/pkl/defs/googledrive/defs.pkl @@ -0,0 +1,27 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.googledrive.defs" +defs = new Mapping { + ["fileView"] { + type = "object" + properties { + ["id"] = new StringType { + type = "string" + description = "The unique identifier of the file." + } + } + } + ["fileListView"] { + type = "object" + properties { + ["files"] = new Array { + type = "array" + items = new Ref { + type = "ref" + ref = "app.rocksky.googledrive.defs#fileView" + } + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/googledrive/downloadFile.pkl b/apps/api/pkl/defs/googledrive/downloadFile.pkl new file mode 100644 index 00000000..9979616e --- /dev/null +++ b/apps/api/pkl/defs/googledrive/downloadFile.pkl @@ -0,0 +1,21 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.googledrive.downloadFile" +defs = new Mapping { + ["main"] { + type = "query" + description = "Download a file from Google Drive by its unique identifier" + parameters = new Params { + required = List("fileId") + properties { + ["fileId"] = new StringType { + description = "The unique identifier of the file to download" + } + } + } + output { + encoding = "application/octet-stream" + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/googledrive/getFile.pkl b/apps/api/pkl/defs/googledrive/getFile.pkl new file mode 100644 index 00000000..e4b14cc7 --- /dev/null +++ b/apps/api/pkl/defs/googledrive/getFile.pkl @@ -0,0 +1,24 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.googledrive.getFile" +defs = new Mapping { + ["main"] { + type = "query" + description = "Get a file from Google Drive by its unique identifier" + parameters = new Params { + required = List("fileId") + properties { + ["fileId"] = new StringType { + description = "The unique identifier of the file to retrieve" + } + } + } + output { + encoding = "application/json" + schema = new Ref { + ref = "app.rocksky.googledrive.defs#fileView" + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/googledrive/getFiles.pkl b/apps/api/pkl/defs/googledrive/getFiles.pkl new file mode 100644 index 00000000..4099cf52 --- /dev/null +++ b/apps/api/pkl/defs/googledrive/getFiles.pkl @@ -0,0 +1,25 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.googledrive.getFiles" +defs = new Mapping { + ["main"] { + type = "query" + description = "Get a list of files from Google Drive" + parameters = new Params { + properties { + ["at"] = new StringType { + description = "Path to the Google Drive folder or root directory" + } + } + } + + output { + encoding = "application/json" + schema = new Ref { + type = "ref" + ref = "app.rocksky.googledrive.defs#fileListView" + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/like/dislikeShout.pkl b/apps/api/pkl/defs/like/dislikeShout.pkl new file mode 100644 index 00000000..884e3d6e --- /dev/null +++ b/apps/api/pkl/defs/like/dislikeShout.pkl @@ -0,0 +1,30 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.like.dislikeShout" +defs = new Mapping { + ["main"] { + type = "procedure" + description = "Dislike a shout" + input { + encoding = "application/json" + schema { + type = "object" + properties { + ["uri"] = new StringType { + type = "string" + description = "The unique identifier of the shout to dislike" + format = "at-uri" + } + } + } + } + output { + encoding = "application/json" + schema = new Ref { + type = "ref" + ref = "app.rocksky.shout.defs#shoutView" + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/like/dislikeSong.pkl b/apps/api/pkl/defs/like/dislikeSong.pkl new file mode 100644 index 00000000..e2b1e787 --- /dev/null +++ b/apps/api/pkl/defs/like/dislikeSong.pkl @@ -0,0 +1,30 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.like.dislikeSong" +defs = new Mapping { + ["main"] { + type = "procedure" + description = "Dislike a song" + input { + encoding = "application/json" + schema { + type = "object" + properties { + ["uri"] = new StringType { + type = "string" + description = "The unique identifier of the song to dislike" + format = "at-uri" + } + } + } + } + output { + encoding = "application/json" + schema = new Ref { + type = "ref" + ref = "app.rocksky.song.defs#songViewDetailed" + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/like/like.pkl b/apps/api/pkl/defs/like/like.pkl new file mode 100644 index 00000000..248cc7c0 --- /dev/null +++ b/apps/api/pkl/defs/like/like.pkl @@ -0,0 +1,27 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.like" +defs = new Mapping { + ["main"] { + type = "record" + key = "tid" + description = "A declaration of a like." + `record` { + type = "object" + required = List("createdAt", "subject") + properties { + ["createdAt"] = new StringType { + type = "string" + description = "The date when the like was created." + format = "datetime" + } + + ["subject"] = new Ref { + type = "ref" + ref = "com.atproto.repo.strongRef" + } + } + } + } +} diff --git a/apps/api/pkl/defs/like/likeShout.pkl b/apps/api/pkl/defs/like/likeShout.pkl new file mode 100644 index 00000000..9fbd968f --- /dev/null +++ b/apps/api/pkl/defs/like/likeShout.pkl @@ -0,0 +1,30 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.like.likeShout" +defs = new Mapping { + ["main"] { + type = "procedure" + description = "Like a shout" + input { + encoding = "application/json" + schema { + type = "object" + properties { + ["uri"] = new StringType { + type = "string" + description = "The unique identifier of the shout to like" + format = "at-uri" + } + } + } + } + output { + encoding = "application/json" + schema = new Ref { + type = "ref" + ref = "app.rocksky.shout.defs#shoutView" + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/like/likeSong.pkl b/apps/api/pkl/defs/like/likeSong.pkl new file mode 100644 index 00000000..43991a42 --- /dev/null +++ b/apps/api/pkl/defs/like/likeSong.pkl @@ -0,0 +1,30 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.like.likeSong" +defs = new Mapping { + ["main"] { + type = "procedure" + description = "Like a song" + input { + encoding = "application/json" + schema { + type = "object" + properties { + ["uri"] = new StringType { + type = "string" + description = "The unique identifier of the song to like" + format = "at-uri" + } + } + } + } + output { + encoding = "application/json" + schema = new Ref { + type = "ref" + ref = "app.rocksky.song.defs#songViewDetailed" + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/player/defs.pkl b/apps/api/pkl/defs/player/defs.pkl new file mode 100644 index 00000000..8143eb74 --- /dev/null +++ b/apps/api/pkl/defs/player/defs.pkl @@ -0,0 +1,15 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.player.defs" +defs = new Mapping { + ["currentlyPlayingViewDetailed"] { + type = "object" + properties { + ["title"] = new StringType { + type = "string" + description = "The title of the currently playing track" + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/player/getCurrentlyPlaying.pkl b/apps/api/pkl/defs/player/getCurrentlyPlaying.pkl new file mode 100644 index 00000000..097c9b68 --- /dev/null +++ b/apps/api/pkl/defs/player/getCurrentlyPlaying.pkl @@ -0,0 +1,27 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.player.getCurrentlyPlaying" +defs = new Mapping { + ["main"] { + type = "query" + description = "Get the currently playing track" + parameters { + type = "params" + properties { + ["actor"] = new StringType { + type = "string" + format = "at-identifier" + description = "Handle or DID of the actor to retrieve the currently playing track for. If not provided, defaults to the current user." + } + } + } + output { + encoding = "application/json" + schema = new Ref { + type = "ref" + ref = "app.rocksky.player.defs#currentlyPlayingViewDetailed" + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/player/next.pkl b/apps/api/pkl/defs/player/next.pkl new file mode 100644 index 00000000..368ff275 --- /dev/null +++ b/apps/api/pkl/defs/player/next.pkl @@ -0,0 +1,10 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.player.next" +defs = new Mapping { + ["main"] { + type = "procedure" + description = "Play the next track in the queue" + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/player/pause.pkl b/apps/api/pkl/defs/player/pause.pkl new file mode 100644 index 00000000..3cd66edc --- /dev/null +++ b/apps/api/pkl/defs/player/pause.pkl @@ -0,0 +1,10 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.player.pause" +defs = new Mapping { + ["main"] { + type = "procedure" + description = "Pause the currently playing track" + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/player/play.pkl b/apps/api/pkl/defs/player/play.pkl new file mode 100644 index 00000000..2cbd07c1 --- /dev/null +++ b/apps/api/pkl/defs/player/play.pkl @@ -0,0 +1,10 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.player.play" +defs = new Mapping { + ["main"] { + type = "procedure" + description = "Resume playback of the currently paused track" + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/player/previous.pkl b/apps/api/pkl/defs/player/previous.pkl new file mode 100644 index 00000000..c15cac40 --- /dev/null +++ b/apps/api/pkl/defs/player/previous.pkl @@ -0,0 +1,10 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.player.previous" +defs = new Mapping { + ["main"] { + type = "procedure" + description = "Play the previous track in the queue" + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/player/seek.pkl b/apps/api/pkl/defs/player/seek.pkl new file mode 100644 index 00000000..dafb9b87 --- /dev/null +++ b/apps/api/pkl/defs/player/seek.pkl @@ -0,0 +1,20 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.player.seek" +defs = new Mapping { + ["main"] { + type = "procedure" + description = "Seek to a specific position in the currently playing track" + parameters { + type = "params" + required = List("position") + properties = new Mapping { + ["position"] { + type = "integer" + description = "The position in seconds to seek to" + } + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/playlist/defs.pkl b/apps/api/pkl/defs/playlist/defs.pkl new file mode 100644 index 00000000..6b43378a --- /dev/null +++ b/apps/api/pkl/defs/playlist/defs.pkl @@ -0,0 +1,143 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.playlist.defs" +defs = new Mapping { + ["playlistViewDetailed"] { + type = "object" + description = "Detailed view of a playlist, including its tracks and metadata" + properties { + ["id"] = new StringType { + type = "string" + description = "The unique identifier of the playlist." + } + + ["title"] = new StringType { + type = "string" + description = "The title of the playlist." + } + + ["uri"] = new StringType { + type = "string" + format = "at-uri" + description = "The URI of the playlist." + } + + ["curatorDid"] = new StringType { + type = "string" + description = "The DID of the curator of the playlist." + format = "at-identifier" + } + + ["curatorHandle"] = new StringType { + type = "string" + description = "The handle of the curator of the playlist." + format = "at-identifier" + } + + ["curatorName"] = new StringType { + type = "string" + description = "The name of the curator of the playlist." + } + + ["curatorAvatarUrl"] = new StringType { + type = "string" + format = "uri" + description = "The URL of the avatar image of the curator." + } + + ["description"] = new StringType { + type = "string" + description = "A description of the playlist." + } + + ["coverImageUrl"] = new StringType { + type = "string" + format = "uri" + description = "The URL of the cover image for the playlist." + } + + ["createdAt"] = new StringType { + type = "string" + format = "datetime" + description = "The date and time when the playlist was created." + } + + ["tracks"] = new Array { + description = "A list of tracks in the playlist." + items = new Ref { + type = "ref" + ref = "app.rocksky.song.defs#songViewBasic" + } + } + } + } + + ["playlistViewBasic"] { + type = "object" + description = "Basic view of a playlist, including its metadata" + properties { + ["id"] = new StringType { + type = "string" + description = "The unique identifier of the playlist." + } + + ["title"] = new StringType { + type = "string" + description = "The title of the playlist." + } + + ["uri"] = new StringType { + type = "string" + format = "at-uri" + description = "The URI of the playlist." + } + + ["curatorDid"] = new StringType { + type = "string" + description = "The DID of the curator of the playlist." + format = "at-identifier" + } + + ["curatorHandle"] = new StringType { + type = "string" + description = "The handle of the curator of the playlist." + format = "at-identifier" + } + + ["curatorName"] = new StringType { + type = "string" + description = "The name of the curator of the playlist." + } + + ["curatorAvatarUrl"] = new StringType { + type = "string" + format = "uri" + description = "The URL of the avatar image of the curator." + } + + ["description"] = new StringType { + type = "string" + description = "A description of the playlist." + } + + ["coverImageUrl"] = new StringType { + type = "string" + format = "uri" + description = "The URL of the cover image for the playlist." + } + + ["createdAt"] = new StringType { + type = "string" + format = "datetime" + description = "The date and time when the playlist was created." + } + + ["trackCount"] = new IntegerType { + type = "integer" + description = "The number of tracks in the playlist." + minimum = 0 + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/playlist/getPlaylist.pkl b/apps/api/pkl/defs/playlist/getPlaylist.pkl new file mode 100644 index 00000000..1ad16e9d --- /dev/null +++ b/apps/api/pkl/defs/playlist/getPlaylist.pkl @@ -0,0 +1,28 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.playlist.getPlaylist" +defs = new Mapping { + ["main"] { + type = "query" + description = "Retrieve a playlist by its ID" + parameters { + type = "params" + required = List("uri") + properties { + ["uri"] = new StringType { + type = "string" + format = "at-uri" + description = "The URI of the playlist to retrieve." + } + } + } + output { + encoding = "application/json" + schema = new Ref { + type = "ref" + ref = "app.rocksky.playlist.defs#playlistViewDetailed" + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/playlist/getPlaylists.pkl b/apps/api/pkl/defs/playlist/getPlaylists.pkl new file mode 100644 index 00000000..b742f1ad --- /dev/null +++ b/apps/api/pkl/defs/playlist/getPlaylists.pkl @@ -0,0 +1,37 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.playlist.getPlaylists" +defs = new Mapping { + ["main"] { + type = "query" + description = "Retrieve a list of playlists" + parameters { + type = "params" + properties { + ["limit"] = new IntegerType { + type = "integer" + description = "The maximum number of playlists to return." + } + ["offset"] = new IntegerType { + type = "integer" + description = "The offset for pagination, used to skip a number of playlists." + } + } + } + output { + encoding = "application/json" + schema = new ObjectType { + type = "object" + properties = new Mapping { + ["playlists"] = new Array { + type = "array" + items = new Ref { + ref = "app.rocksky.playlist.defs#playlistViewBasic" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/playlist/playlist.pkl b/apps/api/pkl/defs/playlist/playlist.pkl new file mode 100644 index 00000000..1072281d --- /dev/null +++ b/apps/api/pkl/defs/playlist/playlist.pkl @@ -0,0 +1,64 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.playlist" +defs = new Mapping { + ["main"] { + type = "record" + key = "tid" + description = "A declaration of a playlist." + `record` { + type = "object" + required = List("name", "createdAt") + properties { + ["name"] = new StringType { + type = "string" + description = "The name of the playlist." + minLength = 1 + maxLength = 512 + } + ["description"] = new StringType { + type = "string" + description = "The playlist description." + minLength = 1 + maxLength = 256 + } + ["picture"] = new Blob { + type = "blob" + description = "The picture of the playlist." + accept = List("image/png", "image/jpeg") + maxSize = 2000000 + } + ["tracks"] = new Array { + type = "array" + description = "The tracks in the playlist." + items = new Ref { + type = "ref" + ref = "app.rocksky.song#record" + } + } + ["createdAt"] = new StringType { + type = "string" + description = "The date the playlist was created." + format = "datetime" + } + ["spotifyLink"] = new StringType { + type = "string" + description = "The Spotify link of the playlist." + } + ["tidalLink"] = new StringType { + type = "string" + description = "The Tidal link of the playlist." + } + ["youtubeLink"] = new StringType { + type = "string" + description = "The YouTube link of the playlist." + } + ["appleMusicLink"] = new StringType { + type = "string" + description = "The Apple Music link of the playlist." + } + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/radio/defs.pkl b/apps/api/pkl/defs/radio/defs.pkl new file mode 100644 index 00000000..2f23749b --- /dev/null +++ b/apps/api/pkl/defs/radio/defs.pkl @@ -0,0 +1,78 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.radio.defs" +defs = new Mapping { + ["radioViewBasic"] { + type = "object" + properties { + ["id"] = new StringType { + type = "string" + description = "The unique identifier of the radio." + } + + ["name"] = new StringType { + type = "string" + description = "The name of the radio." + } + + ["description"] = new StringType { + type = "string" + description = "A brief description of the radio." + } + + ["createdAt"] = new StringType { + type = "string" + format = "datetime" + description = "The date and time when the radio was created." + } + } + } + ["radioViewDetailed"] { + type = "object" + properties { + ["id"] = new StringType { + type = "string" + description = "The unique identifier of the radio." + } + + ["name"] = new StringType { + type = "string" + description = "The name of the radio." + } + + ["description"] = new StringType { + type = "string" + description = "A brief description of the radio." + } + + ["website"] = new StringType { + type = "string" + format = "uri" + description = "The website of the radio." + } + + ["url"] = new StringType { + type = "string" + format = "uri" + description = "The streaming URL of the radio." + } + + ["genre"] = new StringType { + type = "string" + description = "The genre of the radio." + } + + ["logo"] = new StringType { + type = "string" + description = "The logo of the radio station." + } + + ["createdAt"] = new StringType { + type = "string" + format = "datetime" + description = "The date and time when the radio was created." + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/radio/radio.pkl b/apps/api/pkl/defs/radio/radio.pkl new file mode 100644 index 00000000..b023934c --- /dev/null +++ b/apps/api/pkl/defs/radio/radio.pkl @@ -0,0 +1,63 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.radio" +defs = new Mapping { + ["main"] { + type = "record" + key = "tid" + description = "A declaration of a radio station." + `record` { + type = "object" + required = List("name", "url", "createdAt") + properties { + ["name"] = new StringType { + type = "string" + description = "The name of the radio station." + minLength = 1 + maxLength = 512 + } + + ["url"] = new StringType { + type = "string" + description = "The URL of the radio station." + format = "uri" + } + + ["description"] = new StringType { + type = "string" + description = "A description of the radio station." + minLength = 1 + maxLength = 1000 + } + + ["genre"] = new StringType { + type = "string" + description = "The genre of the radio station." + minLength = 1 + maxLength = 256 + } + + ["logo"] = new Blob { + type = "blob" + description = "The logo of the radio station." + accept = List("image/png", "image/jpeg") + maxSize = 2000000 + } + + ["website"] = new StringType { + type = "string" + description = "The website of the radio station." + format = "uri" + } + + ["createdAt"] = new StringType { + type = "string" + description = "The date when the radio station was created." + format = "datetime" + } + + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/scrobble/createScrobble.pkl b/apps/api/pkl/defs/scrobble/createScrobble.pkl new file mode 100644 index 00000000..ed978c28 --- /dev/null +++ b/apps/api/pkl/defs/scrobble/createScrobble.pkl @@ -0,0 +1,122 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.scrobble.createScrobble" +defs = new Mapping { + ["main"] { + type = "procedure" + description = "Create a new scrobble" + input { + encoding = "application/json" + schema { + type = "object" + required = List("title", "artist") + properties { + ["title"] = new StringType { + type = "string" + description = "The title of the track being scrobbled" + } + ["artist"] = new StringType { + type = "string" + description = "The artist of the track being scrobbled" + } + ["album"] = new StringType { + type = "string" + description = "The album of the track being scrobbled" + } + ["duration"] = new IntegerType { + type = "integer" + description = "The duration of the track in seconds" + } + ["mbId"] = new StringType { + type = "string" + description = "The MusicBrainz ID of the track, if available" + } + ["albumArt"] = new StringType { + type = "string" + description = "The URL of the album art for the track" + format = "uri" + } + ["trackNumber"] = new IntegerType { + type = "integer" + description = "The track number of the track in the album" + } + ["releaseDate"] = new StringType { + type = "string" + description = "The release date of the track, formatted as YYYY-MM-DD" + } + ["year"] = new IntegerType { + type = "integer" + description = "The year the track was released" + } + ["discNumber"] = new IntegerType { + type = "integer" + description = "The disc number of the track in the album, if applicable" + } + ["lyrics"] = new StringType { + type = "string" + description = "The lyrics of the track, if available" + } + ["composer"] = new StringType { + type = "string" + description = "The composer of the track, if available" + } + ["copyrightMessage"] = new StringType { + type = "string" + description = "The copyright message for the track, if available" + } + ["label"] = new StringType { + type = "string" + description = "The record label of the track, if available" + } + ["artistPicture"] = new StringType { + type = "string" + description = "The URL of the artist's picture, if available" + format = "uri" + } + ["spotifyLink"] = new StringType { + type = "string" + description = "The Spotify link for the track, if available" + format = "uri" + } + ["lastfmLink"] = new StringType { + type = "string" + description = "The Last.fm link for the track, if available" + format = "uri" + } + ["tidalLink"] = new StringType { + type = "string" + description = "The Tidal link for the track, if available" + format = "uri" + } + ["appleMusicLink"] = new StringType { + type = "string" + description = "The Apple Music link for the track, if available" + format = "uri" + } + ["youtubeLink"] = new StringType { + type = "string" + description = "The Youtube link for the track, if available" + format = "uri" + } + ["deezerLink"] = new StringType { + type = "string" + description = "The Deezer link for the track, if available" + format = "uri" + } + ["timestamp"] = new IntegerType { + type = "integer" + description = "The timestamp of the scrobble in milliseconds since epoch" + } + } + } + } + output { + encoding = "application/json" + schema = new Ref { + type = "ref" + ref = "app.rocksky.scrobble.defs#scrobbleViewBasic" + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/scrobble/defs.pkl b/apps/api/pkl/defs/scrobble/defs.pkl new file mode 100644 index 00000000..7e257807 --- /dev/null +++ b/apps/api/pkl/defs/scrobble/defs.pkl @@ -0,0 +1,142 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.scrobble.defs" +defs = new Mapping { + ["scrobbleViewBasic"] { + type = "object" + properties { + ["id"] = new StringType { + type = "string" + description = "The unique identifier of the scrobble." + } + ["user"] = new StringType { + type = "string" + description = "The handle of the user who created the scrobble." + } + ["title"] = new StringType { + type = "string" + description = "The title of the scrobble." + } + + ["artist"] = new StringType { + type = "string" + description = "The artist of the song." + } + + ["artistUri"] = new StringType { + type = "string" + description = "The URI of the artist." + format = "at-uri" + } + + ["album"] = new StringType { + type = "string" + description = "The album of the song." + } + + ["albumUri"] = new StringType { + type = "string" + description = "The URI of the album." + format = "at-uri" + } + + ["cover"] = new StringType { + type = "string" + description = "The album art URL of the song." + format = "uri" + } + + ["date"] = new StringType { + type = "string" + format = "datetime" + description = "The timestamp when the scrobble was created." + } + + ["uri"] = new StringType { + type = "string" + format = "uri" + description = "The URI of the scrobble." + } + + ["sha256"] = new StringType { + type = "string" + description = "The SHA256 hash of the scrobble data." + } + + } + } + + ["scrobbleViewDetailed"] { + type = "object" + properties { + ["id"] = new StringType { + type = "string" + description = "The unique identifier of the scrobble." + } + ["user"] = new StringType { + type = "string" + description = "The handle of the user who created the scrobble." + } + ["title"] = new StringType { + type = "string" + description = "The title of the scrobble." + } + + ["artist"] = new StringType { + type = "string" + description = "The artist of the song." + } + + ["artistUri"] = new StringType { + type = "string" + description = "The URI of the artist." + format = "at-uri" + } + + ["album"] = new StringType { + type = "string" + description = "The album of the song." + } + + ["albumUri"] = new StringType { + type = "string" + description = "The URI of the album." + format = "at-uri" + } + + ["cover"] = new StringType { + type = "string" + description = "The album art URL of the song." + format = "uri" + } + + ["date"] = new StringType { + type = "string" + format = "datetime" + description = "The timestamp when the scrobble was created." + } + + ["uri"] = new StringType { + type = "string" + format = "uri" + description = "The URI of the scrobble." + } + + ["sha256"] = new StringType { + type = "string" + description = "The SHA256 hash of the scrobble data." + } + + ["listeners"] = new IntegerType { + type = "integer" + description = "The number of listeners" + } + + ["scrobbles"] = new IntegerType { + type = "integer" + description = "The number of scrobbles for this song" + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/scrobble/getScrobble.pkl b/apps/api/pkl/defs/scrobble/getScrobble.pkl new file mode 100644 index 00000000..ef111fcf --- /dev/null +++ b/apps/api/pkl/defs/scrobble/getScrobble.pkl @@ -0,0 +1,25 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.scrobble.getScrobble" +defs = new Mapping { + ["main"] { + type = "query" + description = "Get a scrobble by its unique identifier" + parameters = new Params { + required = List("uri") + properties { + ["uri"] = new StringType { + description = "The unique identifier of the scrobble" + format = "at-uri" + } + } + } + output { + encoding = "application/json" + schema = new Ref { + ref = "app.rocksky.scrobble.defs#scrobbleViewDetailed" + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/scrobble/getScrobbles.pkl b/apps/api/pkl/defs/scrobble/getScrobbles.pkl new file mode 100644 index 00000000..87c84bf4 --- /dev/null +++ b/apps/api/pkl/defs/scrobble/getScrobbles.pkl @@ -0,0 +1,42 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.scrobble.getScrobbles" +defs = new Mapping { + ["main"] { + type = "query" + description = "Get scrobbles all scrobbles" + parameters = new Params { + properties { + ["did"] = new StringType { + description = "The DID or handle of the actor" + format = "at-identifier" + } + ["limit"] = new IntegerType { + type = "integer" + description = "The maximum number of scrobbles to return" + minimum = 1 + } + ["offset"] = new IntegerType { + type = "integer" + description = "The offset for pagination" + minimum = 0 + } + } + } + output { + encoding = "application/json" + schema = new ObjectType { + type = "object" + properties = new Mapping { + ["scrobbles"] = new Array { + type = "array" + items = new Ref { + ref = "app.rocksky.scrobble.defs#scrobbleViewBasic" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/scrobble/scrobble.pkl b/apps/api/pkl/defs/scrobble/scrobble.pkl new file mode 100644 index 00000000..03c3b079 --- /dev/null +++ b/apps/api/pkl/defs/scrobble/scrobble.pkl @@ -0,0 +1,161 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.scrobble" +defs = new Mapping { + ["main"] { + type = "record" + key = "tid" + description = "A declaration of a scrobble." + `record` { + type = "object" + required = List("title", "artist", "album", "albumArtist", "duration", "createdAt") + properties { + ["title"] = new StringType { + type = "string" + description = "The title of the song." + minLength = 1 + maxLength = 512 + } + + ["artist"] = new StringType { + type = "string" + description = "The artist of the song." + minLength = 1 + maxLength = 256 + } + + ["albumArtist"] = new StringType { + type = "string" + description = "The album artist of the song." + minLength = 1 + maxLength = 256 + } + + ["album"] = new StringType { + type = "string" + description = "The album of the song." + minLength = 1 + maxLength = 256 + } + + ["duration"] = new IntegerType { + type = "integer" + description = "The duration of the song in seconds." + minimum = 1 + } + + ["trackNumber"] = new IntegerType { + type = "integer" + description = "The track number of the song in the album." + minimum = 1 + } + + ["discNumber"] = new IntegerType { + type = "integer" + description = "The disc number of the song in the album." + minimum = 1 + } + + ["releaseDate"] = new StringType { + type = "string" + description = "The release date of the song." + format = "datetime" + } + + ["year"] = new IntegerType { + type = "integer" + description = "The year the song was released." + } + + ["genre"] = new StringType { + type = "string" + description = "The genre of the song." + maxLength = 256 + } + + ["tags"] = new Array { + type = "array" + description = "The tags of the song." + items = new StringType { + type = "string" + minLength = 1 + maxLength = 256 + } + } + + ["composer"] = new StringType { + type = "string" + description = "The composer of the song." + maxLength = 256 + } + + ["lyrics"] = new StringType { + type = "string" + description = "The lyrics of the song." + maxLength = 10000 + } + + ["copyrightMessage"] = new StringType { + type = "string" + description = "The copyright message of the song." + maxLength = 256 + } + + ["wiki"] = new StringType { + type = "string" + description = "Informations about the song" + maxLength = 10000 + } + + ["albumArt"] = new Blob { + type = "blob" + description = "The album art of the song." + accept = List("image/png", "image/jpeg") + maxSize = 2000000 + } + + ["youtubeLink"] = new StringType { + type = "string" + description = "The YouTube link of the song." + format = "uri" + } + + ["spotifyLink"] = new StringType { + type = "string" + description = "The Spotify link of the song." + format = "uri" + } + + ["tidalLink"] = new StringType { + type = "string" + description = "The Tidal link of the song." + format = "uri" + } + + ["appleMusicLink"] = new StringType { + type = "string" + description = "The Apple Music link of the song." + format = "uri" + } + + ["createdAt"] = new StringType { + type = "string" + description = "The date when the song was created." + format = "datetime" + } + + ["mbid"] = new StringType { + type = "string" + description = "The MusicBrainz ID of the song." + } + + ["label"] = new StringType { + type = "string" + description = "The label of the song." + maxLength = 256 + } + } + } + } +} diff --git a/apps/api/pkl/defs/shout/createShout.pkl b/apps/api/pkl/defs/shout/createShout.pkl new file mode 100644 index 00000000..84b4783c --- /dev/null +++ b/apps/api/pkl/defs/shout/createShout.pkl @@ -0,0 +1,30 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.shout.createShout" +defs = new Mapping { + ["main"] { + type = "procedure" + description = "Create a new shout" + input { + encoding = "application/json" + schema { + type = "object" + properties { + ["message"] = new StringType { + type = "string" + description = "The content of the shout" + minLength = 1 + } + } + } + } + output { + encoding = "application/json" + schema = new Ref { + type = "ref" + ref = "app.rocksky.shout.defs#shoutView" + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/shout/defs.pkl b/apps/api/pkl/defs/shout/defs.pkl new file mode 100644 index 00000000..233fca57 --- /dev/null +++ b/apps/api/pkl/defs/shout/defs.pkl @@ -0,0 +1,69 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.shout.defs" +defs = new Mapping { + ["author"] { + type = "object" + properties { + ["id"] = new StringType { + type = "string" + description = "The unique identifier of the author." + } + + ["did"] = new StringType { + type = "string" + format = "at-identifier" + description = "The decentralized identifier (DID) of the author." + } + + ["handle"] = new StringType { + type = "string" + format = "at-identifier" + description = "The handle of the author." + } + + ["displayName"] = new StringType { + type = "string" + description = "The display name of the author." + } + + ["avatar"] = new StringType { + type = "string" + format = "uri" + description = "The URL of the author's avatar image." + } + } + } + ["shoutView"] { + type = "object" + properties { + ["id"] = new StringType { + type = "string" + description = "The unique identifier of the shout." + } + + ["message"] = new StringType { + type = "string" + description = "The content of the shout." + } + + ["parent"] = new StringType { + type = "string" + description = "The ID of the parent shout if this is a reply, otherwise null." + } + + ["createdAt"] = new StringType { + type = "string" + format = "datetime" + description = "The date and time when the shout was created." + } + + ["author"] = new Ref { + type = "ref" + description = "The author of the shout." + ref = "app.rocksky.shout.defs#author" + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/shout/getAlbumShouts.pkl b/apps/api/pkl/defs/shout/getAlbumShouts.pkl new file mode 100644 index 00000000..9fec04c2 --- /dev/null +++ b/apps/api/pkl/defs/shout/getAlbumShouts.pkl @@ -0,0 +1,41 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.shout.getAlbumShouts" +defs = new Mapping { + ["main"] { + type = "query" + description = "Get shouts for an album" + parameters = new Params { + required = List("uri") + properties { + ["uri"] = new StringType { + description = "The unique identifier of the album to retrieve shouts for" + format = "at-uri" + } + ["limit"] = new IntegerType { + description = "The maximum number of shouts to return" + minimum = 1 + } + ["offset"] = new IntegerType { + description = "The number of shouts to skip before starting to collect the result set" + minimum = 0 + } + } + } + output { + encoding = "application/json" + schema = new ObjectType { + type = "object" + properties = new Mapping { + ["shouts"] = new Array { + type = "array" + items = new Ref { + ref = "app.rocksky.shout.defs#shoutViewBasic" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/shout/getArtistShouts.pkl b/apps/api/pkl/defs/shout/getArtistShouts.pkl new file mode 100644 index 00000000..7778b56e --- /dev/null +++ b/apps/api/pkl/defs/shout/getArtistShouts.pkl @@ -0,0 +1,41 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.shout.getArtistShouts" +defs = new Mapping { + ["main"] { + type = "query" + description = "Get shouts for an artist" + parameters = new Params { + required = List("uri") + properties { + ["uri"] = new StringType { + description = "The URI of the artist to retrieve shouts for" + format = "at-uri" + } + ["limit"] = new IntegerType { + description = "The maximum number of shouts to return" + minimum = 1 + } + ["offset"] = new IntegerType { + description = "The number of shouts to skip before starting to collect the result set" + minimum = 0 + } + } + } + output { + encoding = "application/json" + schema = new ObjectType { + type = "object" + properties = new Mapping { + ["shouts"] = new Array { + type = "array" + items = new Ref { + ref = "app.rocksky.shout.defs#shoutViewBasic" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/shout/getProfileShouts.pkl b/apps/api/pkl/defs/shout/getProfileShouts.pkl new file mode 100644 index 00000000..45b087f7 --- /dev/null +++ b/apps/api/pkl/defs/shout/getProfileShouts.pkl @@ -0,0 +1,41 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.shout.getProfileShouts" +defs = new Mapping { + ["main"] { + type = "query" + description = "Get the shouts of an actor's profile" + parameters = new Params { + required = List("did") + properties { + ["did"] = new StringType { + description = "The DID or handle of the actor" + format = "at-identifier" + } + ["offset"] = new IntegerType { + description = "The offset for pagination" + minimum = 0 + } + ["limit"] = new IntegerType { + description = "The maximum number of shouts to return" + minimum = 1 + } + } + } + output { + encoding = "application/json" + schema = new ObjectType { + type = "object" + properties = new Mapping { + ["shouts"] = new Array { + type = "array" + items = new Ref { + ref = "app.rocksky.shout.defs#shoutViewBasic" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/shout/getShoutReplies.pkl b/apps/api/pkl/defs/shout/getShoutReplies.pkl new file mode 100644 index 00000000..0778615a --- /dev/null +++ b/apps/api/pkl/defs/shout/getShoutReplies.pkl @@ -0,0 +1,41 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.shout.getShoutReplies" +defs = new Mapping { + ["main"] { + type = "query" + description = "Get replies to a shout" + parameters = new Params { + required = List("uri") + properties { + ["uri"] = new StringType { + description = "The URI of the shout to retrieve replies for" + format = "at-uri" + } + ["limit"] = new IntegerType { + description = "The maximum number of shouts to return" + minimum = 1 + } + ["offset"] = new IntegerType { + description = "The number of shouts to skip before starting to collect the result set" + minimum = 0 + } + } + } + output { + encoding = "application/json" + schema = new ObjectType { + type = "object" + properties = new Mapping { + ["shouts"] = new Array { + type = "array" + items = new Ref { + ref = "app.rocksky.shout.defs#shoutViewBasic" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/shout/getTrackShouts.pkl b/apps/api/pkl/defs/shout/getTrackShouts.pkl new file mode 100644 index 00000000..97e66001 --- /dev/null +++ b/apps/api/pkl/defs/shout/getTrackShouts.pkl @@ -0,0 +1,33 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.shout.getTrackShouts" +defs = new Mapping { + ["main"] { + type = "query" + description = "Get all shouts for a specific track" + parameters = new Params { + required = List("uri") + properties { + ["uri"] = new StringType { + description = "The URI of the track to retrieve shouts for" + format = "at-uri" + } + } + } + output { + encoding = "application/json" + schema = new ObjectType { + type = "object" + properties = new Mapping { + ["shouts"] = new Array { + type = "array" + items = new Ref { + ref = "app.rocksky.shout.defs#shoutViewBasic" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/shout/removeShout.pkl b/apps/api/pkl/defs/shout/removeShout.pkl new file mode 100644 index 00000000..17a6aaa2 --- /dev/null +++ b/apps/api/pkl/defs/shout/removeShout.pkl @@ -0,0 +1,27 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.shout.removeShout" +defs = new Mapping { + ["main"] { + type = "procedure" + description = "Remove a shout by its ID" + parameters { + type = "params" + required = List("id") + properties = new Mapping { + ["id"] { + type = "string" + description = "The ID of the shout to be removed" + } + } + } + output { + encoding = "application/json" + schema = new Ref { + type = "ref" + ref = "app.rocksky.shout.defs#shoutView" + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/shout/replyShout.pkl b/apps/api/pkl/defs/shout/replyShout.pkl new file mode 100644 index 00000000..f4d84ac1 --- /dev/null +++ b/apps/api/pkl/defs/shout/replyShout.pkl @@ -0,0 +1,35 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.shout.replyShout" +defs = new Mapping { + ["main"] { + type = "procedure" + description = "Reply to a shout" + input { + encoding = "application/json" + schema = new ObjectType { + type = "object" + required = List("shoutId", "message") + properties { + ["shoutId"] = new StringType { + type = "string" + description = "The unique identifier of the shout to reply to" + } + ["message"] = new StringType { + type = "string" + description = "The content of the reply" + minLength = 1 + } + } + } + } + output { + encoding = "application/json" + schema = new Ref { + type = "ref" + ref = "app.rocksky.shout.defs#shoutView" + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/shout/reportShout.pkl b/apps/api/pkl/defs/shout/reportShout.pkl new file mode 100644 index 00000000..5d241653 --- /dev/null +++ b/apps/api/pkl/defs/shout/reportShout.pkl @@ -0,0 +1,35 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.shout.reportShout" +defs = new Mapping { + ["main"] { + type = "procedure" + description = "Report a shout for moderation" + input { + encoding = "application/json" + schema = new ObjectType { + type = "object" + required = List("shoutId") + properties { + ["shoutId"] = new StringType { + type = "string" + description = "The unique identifier of the shout to report" + } + ["reason"] = new StringType { + type = "string" + description = "The reason for reporting the shout" + minLength = 1 + } + } + } + } + output { + encoding = "application/json" + schema = new Ref { + type = "ref" + ref = "app.rocksky.shout.defs#shoutView" + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/shout/shout.pkl b/apps/api/pkl/defs/shout/shout.pkl new file mode 100644 index 00000000..8561a428 --- /dev/null +++ b/apps/api/pkl/defs/shout/shout.pkl @@ -0,0 +1,39 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.shout" +defs = new Mapping { + ["main"] { + type = "record" + key = "tid" + description = "A declaration of a shout." + `record` { + type = "object" + required = List("message", "createdAt", "subject") + properties { + ["message"] = new StringType { + type = "string" + description = "The message of the shout." + minLength = 1 + maxLength = 1000 + } + + ["createdAt"] = new StringType { + type = "string" + description = "The date when the shout was created." + format = "datetime" + } + + ["parent"] = new Ref { + type = "ref" + ref = "com.atproto.repo.strongRef" + } + + ["subject"] = new Ref { + type = "ref" + ref = "com.atproto.repo.strongRef" + } + } + } + } +} diff --git a/apps/api/pkl/defs/song/createSong.pkl b/apps/api/pkl/defs/song/createSong.pkl new file mode 100644 index 00000000..ea85b1f9 --- /dev/null +++ b/apps/api/pkl/defs/song/createSong.pkl @@ -0,0 +1,75 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.song.createSong" +defs = new Mapping { + ["main"] { + type = "procedure" + description = "Create a new song" + input { + encoding = "application/json" + schema { + type = "object" + required = List("title", "artist", "album", "albumArtist") + properties { + ["title"] = new StringType { + type = "string" + description = "The title of the song" + } + ["artist"] = new StringType { + type = "string" + description = "The artist of the song" + } + ["albumArtist"] = new StringType { + type = "string" + description = "The album artist of the song, if different from the main artist" + } + ["album"] = new StringType { + type = "string" + description = "The album of the song, if applicable" + } + ["duration"] = new IntegerType { + type = "integer" + description = "The duration of the song in seconds" + } + ["mbId"] = new StringType { + type = "string" + description = "The MusicBrainz ID of the song, if available" + } + ["albumArt"] = new StringType { + type = "string" + description = "The URL of the album art for the song" + format = "uri" + } + ["trackNumber"] = new IntegerType { + type = "integer" + description = "The track number of the song in the album, if applicable" + } + ["releaseDate"] = new StringType { + type = "string" + description = "The release date of the song, formatted as YYYY-MM-DD" + } + ["year"] = new IntegerType { + type = "integer" + description = "The year the song was released" + } + ["discNumber"] = new IntegerType { + type = "integer" + description = "The disc number of the song in the album, if applicable" + } + ["lyrics"] = new StringType { + type = "string" + description = "The lyrics of the song, if available" + } + } + } + } + output { + encoding = "application/json" + schema = new Ref { + type = "ref" + ref = "app.rocksky.song.defs#songViewDetailed" + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/song/defs.pkl b/apps/api/pkl/defs/song/defs.pkl new file mode 100644 index 00000000..48374587 --- /dev/null +++ b/apps/api/pkl/defs/song/defs.pkl @@ -0,0 +1,158 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.song.defs" +defs = new Mapping { + ["songViewBasic"] { + type = "object" + properties { + ["id"] = new StringType { + type = "string" + description = "The unique identifier of the song." + } + ["title"] = new StringType { + type = "string" + description = "The title of the song." + } + ["artist"] = new StringType { + type = "string" + description = "The artist of the song." + } + ["albumArtist"] = new StringType { + type = "string" + description = "The artist of the album the song belongs to." + } + ["albumArt"] = new StringType { + type = "string" + format = "uri" + description = "The URL of the album art image." + } + ["uri"] = new StringType { + type = "string" + format = "at-uri" + description = "The URI of the song." + } + ["album"] = new StringType { + type = "string" + description = "The album of the song." + } + ["duration"] = new IntegerType { + type = "integer" + description = "The duration of the song in milliseconds." + } + ["trackNumber"] = new IntegerType { + type = "integer" + description = "The track number of the song in the album." + } + ["discNumber"] = new IntegerType { + type = "integer" + description = "The disc number of the song in the album." + } + ["playCount"] = new IntegerType { + type = "integer" + description = "The number of times the song has been played." + minimum = 0 + } + ["uniqueListeners"] = new IntegerType { + type = "integer" + description = "The number of unique listeners who have played the song." + minimum = 0 + } + ["albumUri"] = new StringType { + type = "string" + format = "at-uri" + description = "The URI of the album the song belongs to." + } + ["artistUri"] = new StringType { + type = "string" + format = "at-uri" + description = "The URI of the artist of the song." + } + ["sha256"] = new StringType { + type = "string" + description = "The SHA256 hash of the song." + } + ["createdAt"] = new StringType { + type = "string" + format = "datetime" + description = "The timestamp when the song was created." + } + } + } + ["songViewDetailed"] { + type = "object" + properties { + ["id"] = new StringType { + type = "string" + description = "The unique identifier of the song." + } + ["title"] = new StringType { + type = "string" + description = "The title of the song." + } + ["artist"] = new StringType { + type = "string" + description = "The artist of the song." + } + ["albumArtist"] = new StringType { + type = "string" + description = "The artist of the album the song belongs to." + } + ["albumArt"] = new StringType { + type = "string" + format = "uri" + description = "The URL of the album art image." + } + ["uri"] = new StringType { + type = "string" + format = "at-uri" + description = "The URI of the song." + } + ["album"] = new StringType { + type = "string" + description = "The album of the song." + } + ["duration"] = new IntegerType { + type = "integer" + description = "The duration of the song in milliseconds." + } + ["trackNumber"] = new IntegerType { + type = "integer" + description = "The track number of the song in the album." + } + ["discNumber"] = new IntegerType { + type = "integer" + description = "The disc number of the song in the album." + } + ["playCount"] = new IntegerType { + type = "integer" + description = "The number of times the song has been played." + minimum = 0 + } + ["uniqueListeners"] = new IntegerType { + type = "integer" + description = "The number of unique listeners who have played the song." + minimum = 0 + } + ["albumUri"] = new StringType { + type = "string" + format = "at-uri" + description = "The URI of the album the song belongs to." + } + ["artistUri"] = new StringType { + type = "string" + format = "at-uri" + description = "The URI of the artist of the song." + } + ["sha256"] = new StringType { + type = "string" + description = "The SHA256 hash of the song." + } + ["createdAt"] = new StringType { + type = "string" + format = "datetime" + description = "The timestamp when the song was created." + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/song/getSong.pkl b/apps/api/pkl/defs/song/getSong.pkl new file mode 100644 index 00000000..f1a81ca0 --- /dev/null +++ b/apps/api/pkl/defs/song/getSong.pkl @@ -0,0 +1,26 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.song.getSong" +defs = new Mapping { + ["main"] { + type = "query" + description = "Get a song by its uri" + parameters = new Params { + required = List("uri") + properties { + ["uri"] = new StringType { + description = "The unique identifier of the song to retrieve" + format = "at-uri" + } + } + } + output { + encoding = "application/json" + schema = new Ref { + type = "ref" + ref = "app.rocksky.song.defs#songViewDetailed" + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/song/getSongs.pkl b/apps/api/pkl/defs/song/getSongs.pkl new file mode 100644 index 00000000..710719b5 --- /dev/null +++ b/apps/api/pkl/defs/song/getSongs.pkl @@ -0,0 +1,38 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.song.getSongs" +defs = new Mapping { + ["main"] { + type = "query" + description = "Get songs" + parameters = new Params { + properties { + ["limit"] = new IntegerType { + type = "integer" + description = "The maximum number of songs to return" + minimum = 1 + } + ["offset"] = new IntegerType { + type = "integer" + description = "The offset for pagination" + minimum = 0 + } + } + } + output { + encoding = "application/json" + schema = new ObjectType { + type = "object" + properties = new Mapping { + ["songs"] = new Array { + type = "array" + items = new Ref { + ref = "app.rocksky.song.defs#songViewBasic" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/song/lovedSong.pkl b/apps/api/pkl/defs/song/lovedSong.pkl new file mode 100644 index 00000000..47f9e66f --- /dev/null +++ b/apps/api/pkl/defs/song/lovedSong.pkl @@ -0,0 +1,151 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.lovedSong" +defs = new Mapping { + ["main"] { + type = "record" + key = "tid" + description = "A declaration of a song." + `record` { + type = "object" + required = List("title", "artist", "album", "duration", "createdAt") + properties { + ["title"] = new StringType { + type = "string" + description = "The title of the song." + minLength = 1 + maxLength = 512 + } + + ["artist"] = new StringType { + type = "string" + description = "The artist of the song." + minLength = 1 + maxLength = 256 + } + + ["albumArtist"] = new StringType { + type = "string" + description = "The album artist of the song." + minLength = 1 + maxLength = 256 + } + + ["album"] = new StringType { + type = "string" + description = "The album of the song." + minLength = 1 + maxLength = 256 + } + + ["duration"] = new IntegerType { + type = "integer" + description = "The duration of the song in seconds." + minimum = 1 + } + + ["trackNumber"] = new IntegerType { + type = "integer" + description = "The track number of the song in the album." + minimum = 1 + } + + ["discNumber"] = new IntegerType { + type = "integer" + description = "The disc number of the song in the album." + minimum = 1 + } + + ["releaseDate"] = new StringType { + type = "string" + description = "The release date of the song." + format = "datetime" + } + + ["year"] = new IntegerType { + type = "integer" + description = "The year the song was released." + } + + ["genre"] = new StringType { + type = "string" + description = "The genre of the song." + maxLength = 256 + } + + ["tags"] = new Array { + type = "array" + description = "The tags of the song." + items = new StringType { + type = "string" + minLength = 1 + maxLength = 256 + } + } + + ["composer"] = new StringType { + type = "string" + description = "The composer of the song." + maxLength = 256 + } + + ["lyrics"] = new StringType { + type = "string" + description = "The lyrics of the song." + maxLength = 10000 + } + + ["copyrightMessage"] = new StringType { + type = "string" + description = "The copyright message of the song." + minLength = 1 + maxLength = 256 + } + + ["wiki"] = new StringType { + type = "string" + description = "Informations about the song" + maxLength = 10000 + } + + ["albumArt"] = new Blob { + type = "blob" + description = "The album art of the song." + accept = List("image/png", "image/jpeg") + maxSize = 2000000 + } + + ["youtubeLink"] = new StringType { + type = "string" + description = "The YouTube link of the song." + format = "uri" + } + + ["spotifyLink"] = new StringType { + type = "string" + description = "The Spotify link of the song." + format = "uri" + } + + ["tidalLink"] = new StringType { + type = "string" + description = "The Tidal link of the song." + format = "uri" + } + + ["appleMusicLink"] = new StringType { + type = "string" + description = "The Apple Music link of the song." + format = "uri" + } + + ["createdAt"] = new StringType { + type = "string" + description = "The date when the song was created." + format = "datetime" + } + } + } + } +} diff --git a/apps/api/pkl/defs/song/song.pkl b/apps/api/pkl/defs/song/song.pkl new file mode 100644 index 00000000..af54be4c --- /dev/null +++ b/apps/api/pkl/defs/song/song.pkl @@ -0,0 +1,162 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.song" +defs = new Mapping { + ["main"] { + type = "record" + key = "tid" + description = "A declaration of a song." + `record` { + type = "object" + required = List("title", "artist", "album", "albumArtist", "duration", "createdAt") + properties { + ["title"] = new StringType { + type = "string" + description = "The title of the song." + minLength = 1 + maxLength = 512 + } + + ["artist"] = new StringType { + type = "string" + description = "The artist of the song." + minLength = 1 + maxLength = 256 + } + + ["albumArtist"] = new StringType { + type = "string" + description = "The album artist of the song." + minLength = 1 + maxLength = 256 + } + + ["album"] = new StringType { + type = "string" + description = "The album of the song." + minLength = 1 + maxLength = 256 + } + + ["duration"] = new IntegerType { + type = "integer" + description = "The duration of the song in seconds." + minimum = 1 + } + + ["trackNumber"] = new IntegerType { + type = "integer" + description = "The track number of the song in the album." + minimum = 1 + } + + ["discNumber"] = new IntegerType { + type = "integer" + description = "The disc number of the song in the album." + minimum = 1 + } + + ["releaseDate"] = new StringType { + type = "string" + description = "The release date of the song." + format = "datetime" + } + + ["year"] = new IntegerType { + type = "integer" + description = "The year the song was released." + } + + ["genre"] = new StringType { + type = "string" + description = "The genre of the song." + minLength = 1 + maxLength = 256 + } + + ["tags"] = new Array { + type = "array" + description = "The tags of the song." + items = new StringType { + type = "string" + minLength = 1 + maxLength = 256 + } + } + + ["composer"] = new StringType { + type = "string" + description = "The composer of the song." + maxLength = 256 + } + + ["lyrics"] = new StringType { + type = "string" + description = "The lyrics of the song." + maxLength = 10000 + } + + ["copyrightMessage"] = new StringType { + type = "string" + description = "The copyright message of the song." + maxLength = 256 + } + + ["wiki"] = new StringType { + type = "string" + description = "Informations about the song" + maxLength = 10000 + } + + ["albumArt"] = new Blob { + type = "blob" + description = "The album art of the song." + accept = List("image/png", "image/jpeg") + maxSize = 2000000 + } + + ["youtubeLink"] = new StringType { + type = "string" + description = "The YouTube link of the song." + format = "uri" + } + + ["spotifyLink"] = new StringType { + type = "string" + description = "The Spotify link of the song." + format = "uri" + } + + ["tidalLink"] = new StringType { + type = "string" + description = "The Tidal link of the song." + format = "uri" + } + + ["appleMusicLink"] = new StringType { + type = "string" + description = "The Apple Music link of the song." + format = "uri" + } + + ["createdAt"] = new StringType { + type = "string" + description = "The date when the song was created." + format = "datetime" + } + + ["mbid"] = new StringType { + type = "string" + description = "The MusicBrainz ID of the song." + } + + ["label"] = new StringType { + type = "string" + description = "The label of the song." + maxLength = 256 + } + } + } + } +} diff --git a/apps/api/pkl/defs/spotify/defs.pkl b/apps/api/pkl/defs/spotify/defs.pkl new file mode 100644 index 00000000..16ad0c05 --- /dev/null +++ b/apps/api/pkl/defs/spotify/defs.pkl @@ -0,0 +1,35 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.spotify.defs" +defs = new Mapping { + ["spotifyTrackView"] { + type = "object" + properties { + ["id"] = new StringType { + type = "string" + description = "The unique identifier of the Spotify track." + } + ["name"] = new StringType { + type = "string" + description = "The name of the track." + } + ["artist"] = new StringType { + type = "string" + description = "The name of the artist." + } + ["album"] = new StringType { + type = "string" + description = "The name of the album." + } + ["duration"] = new IntegerType { + type = "integer" + description = "The duration of the track in milliseconds." + } + ["previewUrl"] = new StringType { + type = "string" + description = "A URL to a preview of the track." + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/spotify/getCurrentlyPlaying.pkl b/apps/api/pkl/defs/spotify/getCurrentlyPlaying.pkl new file mode 100644 index 00000000..2b8aaa3b --- /dev/null +++ b/apps/api/pkl/defs/spotify/getCurrentlyPlaying.pkl @@ -0,0 +1,27 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.spotify.getCurrentlyPlaying" +defs = new Mapping { + ["main"] { + type = "query" + description = "Get the currently playing track" + parameters { + type = "params" + properties { + ["actor"] = new StringType { + type = "string" + format = "at-identifier" + description = "Handle or DID of the actor to retrieve the currently playing track for. If not provided, defaults to the current user." + } + } + } + output { + encoding = "application/json" + schema = new Ref { + type = "ref" + ref = "app.rocksky.player.defs#currentlyPlayingViewDetailed" + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/spotify/next.pkl b/apps/api/pkl/defs/spotify/next.pkl new file mode 100644 index 00000000..8faeaa61 --- /dev/null +++ b/apps/api/pkl/defs/spotify/next.pkl @@ -0,0 +1,10 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.spotify.next" +defs = new Mapping { + ["main"] { + type = "procedure" + description = "Play the next track in the queue" + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/spotify/pause.pkl b/apps/api/pkl/defs/spotify/pause.pkl new file mode 100644 index 00000000..a046f23e --- /dev/null +++ b/apps/api/pkl/defs/spotify/pause.pkl @@ -0,0 +1,10 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.spotify.pause" +defs = new Mapping { + ["main"] { + type = "procedure" + description = "Pause the currently playing track" + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/spotify/play.pkl b/apps/api/pkl/defs/spotify/play.pkl new file mode 100644 index 00000000..011a9134 --- /dev/null +++ b/apps/api/pkl/defs/spotify/play.pkl @@ -0,0 +1,10 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.spotify.play" +defs = new Mapping { + ["main"] { + type = "procedure" + description = "Resume playback of the currently paused track" + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/spotify/previous.pkl b/apps/api/pkl/defs/spotify/previous.pkl new file mode 100644 index 00000000..ab45ba1e --- /dev/null +++ b/apps/api/pkl/defs/spotify/previous.pkl @@ -0,0 +1,10 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.spotify.previous" +defs = new Mapping { + ["main"] { + type = "procedure" + description = "Play the previous track in the queue" + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/spotify/seek.pkl b/apps/api/pkl/defs/spotify/seek.pkl new file mode 100644 index 00000000..c4e1de27 --- /dev/null +++ b/apps/api/pkl/defs/spotify/seek.pkl @@ -0,0 +1,20 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.spotify.seek" +defs = new Mapping { + ["main"] { + type = "procedure" + description = "Seek to a specific position in the currently playing track" + parameters { + type = "params" + required = List("position") + properties = new Mapping { + ["position"] { + type = "integer" + description = "The position in seconds to seek to" + } + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/stats/defs.pkl b/apps/api/pkl/defs/stats/defs.pkl new file mode 100644 index 00000000..052e7f41 --- /dev/null +++ b/apps/api/pkl/defs/stats/defs.pkl @@ -0,0 +1,31 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.stats.defs" +defs = new Mapping { + ["statsView"] { + type = "object" + properties { + ["scrobbles"] = new IntegerType { + type = "integer" + description = "The total number of scrobbles." + } + ["artists"] = new IntegerType { + type = "integer" + description = "The total number of unique artists scrobbled." + } + ["lovedTracks"] = new IntegerType { + type = "integer" + description = "The total number of tracks marked as loved." + } + ["albums"] = new IntegerType { + type = "integer" + description = "The total number of unique albums scrobbled." + } + ["tracks"] = new IntegerType { + type = "integer" + description = "The total number of unique tracks scrobbled." + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/stats/getStats.pkl b/apps/api/pkl/defs/stats/getStats.pkl new file mode 100644 index 00000000..b4c01818 --- /dev/null +++ b/apps/api/pkl/defs/stats/getStats.pkl @@ -0,0 +1,27 @@ +amends "../../schema/lexicon.pkl" + +lexicon = 1 +id = "app.rocksky.stats.getStats" +defs = new Mapping { + ["main"] { + type = "query" + parameters { + type = "params" + required = List("did") + properties { + ["did"] = new StringType { + type = "string" + description = "The DID or handle of the user to get stats for." + format = "at-identifier" + } + } + } + output = new Output { + encoding = "application/json" + schema = new Ref { + type = "ref" + ref = "app.rocksky.stats.defs#statsView" + } + } + } +} \ No newline at end of file diff --git a/apps/api/pkl/defs/strongRef.pkl b/apps/api/pkl/defs/strongRef.pkl new file mode 100644 index 00000000..cf287ccc --- /dev/null +++ b/apps/api/pkl/defs/strongRef.pkl @@ -0,0 +1,21 @@ +amends "../schema/lexicon.pkl" + +lexicon = 1 +id = "com.atproto.repo.strongRef" +description = "A URI with a content-hash fingerprint." +defs = new Mapping { + ["main"] = new ObjectType { + type = "object" + required = List("uri", "cid") + properties { + ["uri"] = new StringType { + type = "string" + format = "at-uri" + } + ["cid"] = new StringType { + type = "string" + format = "cid" + } + } + } +} diff --git a/apps/api/pkl/schema/lexicon.pkl b/apps/api/pkl/schema/lexicon.pkl new file mode 100644 index 00000000..99700538 --- /dev/null +++ b/apps/api/pkl/schema/lexicon.pkl @@ -0,0 +1,87 @@ + +open class BaseType { + type: String + description: String? +} + +class StringType extends BaseType { + type: "string" + maxGraphemes: Int? + minLength: Int? + maxLength: Int? + format: "uri" | "datetime" | "cid" | "at-uri" | "at-identifier" | Null = null +} + +class IntegerType extends BaseType { + type: "integer" + minimum: Int? +} + +class Blob extends BaseType { + type: "blob" + accept: List + maxSize: Int +} + +class Array extends BaseType { + type: "array" + items: StringType | IntegerType | Blob | Ref | Union +} + +class Params { + type: "params" + required: List? + properties: Mapping +} + +class ObjectType extends BaseType { + type: "object" + required: List? + properties: Mapping +} + +class Union extends BaseType { + type: "union" + refs: List +} + +class Ref extends BaseType { + type: "ref" + ref: String +} + +class Input { + encoding: "application/json" + schema: ObjectType +} + +class Output { + encoding: "application/json" | "application/octet-stream" + schema: ObjectType | Ref | Array | Null = null +} + +class Query extends BaseType { + type: "query" + parameters: Params + output: Output +} + +class Procedure extends BaseType { + type: "procedure" + parameters: Params? + input: Input? + output: Output? +} + +class Record extends BaseType { + type: "record" + key: String + `record`: ObjectType +} + +lexicon: Int = 1 +id: String +description: String? +defs: Mapping | Mapping | Mapping | Mapping | Mapping | Mapping | Null = null + + diff --git a/apps/api/scripts/pkl.ts b/apps/api/scripts/pkl.ts new file mode 100644 index 00000000..082d4ad6 --- /dev/null +++ b/apps/api/scripts/pkl.ts @@ -0,0 +1,34 @@ +import chalk from "chalk"; +import { readdirSync, statSync } from "fs"; +import { join } from "path"; +import { $ } from "zx"; + +function getPklFilesRecursive(dir: string): string[] { + const entries = readdirSync(dir); + const files: string[] = []; + + for (const entry of entries) { + const fullPath = join(dir, entry); + const stats = statSync(fullPath); + + if (stats.isDirectory()) { + files.push(...getPklFilesRecursive(fullPath)); + continue; + } + + if (entry.endsWith(".pkl")) { + files.push(fullPath); + } + } + + return files; +} + +const files = await getPklFilesRecursive(join("pkl", "defs")); + +await Promise.all( + files.map(async (fullPath) => { + console.log(`pkl eval ${chalk.cyan(fullPath)}`); + await $`pkl eval -f json ${fullPath} > ${fullPath.replace(/\.pkl$/, ".json").replace(/pkl[\\\/]defs/g, "lexicons")}`; + }) +); diff --git a/apps/api/src/apikeys/app.ts b/apps/api/src/apikeys/app.ts new file mode 100644 index 00000000..c5377754 --- /dev/null +++ b/apps/api/src/apikeys/app.ts @@ -0,0 +1,160 @@ +import { equals } from "@xata.io/client"; +import { ctx } from "context"; +import { and, eq } from "drizzle-orm"; +import { Hono } from "hono"; +import jwt from "jsonwebtoken"; +import { env } from "lib/env"; +import crypto from "node:crypto"; +import * as R from "ramda"; +import tables from "schema"; +import { apiKeySchema } from "types/apikey"; + +const app = new Hono(); + +app.get("/", async (c) => { + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + if (!bearer || bearer === "null") { + c.status(401); + return c.text("Unauthorized"); + } + + const { did } = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + + const user = await ctx.client.db.users.filter("did", equals(did)).getFirst(); + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const size = +c.req.query("size") || 20; + const offset = +c.req.query("offset") || 0; + + const apikeys = await ctx.db + .select() + .from(tables.apiKeys) + .where(eq(tables.apiKeys.userId, user.xata_id)) + .limit(size) + .offset(offset) + .execute(); + + return c.json(apikeys.map((x) => R.omit(["userId"])(x))); +}); + +app.post("/", async (c) => { + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + if (!bearer || bearer === "null") { + c.status(401); + return c.text("Unauthorized"); + } + + const { did } = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + + const user = await ctx.client.db.users.filter("did", equals(did)).getFirst(); + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const body = await c.req.json(); + const parsed = apiKeySchema.safeParse(body); + + if (parsed.error) { + c.status(400); + return c.text("Invalid api key data: " + parsed.error.message); + } + const newApiKey = parsed.data; + + const api_key = crypto.randomBytes(16).toString("hex"); + const shared_secret = crypto.randomBytes(16).toString("hex"); + + const record = await ctx.client.db.api_keys.create({ + ...newApiKey, + api_key, + shared_secret, + user_id: user.xata_id, + }); + + return c.json({ + id: record.xata_id, + name: record.name, + description: record.description, + api_key: record.api_key, + shared_secret: record.shared_secret, + }); +}); + +app.put("/:id", async (c) => { + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + if (!bearer || bearer === "null") { + c.status(401); + return c.text("Unauthorized"); + } + + const { did } = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + + const user = await ctx.client.db.users.filter("did", equals(did)).getFirst(); + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const data = await c.req.json(); + const id = c.req.param("id"); + + const record = await ctx.db + .update(tables.apiKeys) + .set(data) + .where( + and(eq(tables.apiKeys.id, id), eq(tables.apiKeys.userId, user.xata_id)) + ) + .execute(); + + return c.json({ + id: record.xata_id, + name: record.name, + description: record.description, + api_key: record.api_key, + shared_secret: record.shared_secret, + }); +}); + +app.delete("/:id", async (c) => { + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + if (!bearer || bearer === "null") { + c.status(401); + return c.text("Unauthorized"); + } + + const { did } = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + + const user = await ctx.client.db.users.filter("did", equals(did)).getFirst(); + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const id = c.req.param("id"); + + await ctx.db + .delete(tables.apiKeys) + .where( + and(eq(tables.apiKeys.id, id), eq(tables.apiKeys.userId, user.xata_id)) + ) + .execute(); + + return c.json({ success: true }); +}); + +export default app; diff --git a/apps/api/src/auth/client.ts b/apps/api/src/auth/client.ts new file mode 100644 index 00000000..efb05533 --- /dev/null +++ b/apps/api/src/auth/client.ts @@ -0,0 +1,44 @@ +import { JoseKey } from "@atproto/jwk-jose"; +import { NodeOAuthClient } from "@atproto/oauth-client-node"; +import type { Database } from "../db"; +import { env } from "../lib/env"; +import { SessionStore, StateStore } from "./storage"; + +export const createClient = async (db: Database) => { + const publicUrl = env.PUBLIC_URL; + const url = publicUrl || `http://127.0.0.1:${env.PORT}`; + const enc = encodeURIComponent; + return new NodeOAuthClient({ + clientMetadata: { + client_name: "AT Protocol Express App", + client_id: publicUrl + ? `${url}/client-metadata.json` + : `http://localhost?redirect_uri=${enc( + `${url}/oauth/callback` + )}&scope=${enc("atproto transition:generic")}`, + client_uri: url, + redirect_uris: [`${url}/oauth/callback`], + scope: "atproto transition:generic", + grant_types: ["authorization_code", "refresh_token"], + response_types: ["code"], + application_type: "web", + token_endpoint_auth_method: url.startsWith("https") + ? "private_key_jwt" + : "none", + token_endpoint_auth_signing_alg: url.startsWith("https") + ? "ES256" + : undefined, + dpop_bound_access_tokens: true, + jwks_uri: url.startsWith("https") ? `${url}/jwks.json` : undefined, + }, + keyset: url.startsWith("https") + ? await Promise.all([ + JoseKey.fromImportable(env.PRIVATE_KEY_1), + JoseKey.fromImportable(env.PRIVATE_KEY_2), + JoseKey.fromImportable(env.PRIVATE_KEY_3), + ]) + : undefined, + stateStore: new StateStore(db), + sessionStore: new SessionStore(db), + }); +}; diff --git a/apps/api/src/auth/storage.ts b/apps/api/src/auth/storage.ts new file mode 100644 index 00000000..758bd0dc --- /dev/null +++ b/apps/api/src/auth/storage.ts @@ -0,0 +1,55 @@ +import type { + NodeSavedSession, + NodeSavedSessionStore, + NodeSavedState, + NodeSavedStateStore, +} from "@atproto/oauth-client-node"; +import type { Database } from "../db"; + +export class StateStore implements NodeSavedStateStore { + constructor(private db: Database) {} + async get(key: string): Promise { + const result = await this.db + .selectFrom("auth_state") + .selectAll() + .where("key", "=", key) + .executeTakeFirst(); + if (!result) return; + return JSON.parse(result.state) as NodeSavedState; + } + async set(key: string, val: NodeSavedState) { + const state = JSON.stringify(val); + await this.db + .insertInto("auth_state") + .values({ key, state }) + .onConflict((oc) => oc.doUpdateSet({ state })) + .execute(); + } + async del(key: string) { + // await this.db.deleteFrom("auth_state").where("key", "=", key).execute(); + } +} + +export class SessionStore implements NodeSavedSessionStore { + constructor(private db: Database) {} + async get(key: string): Promise { + const result = await this.db + .selectFrom("auth_session") + .selectAll() + .where("key", "=", key) + .executeTakeFirst(); + if (!result) return; + return JSON.parse(result.session) as NodeSavedSession; + } + async set(key: string, val: NodeSavedSession) { + const session = JSON.stringify(val); + await this.db + .insertInto("auth_session") + .values({ key, session }) + .onConflict((oc) => oc.doUpdateSet({ session })) + .execute(); + } + async del(key: string) { + // await this.db.deleteFrom("auth_session").where("key", "=", key).execute(); + } +} diff --git a/apps/api/src/bsky/app.ts b/apps/api/src/bsky/app.ts new file mode 100644 index 00000000..772b9dc5 --- /dev/null +++ b/apps/api/src/bsky/app.ts @@ -0,0 +1,231 @@ +import { BlobRef } from "@atproto/lexicon"; +import { isValidHandle } from "@atproto/syntax"; +import { equals } from "@xata.io/client"; +import { ctx } from "context"; +import { desc, eq } from "drizzle-orm"; +import { Hono } from "hono"; +import jwt from "jsonwebtoken"; +import * as Profile from "lexicon/types/app/bsky/actor/profile"; +import { createAgent } from "lib/agent"; +import { env } from "lib/env"; +import { requestCounter } from "metrics"; +import users from "schema/users"; + +const app = new Hono(); + +app.get("/login", async (c) => { + requestCounter.add(1, { method: "GET", route: "/login" }); + const { handle, cli } = c.req.query(); + if (typeof handle !== "string" || !isValidHandle(handle)) { + c.status(400); + return c.text("Invalid handle"); + } + try { + const url = await ctx.oauthClient.authorize(handle, { + scope: "atproto transition:generic", + }); + if (cli) { + ctx.kv.set(`cli:${handle}`, "1"); + } + return c.redirect(url.toString()); + } catch (e) { + c.status(500); + return c.text(e.toString()); + } +}); + +app.post("/login", async (c) => { + requestCounter.add(1, { method: "POST", route: "/login" }); + const { handle, cli } = await c.req.json(); + if (typeof handle !== "string" || !isValidHandle(handle)) { + c.status(400); + return c.text("Invalid handle"); + } + + try { + const url = await ctx.oauthClient.authorize(handle, { + scope: "atproto transition:generic", + }); + + if (cli) { + ctx.kv.set(`cli:${handle}`, "1"); + } + + return c.text(url.toString()); + } catch (e) { + c.status(500); + return c.text(e.toString()); + } +}); + +app.get("/oauth/callback", async (c) => { + requestCounter.add(1, { method: "GET", route: "/oauth/callback" }); + const params = new URLSearchParams(c.req.url.split("?")[1]); + let did, cli; + + try { + const { session } = await ctx.oauthClient.callback(params); + did = session.did; + const handle = await ctx.resolver.resolveDidToHandle(did); + cli = ctx.kv.get(`cli:${handle}`); + ctx.kv.delete(`cli:${handle}`); + + const token = jwt.sign( + { + did, + exp: cli + ? Math.floor(Date.now() / 1000) + 60 * 60 * 24 * 365 * 1000 + : Math.floor(Date.now() / 1000) + 60 * 60 * 24 * 7, + }, + env.JWT_SECRET + ); + ctx.kv.set(did, token); + } catch (err) { + console.error({ err }, "oauth callback failed"); + return c.redirect(`${env.FRONTEND_URL}?error=1`); + } + + const spotifyUser = await ctx.client.db.spotify_accounts + .filter("user_id.did", equals(did)) + .filter("is_beta_user", equals(true)) + .getFirst(); + + if (spotifyUser?.email) { + ctx.nc.publish("rocksky.spotify.user", Buffer.from(spotifyUser.email)); + } + + if (!cli) { + return c.redirect(`${env.FRONTEND_URL}?did=${did}`); + } + + return c.redirect(`${env.FRONTEND_URL}?did=${did}&cli=${cli}`); +}); + +app.get("/profile", async (c) => { + requestCounter.add(1, { method: "GET", route: "/profile" }); + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + if (!bearer || bearer === "null") { + c.status(401); + return c.text("Unauthorized"); + } + + const { did } = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + + const agent = await createAgent(ctx.oauthClient, did); + + if (!agent) { + c.status(401); + return c.text("Unauthorized"); + } + + const { data: profileRecord } = await agent.com.atproto.repo.getRecord({ + repo: agent.assertDid, + collection: "app.bsky.actor.profile", + rkey: "self", + }); + const handle = await ctx.resolver.resolveDidToHandle(did); + const profile: { handle?: string; displayName?: string; avatar?: BlobRef } = + Profile.isRecord(profileRecord.value) && + Profile.validateRecord(profileRecord.value).success + ? { ...profileRecord.value, handle } + : {}; + + if (profile.handle) { + try { + await ctx.client.db.users.create({ + did, + handle, + display_name: profile.displayName, + avatar: `https://cdn.bsky.app/img/avatar/plain/${did}/${profile.avatar.ref.toString()}@jpeg`, + }); + } catch (e) { + if (!e.message.includes("invalid record: column [did]: is not unique")) { + console.error(e.message); + } else { + await ctx.db + .update(users) + .set({ + handle, + displayName: profile.displayName, + avatar: `https://cdn.bsky.app/img/avatar/plain/${did}/${profile.avatar.ref.toString()}@jpeg`, + }) + .where(eq(users.did, did)) + .execute(); + } + } + + const [user, lastUser, previousLastUser] = await Promise.all([ + ctx.client.db.users.select(["*"]).filter("did", equals(did)).getFirst(), + ctx.db + .select() + .from(users) + .orderBy(desc(users.createdAt)) + .limit(1) + .execute(), + ctx.kv.get("lastUser"), + ]); + + ctx.nc.publish("rocksky.user", Buffer.from(JSON.stringify(user))); + + await ctx.kv.set("lastUser", lastUser[0].id); + // if (lastUser[0].id !== previousLastUser) { + // ctx.nc.publish("rocksky.user", Buffer.from(JSON.stringify(user))); + // } + } + + const [spotifyUser, spotifyToken, googledrive, dropbox] = await Promise.all([ + ctx.client.db.spotify_accounts + .select(["user_id.*", "email", "is_beta_user"]) + .filter("user_id.did", equals(did)) + .getFirst(), + ctx.client.db.spotify_tokens.filter("user_id.did", equals(did)).getFirst(), + ctx.client.db.google_drive_accounts + .select(["user_id.*", "email", "is_beta_user"]) + .filter("user_id.did", equals(did)) + .getFirst(), + ctx.client.db.dropbox_accounts + .select(["user_id.*", "email", "is_beta_user"]) + .filter("user_id.did", equals(did)) + .getFirst(), + ]); + + return c.json({ + ...profile, + spotifyUser, + spotifyConnected: !!spotifyToken, + googledrive, + dropbox, + did, + }); +}); + +app.get("/client-metadata.json", async (c) => { + requestCounter.add(1, { method: "GET", route: "/client-metadata.json" }); + return c.json(ctx.oauthClient.clientMetadata); +}); + +app.get("/token", async (c) => { + requestCounter.add(1, { method: "GET", route: "/token" }); + const did = c.req.header("session-did"); + + if (typeof did !== "string" || !did || did === "null") { + c.status(401); + return c.text("Unauthorized"); + } + + const token = ctx.kv.get(did); + + if (!token) { + c.status(401); + return c.text("Unauthorized"); + } + + ctx.kv.delete(did); + + return c.json({ token }); +}); + +export default app; diff --git a/apps/api/src/context.ts b/apps/api/src/context.ts new file mode 100644 index 00000000..b909b345 --- /dev/null +++ b/apps/api/src/context.ts @@ -0,0 +1,44 @@ +import { createClient } from "auth/client"; +import axios from "axios"; +import { createDb, migrateToLatest } from "db"; +import drizzle from "drizzle"; +import authVerifier from "lib/authVerifier"; +import { env } from "lib/env"; +import { createBidirectionalResolver, createIdResolver } from "lib/idResolver"; +import { connect } from "nats"; +import redis from "redis"; +import sqliteKv from "sqliteKv"; +import { createStorage } from "unstorage"; +import { getXataClient } from "xata"; + +const { DB_PATH } = env; +export const db = createDb(DB_PATH); +await migrateToLatest(db); + +const kv = createStorage({ + driver: sqliteKv({ location: env.KV_DB_PATH, table: "kv" }), +}); + +const baseIdResolver = createIdResolver(kv); + +const client = getXataClient(); + +export const ctx = { + oauthClient: await createClient(db), + resolver: createBidirectionalResolver(baseIdResolver), + kv: new Map(), + client, + db: drizzle.db, + nc: await connect({ servers: env.NATS_URL }), + analytics: axios.create({ baseURL: env.ANALYTICS }), + dropbox: axios.create({ baseURL: env.DROPBOX }), + googledrive: axios.create({ baseURL: env.GOOGLE_DRIVE }), + redis: await redis.createClient({ url: env.REDIS_URL }).connect(), + meilisearch: axios.create({ + baseURL: env.MEILISEARCH_URL, + headers: { Authorization: `Bearer ${env.MEILISEARCH_API_KEY}` }, + }), + authVerifier, +}; + +export type Context = typeof ctx; diff --git a/apps/api/src/db.ts b/apps/api/src/db.ts new file mode 100644 index 00000000..c0ffeb29 --- /dev/null +++ b/apps/api/src/db.ts @@ -0,0 +1,94 @@ +import SqliteDb from "better-sqlite3"; +import { + Kysely, + Migration, + MigrationProvider, + Migrator, + SqliteDialect, +} from "kysely"; + +// Types + +export type DatabaseSchema = { + status: Status; + auth_session: AuthSession; + auth_state: AuthState; +}; + +export type Status = { + uri: string; + authorDid: string; + status: string; + createdAt: string; + indexedAt: string; +}; + +export type AuthSession = { + key: string; + session: AuthSessionJson; +}; + +export type AuthState = { + key: string; + state: AuthStateJson; +}; + +type AuthStateJson = string; + +type AuthSessionJson = string; + +// Migrations + +const migrations: Record = {}; + +const migrationProvider: MigrationProvider = { + async getMigrations() { + return migrations; + }, +}; + +migrations["001"] = { + async up(db: Kysely) { + await db.schema + .createTable("status") + .addColumn("uri", "varchar", (col) => col.primaryKey()) + .addColumn("authorDid", "varchar", (col) => col.notNull()) + .addColumn("status", "varchar", (col) => col.notNull()) + .addColumn("createdAt", "varchar", (col) => col.notNull()) + .addColumn("indexedAt", "varchar", (col) => col.notNull()) + .execute(); + await db.schema + .createTable("auth_session") + .addColumn("key", "varchar", (col) => col.primaryKey()) + .addColumn("session", "varchar", (col) => col.notNull()) + .execute(); + await db.schema + .createTable("auth_state") + .addColumn("key", "varchar", (col) => col.primaryKey()) + .addColumn("state", "varchar", (col) => col.notNull()) + .execute(); + }, + async down(db: Kysely) { + await db.schema.dropTable("auth_state").execute(); + await db.schema.dropTable("auth_session").execute(); + await db.schema.dropTable("status").execute(); + }, +}; + +// APIs + +export const createDb = (location: string): Database => { + return new Kysely({ + dialect: new SqliteDialect({ + database: new SqliteDb(location), + }), + }); +}; + +export const migrateToLatest = async (db: Database) => { + const migrator = new Migrator({ db, provider: migrationProvider }); + const { error } = await migrator.migrateToLatest(); + if (error) throw error; +}; + +export type Database = Kysely; diff --git a/apps/api/src/drizzle.ts b/apps/api/src/drizzle.ts new file mode 100644 index 00000000..fc3ef9e4 --- /dev/null +++ b/apps/api/src/drizzle.ts @@ -0,0 +1,8 @@ +import { drizzle } from "drizzle-orm/node-postgres"; +import { env } from "lib/env"; +import pg from "pg"; + +const pool = new pg.Pool({ connectionString: env.XATA_POSTGRES_URL, max: 20 }); +const db = drizzle(pool); + +export default { db }; diff --git a/apps/api/src/dropbox/app.ts b/apps/api/src/dropbox/app.ts new file mode 100644 index 00000000..376f65b8 --- /dev/null +++ b/apps/api/src/dropbox/app.ts @@ -0,0 +1,320 @@ +import { equals } from "@xata.io/client"; +import axios from "axios"; +import { ctx } from "context"; +import { Hono } from "hono"; +import jwt from "jsonwebtoken"; +import { encrypt } from "lib/crypto"; +import { env } from "lib/env"; +import { requestCounter } from "metrics"; +import { emailSchema } from "types/email"; + +const app = new Hono(); + +app.get("/login", async (c) => { + requestCounter.add(1, { method: "GET", route: "/dropbox/login" }); + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + if (!bearer || bearer === "null") { + c.status(401); + return c.text("Unauthorized"); + } + + const { did } = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + + const user = await ctx.client.db.users.filter("did", equals(did)).getFirst(); + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const clientId = env.DROPBOX_CLIENT_ID; + const redirectUri = `https://www.dropbox.com/oauth2/authorize?client_id=${clientId}&redirect_uri=${env.DROPBOX_REDIRECT_URI}&response_type=code&token_access_type=offline&state=${user.xata_id}`; + return c.json({ redirectUri }); +}); + +app.get("/oauth/callback", async (c) => { + requestCounter.add(1, { method: "GET", route: "/dropbox/oauth/callback" }); + const params = new URLSearchParams(c.req.url.split("?")[1]); + const entries = Object.fromEntries(params.entries()); + // entries.code + const response = await axios.postForm( + "https://api.dropboxapi.com/oauth2/token", + { + code: entries.code, + grant_type: "authorization_code", + client_id: env.DROPBOX_CLIENT_ID, + client_secret: env.DROPBOX_CLIENT_SECRET, + redirect_uri: env.DROPBOX_REDIRECT_URI, + } + ); + + const dropbox = await ctx.client.db.dropbox + .select(["*", "user_id.*", "dropbox_token_id.*"]) + .filter("user_id.xata_id", equals(entries.state)) + .getFirst(); + + const newDropboxToken = await ctx.client.db.dropbox_tokens.createOrUpdate( + dropbox?.dropbox_token_id?.xata_id, + { + refresh_token: encrypt( + response.data.refresh_token, + env.SPOTIFY_ENCRYPTION_KEY + ), + } + ); + + await ctx.client.db.dropbox.createOrUpdate(dropbox?.xata_id, { + dropbox_token_id: newDropboxToken.xata_id, + user_id: entries.state, + }); + + return c.redirect(`${env.FRONTEND_URL}/dropbox`); +}); + +app.post("/join", async (c) => { + requestCounter.add(1, { method: "POST", route: "/dropbox/join" }); + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + if (!bearer || bearer === "null") { + c.status(401); + return c.text("Unauthorized"); + } + + const { did } = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + + const user = await ctx.client.db.users.filter("did", equals(did)).getFirst(); + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const body = await c.req.json(); + const parsed = emailSchema.safeParse(body); + + if (parsed.error) { + c.status(400); + return c.text("Invalid email: " + parsed.error.message); + } + + const { email } = parsed.data; + + try { + await ctx.client.db.dropbox_accounts.create({ + user_id: user.xata_id, + email, + is_beta_user: false, + }); + } catch (e) { + if ( + !e.message.includes("invalid record: column [user_id]: is not unique") + ) { + console.error(e.message); + } else { + throw e; + } + } + + await fetch("https://beta.rocksky.app", { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${env.ROCKSKY_BETA_TOKEN}`, + }, + body: JSON.stringify({ email }), + }); + + return c.json({ status: "ok" }); +}); + +app.get("/files", async (c) => { + requestCounter.add(1, { method: "GET", route: "/dropbox/files" }); + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + if (!bearer || bearer === "null") { + c.status(401); + return c.text("Unauthorized"); + } + + const { did } = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + + const user = await ctx.client.db.users.filter("did", equals(did)).getFirst(); + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const path = c.req.query("path"); + + if (!path) { + try { + const { data } = await ctx.dropbox.post("dropbox.getFiles", { + did, + }); + + return c.json(data); + } catch { + await ctx.dropbox.post("dropbox.createMusicFolder", { + did, + }); + const response = await ctx.dropbox.post("dropbox.getFiles", { + did, + }); + return c.json(response.data); + } + } + + const { data } = await ctx.dropbox.post("dropbox.getFilesAt", { + did, + path, + }); + + return c.json(data); +}); + +app.get("/temporary-link", async (c) => { + requestCounter.add(1, { method: "GET", route: "/dropbox/temporary-link" }); + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + if (!bearer || bearer === "null") { + c.status(401); + return c.text("Unauthorized"); + } + + const { did } = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + + const user = await ctx.client.db.users.filter("did", equals(did)).getFirst(); + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const path = c.req.query("path"); + if (!path) { + c.status(400); + return c.text("Bad Request, path is required"); + } + + const { data } = await ctx.dropbox.post("dropbox.getTemporaryLink", { + did, + path, + }); + + return c.json(data); +}); + +app.get("/files/:id", async (c) => { + requestCounter.add(1, { method: "GET", route: "/dropbox/files/:id" }); + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + if (!bearer || bearer === "null") { + c.status(401); + return c.text("Unauthorized"); + } + + const { did } = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + + const user = await ctx.client.db.users.filter("did", equals(did)).getFirst(); + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const path = c.req.param("id"); + + const response = await ctx.dropbox.post("dropbox.getMetadata", { + did, + path, + }); + + return c.json(response.data); +}); + +app.get("/file", async (c) => { + requestCounter.add(1, { method: "GET", route: "/dropbox/file" }); + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + if (!bearer || bearer === "null") { + c.status(401); + return c.text("Unauthorized"); + } + + const { did } = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + + const user = await ctx.client.db.users.filter("did", equals(did)).getFirst(); + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const path = c.req.query("path"); + + if (!path) { + c.status(400); + return c.text("Bad Request, path is required"); + } + + const response = await ctx.dropbox.post("dropbox.getMetadata", { + did, + path, + }); + + return c.json(response.data); +}); + +app.get("/download", async (c) => { + requestCounter.add(1, { method: "GET", route: "/dropbox/download" }); + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + if (!bearer || bearer === "null") { + c.status(401); + return c.text("Unauthorized"); + } + + const { did } = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + + const user = await ctx.client.db.users.filter("did", equals(did)).getFirst(); + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const path = c.req.query("path"); + if (!path) { + c.status(400); + return c.text("Bad Request, path is required"); + } + + const response = await ctx.dropbox.post("dropbox.downloadFile", { + did, + path, + }); + + c.header( + "Content-Type", + response.headers["content-type"] || "application/octet-stream" + ); + c.header( + "Content-Disposition", + response.headers["content-disposition"] || "attachment" + ); + + return new Response(response.data, { + headers: c.res.headers, + }); +}); + +export default app; diff --git a/apps/api/src/googledrive/app.ts b/apps/api/src/googledrive/app.ts new file mode 100644 index 00000000..94c59967 --- /dev/null +++ b/apps/api/src/googledrive/app.ts @@ -0,0 +1,309 @@ +import { equals } from "@xata.io/client"; +import axios from "axios"; +import { ctx } from "context"; +import fs from "fs"; +import { google } from "googleapis"; +import { Hono } from "hono"; +import jwt from "jsonwebtoken"; +import { encrypt } from "lib/crypto"; +import { env } from "lib/env"; +import { requestCounter } from "metrics"; +import { emailSchema } from "types/email"; + +const app = new Hono(); + +app.get("/login", async (c) => { + requestCounter.add(1, { method: "GET", route: "/googledrive/login" }); + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + if (!bearer || bearer === "null") { + c.status(401); + return c.text("Unauthorized"); + } + + const { did } = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + + const user = await ctx.client.db.users.filter("did", equals(did)).getFirst(); + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const credentials = JSON.parse( + fs.readFileSync("credentials.json").toString("utf-8") + ); + const { client_id, client_secret } = credentials.installed || credentials.web; + const oAuth2Client = new google.auth.OAuth2( + client_id, + client_secret, + env.GOOGLE_REDIRECT_URI + ); + + // Generate Auth URL + const authUrl = oAuth2Client.generateAuthUrl({ + access_type: "offline", + prompt: "consent", + scope: ["https://www.googleapis.com/auth/drive"], + state: user.xata_id, + }); + return c.json({ authUrl }); +}); + +app.get("/oauth/callback", async (c) => { + requestCounter.add(1, { + method: "GET", + route: "/googledrive/oauth/callback", + }); + const params = new URLSearchParams(c.req.url.split("?")[1]); + const entries = Object.fromEntries(params.entries()); + + const credentials = JSON.parse( + fs.readFileSync("credentials.json").toString("utf-8") + ); + const { client_id, client_secret } = credentials.installed || credentials.web; + + const response = await axios.postForm("https://oauth2.googleapis.com/token", { + code: entries.code, + client_id, + client_secret, + redirect_uri: env.GOOGLE_REDIRECT_URI, + grant_type: "authorization_code", + }); + + const googledrive = await ctx.client.db.google_drive + .select(["*", "user_id.*", "google_drive_token_id.*"]) + .filter("user_id.xata_id", equals(entries.state)) + .getFirst(); + + const newGoogleDriveToken = + await ctx.client.db.google_drive_tokens.createOrUpdate( + googledrive?.google_drive_token_id?.xata_id, + { + refresh_token: encrypt( + response.data.refresh_token, + env.SPOTIFY_ENCRYPTION_KEY + ), + } + ); + + await ctx.client.db.google_drive.createOrUpdate(googledrive?.xata_id, { + google_drive_token_id: newGoogleDriveToken.xata_id, + user_id: entries.state, + }); + + return c.redirect(`${env.FRONTEND_URL}/googledrive`); +}); + +app.post("/join", async (c) => { + requestCounter.add(1, { method: "POST", route: "/googledrive/join" }); + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + if (!bearer || bearer === "null") { + c.status(401); + return c.text("Unauthorized"); + } + + const { did } = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + + const user = await ctx.client.db.users.filter("did", equals(did)).getFirst(); + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const body = await c.req.json(); + const parsed = emailSchema.safeParse(body); + + if (parsed.error) { + c.status(400); + return c.text("Invalid email: " + parsed.error.message); + } + + const { email } = parsed.data; + + try { + await ctx.client.db.google_drive_accounts.create({ + user_id: user.xata_id, + email, + is_beta_user: false, + }); + } catch (e) { + if ( + !e.message.includes("invalid record: column [user_id]: is not unique") + ) { + console.error(e.message); + } else { + throw e; + } + } + + await fetch("https://beta.rocksky.app", { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${env.ROCKSKY_BETA_TOKEN}`, + }, + body: JSON.stringify({ email }), + }); + + return c.json({ status: "ok" }); +}); + +app.get("/files", async (c) => { + requestCounter.add(1, { method: "GET", route: "/googledrive/files" }); + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + if (!bearer || bearer === "null") { + c.status(401); + return c.text("Unauthorized"); + } + + const { did } = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + + const user = await ctx.client.db.users.filter("did", equals(did)).getFirst(); + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const parent_id = c.req.query("parent_id"); + + try { + if (parent_id) { + const { data } = await ctx.googledrive.post( + "googledrive.getFilesInParents", + { + did, + parent_id, + } + ); + return c.json(data); + } + + let response = await ctx.googledrive.post("googledrive.getMusicDirectory", { + did, + }); + + if (response.data.files.length === 0) { + await ctx.googledrive.post("googledrive.createMusicDirectory", { did }); + response = await ctx.googledrive.post("googledrive.getMusicDirectory", { + did, + }); + } + + const { data } = await ctx.googledrive.post( + "googledrive.getFilesInParents", + { + did, + parent_id: response.data.files[0].id, + } + ); + return c.json(data); + } catch (error) { + if (axios.isAxiosError(error)) { + console.error("Axios error:", error.response?.data || error.message); + + const credentials = JSON.parse( + fs.readFileSync("credentials.json").toString("utf-8") + ); + const { client_id, client_secret } = + credentials.installed || credentials.web; + const oAuth2Client = new google.auth.OAuth2( + client_id, + client_secret, + env.GOOGLE_REDIRECT_URI + ); + + // Generate Auth URL + const authUrl = oAuth2Client.generateAuthUrl({ + access_type: "offline", + prompt: "consent", + scope: ["https://www.googleapis.com/auth/drive"], + state: user.xata_id, + }); + + return c.json({ + error: "Failed to fetch files", + authUrl, + }); + } + } +}); + +app.get("/files/:id", async (c) => { + requestCounter.add(1, { method: "GET", route: "/googledrive/files/:id" }); + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + if (!bearer || bearer === "null") { + c.status(401); + return c.text("Unauthorized"); + } + + const { did } = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + + const user = await ctx.client.db.users.filter("did", equals(did)).getFirst(); + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const id = c.req.param("id"); + const response = await ctx.googledrive.post("googledrive.getFile", { + did, + file_id: id, + }); + + return c.json(response.data); +}); + +app.get("/files/:id/download", async (c) => { + requestCounter.add(1, { + method: "GET", + route: "/googledrive/files/:id/download", + }); + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + if (!bearer || bearer === "null") { + c.status(401); + return c.text("Unauthorized"); + } + + const { did } = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + + const user = await ctx.client.db.users.filter("did", equals(did)).getFirst(); + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const id = c.req.param("id"); + const response = await ctx.googledrive.post("googledrive.downloadFile", { + did, + file_id: id, + }); + + c.header( + "Content-Type", + response.headers["content-type"] || "application/octet-stream" + ); + c.header( + "Content-Disposition", + response.headers["content-disposition"] || "attachment" + ); + + return new Response(response.data, { + headers: c.res.headers, + }); +}); + +export default app; diff --git a/apps/api/src/index.ts b/apps/api/src/index.ts new file mode 100644 index 00000000..dee0f4ca --- /dev/null +++ b/apps/api/src/index.ts @@ -0,0 +1,541 @@ +import { serve } from "@hono/node-server"; +import { createNodeWebSocket } from "@hono/node-ws"; +import { trace } from "@opentelemetry/api"; +import { equals } from "@xata.io/client"; +import { ctx } from "context"; +import { Hono } from "hono"; +import { cors } from "hono/cors"; +import jwt from "jsonwebtoken"; +import { createAgent } from "lib/agent"; +import { + getLovedTracks, + likeTrack, + unLikeTrack, +} from "lovedtracks/lovedtracks.service"; +import { scrobbleTrack } from "nowplaying/nowplaying.service"; +import { rateLimiter } from "ratelimiter"; +import subscribe from "subscribers"; +import { saveTrack } from "tracks/tracks.service"; +import { trackSchema } from "types/track"; +import handleWebsocket from "websocket/handler"; +import apikeys from "./apikeys/app"; +import bsky from "./bsky/app"; +import dropbox from "./dropbox/app"; +import googledrive from "./googledrive/app"; +import { env } from "./lib/env"; +import { requestCounter, requestDuration } from "./metrics"; +import "./profiling"; +import search from "./search/app"; +import spotify from "./spotify/app"; +import "./tracing"; +import users from "./users/app"; +import webscrobbler from "./webscrobbler/app"; + +subscribe(ctx); + +const app = new Hono(); +const { injectWebSocket, upgradeWebSocket } = createNodeWebSocket({ app }); + +app.use( + "*", + rateLimiter({ + limit: 1000, + window: 30, // 👈 30 seconds + }) +); + +app.use("*", async (c, next) => { + const span = trace.getActiveSpan(); + span?.setAttribute("http.route", c.req.path); + await next(); +}); + +app.use("*", async (c, next) => { + const start = Date.now(); + await next(); + const duration = (Date.now() - start) / 1000; + requestDuration.record(duration, { + route: c.req.path, + method: c.req.method, + }); +}); + +app.use(cors()); + +app.route("/", bsky); + +app.route("/spotify", spotify); + +app.route("/dropbox", dropbox); + +app.route("/googledrive", googledrive); + +app.route("/apikeys", apikeys); + +app.get("/ws", upgradeWebSocket(handleWebsocket)); + +app.get("/", async (c) => { + return c.json({ status: "ok" }); +}); + +app.post("/now-playing", async (c) => { + requestCounter.add(1, { method: "POST", route: "/now-playing" }); + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + if (!bearer || bearer === "null") { + c.status(401); + return c.text("Unauthorized"); + } + + const { did } = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + + const user = await ctx.client.db.users.filter("did", equals(did)).getFirst(); + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const body = await c.req.json(); + const parsed = trackSchema.safeParse(body); + + if (parsed.error) { + c.status(400); + return c.text("Invalid track data: " + parsed.error.message); + } + const track = parsed.data; + + const agent = await createAgent(ctx.oauthClient, did); + if (!agent) { + c.status(401); + return c.text("Unauthorized"); + } + + await scrobbleTrack(ctx, track, agent, user.did); + + return c.json({ status: "ok" }); +}); + +app.get("/now-playing", async (c) => { + requestCounter.add(1, { method: "GET", route: "/now-playing" }); + + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + const payload = + bearer && bearer !== "null" + ? jwt.verify(bearer, env.JWT_SECRET, { ignoreExpiration: true }) + : {}; + const did = c.req.query("did") || payload.did; + + if (!did) { + c.status(401); + return c.text("Unauthorized"); + } + + const user = await ctx.client.db.users + .filter({ + $any: [{ did }, { handle: did }], + }) + .getFirst(); + + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const [nowPlaying, status] = await Promise.all([ + ctx.redis.get(`nowplaying:${user.did}`), + ctx.redis.get(`nowplaying:${user.did}:status`), + ]); + return c.json( + nowPlaying ? { ...JSON.parse(nowPlaying), is_playing: status === "1" } : {} + ); +}); + +app.get("/now-playings", async (c) => { + requestCounter.add(1, { method: "GET", route: "/now-playings" }); + const size = +c.req.query("size") || 10; + const offset = +c.req.query("offset") || 0; + const { data } = await ctx.analytics.post("library.getDistinctScrobbles", { + pagination: { + skip: offset, + take: size, + }, + }); + return c.json(data); +}); + +app.post("/likes", async (c) => { + requestCounter.add(1, { method: "POST", route: "/likes" }); + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + if (!bearer || bearer === "null") { + c.status(401); + return c.text("Unauthorized"); + } + + const { did } = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + const agent = await createAgent(ctx.oauthClient, did); + + const user = await ctx.client.db.users.filter("did", equals(did)).getFirst(); + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const body = await c.req.json(); + const parsed = trackSchema.safeParse(body); + + if (parsed.error) { + c.status(400); + return c.text("Invalid track data: " + parsed.error.message); + } + const track = parsed.data; + await likeTrack(ctx, track, user, agent); + + return c.json({ status: "ok" }); +}); + +app.delete("/likes/:sha256", async (c) => { + requestCounter.add(1, { method: "DELETE", route: "/likes/:sha256" }); + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + if (!bearer || bearer === "null") { + c.status(401); + return c.text("Unauthorized"); + } + + const { did } = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + const agent = await createAgent(ctx.oauthClient, did); + + const user = await ctx.client.db.users.filter("did", equals(did)).getFirst(); + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const sha256 = c.req.param("sha256"); + await unLikeTrack(ctx, sha256, user, agent); + return c.json({ status: "ok" }); +}); + +app.get("/likes", async (c) => { + requestCounter.add(1, { method: "GET", route: "/likes" }); + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + if (!bearer || bearer === "null") { + c.status(401); + return c.text("Unauthorized"); + } + + const { did } = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + + const user = await ctx.client.db.users.filter("did", equals(did)).getFirst(); + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const size = +c.req.query("size") || 10; + const offset = +c.req.query("offset") || 0; + + const lovedTracks = await getLovedTracks(ctx, user, size, offset); + return c.json(lovedTracks); +}); + +app.get("/public/scrobbles", async (c) => { + requestCounter.add(1, { method: "GET", route: "/public/scrobbles" }); + + const size = +c.req.query("size") || 10; + const offset = +c.req.query("offset") || 0; + + const scrobbles = await ctx.client.db.scrobbles + .select(["track_id.*", "user_id.*", "timestamp", "xata_createdat", "uri"]) + .sort("timestamp", "desc") + .getPaginated({ + pagination: { + size, + offset, + }, + }); + + return c.json( + scrobbles.records.map((item) => ({ + cover: item.track_id.album_art, + artist: item.track_id.artist, + title: item.track_id.title, + date: item.timestamp, + user: item.user_id.handle, + uri: item.uri, + albumUri: item.track_id.album_uri, + artistUri: item.track_id.artist_uri, + tags: [], + listeners: 1, + sha256: item.track_id.sha256, + id: item.xata_id, + })) + ); +}); + +app.get("/public/scrobbleschart", async (c) => { + requestCounter.add(1, { method: "GET", route: "/public/scrobbleschart" }); + + const did = c.req.query("did"); + const artisturi = c.req.query("artisturi"); + const albumuri = c.req.query("albumuri"); + const songuri = c.req.query("songuri"); + + if (did) { + const chart = await ctx.analytics.post("library.getScrobblesPerDay", { + user_did: did, + }); + return c.json(chart.data); + } + + if (artisturi) { + const chart = await ctx.analytics.post("library.getArtistScrobbles", { + artist_id: artisturi, + }); + return c.json(chart.data); + } + + if (albumuri) { + const chart = await ctx.analytics.post("library.getAlbumScrobbles", { + album_id: albumuri, + }); + return c.json(chart.data); + } + + if (songuri) { + let uri = songuri; + if (songuri.includes("app.rocksky.scrobble")) { + const scrobble = await ctx.client.db.scrobbles + .select(["track_id.*", "uri"]) + .filter("uri", equals(songuri)) + .getFirst(); + + uri = scrobble.track_id.uri; + } + const chart = await ctx.analytics.post("library.getTrackScrobbles", { + track_id: uri, + }); + return c.json(chart.data); + } + + const chart = await ctx.analytics.post("library.getScrobblesPerDay", {}); + return c.json(chart.data); +}); + +app.get("/scrobbles", async (c) => { + requestCounter.add(1, { method: "GET", route: "/scrobbles" }); + + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + if (!bearer || bearer === "null") { + c.status(401); + return c.text("Unauthorized"); + } + + const { did } = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + + const user = await ctx.client.db.users.filter("did", equals(did)).getFirst(); + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const size = +c.req.query("size") || 10; + const offset = +c.req.query("offset") || 0; + + const scrobbles = await ctx.client.db.scrobbles + .select(["track_id.*", "uri"]) + .filter("user_id", equals(user.xata_id)) + .filter({ + $not: [ + { + uri: null, + }, + ], + }) + .sort("xata_createdat", "desc") + .getPaginated({ + pagination: { + size, + offset, + }, + }); + + return c.json(scrobbles.records); +}); + +app.post("/tracks", async (c) => { + requestCounter.add(1, { method: "POST", route: "/tracks" }); + + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + if (!bearer || bearer === "null") { + c.status(401); + return c.text("Unauthorized"); + } + + const { did } = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + + const user = await ctx.client.db.users.filter("did", equals(did)).getFirst(); + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const body = await c.req.json(); + const parsed = trackSchema.safeParse(body); + + if (parsed.error) { + c.status(400); + return c.text("Invalid track data: " + parsed.error.message); + } + + const track = parsed.data; + + const agent = await createAgent(ctx.oauthClient, did); + if (!agent) { + c.status(401); + return c.text("Unauthorized"); + } + + try { + await saveTrack(ctx, track, agent); + } catch (e) { + if (!e.message.includes("invalid record: column [sha256]: is not unique")) { + console.error("[spotify user]", e.message); + } + } + + return c.json({ status: "ok" }); +}); + +app.get("/tracks", async (c) => { + requestCounter.add(1, { method: "GET", route: "/tracks" }); + + const size = +c.req.query("size") || 100; + const offset = +c.req.query("offset") || 0; + + const tracks = await ctx.analytics.post("library.getTracks", { + pagination: { + skip: offset, + take: size, + }, + }); + + return c.json(tracks.data); +}); + +app.get("/albums", async (c) => { + requestCounter.add(1, { method: "GET", route: "/albums" }); + + const size = +c.req.query("size") || 100; + const offset = +c.req.query("offset") || 0; + + const albums = await ctx.analytics.post("library.getAlbums", { + pagination: { + skip: offset, + take: size, + }, + }); + + return c.json(albums.data); +}); + +app.get("/artists", async (c) => { + requestCounter.add(1, { method: "GET", route: "/artists" }); + + const size = +c.req.query("size") || 100; + const offset = +c.req.query("offset") || 0; + + const artists = await ctx.analytics.post("library.getArtists", { + pagination: { + skip: offset, + take: size, + }, + }); + + return c.json(artists.data); +}); + +app.get("/tracks/:sha256", async (c) => { + requestCounter.add(1, { method: "GET", route: "/tracks/:sha256" }); + + const sha256 = c.req.param("sha256"); + const track = await ctx.client.db.tracks + .filter("sha256", equals(sha256)) + .getFirst(); + return c.json(track); +}); + +app.get("/albums/:sha256", async (c) => { + requestCounter.add(1, { method: "GET", route: "/albums/:sha256" }); + + const sha256 = c.req.param("sha256"); + const album = await ctx.client.db.albums + .filter("sha256", equals(sha256)) + .getFirst(); + + return c.json(album); +}); + +app.get("/artists/:sha256", async (c) => { + requestCounter.add(1, { method: "GET", route: "/artists/:sha256" }); + + const sha256 = c.req.param("sha256"); + const artist = await ctx.client.db.artists + .filter("sha256", equals(sha256)) + .getFirst(); + + return c.json(artist); +}); + +app.get("/artists/:sha256/tracks", async (c) => { + requestCounter.add(1, { method: "GET", route: "/artists/:sha256/tracks" }); + const sha256 = c.req.param("sha256"); + + const tracks = await ctx.client.db.artist_tracks + .select(["track_id.*"]) + .filter("artist_id.sha256", equals(sha256)) + .getAll(); + + return c.json(tracks); +}); + +app.get("/albums/:sha256/tracks", async (c) => { + requestCounter.add(1, { method: "GET", route: "/albums/:sha256/tracks" }); + const sha256 = c.req.param("sha256"); + const tracks = await ctx.client.db.album_tracks + .select(["track_id.*"]) + .filter("album_id.sha256", equals(sha256)) + .getAll(); + + return c.json(tracks); +}); + +app.route("/users", users); + +app.route("/search", search); + +app.route("/webscrobbler", webscrobbler); + +const server = serve({ + fetch: app.fetch, + port: 8000, +}); + +injectWebSocket(server); diff --git a/apps/api/src/lexicon/index.ts b/apps/api/src/lexicon/index.ts new file mode 100644 index 00000000..e3c69c59 --- /dev/null +++ b/apps/api/src/lexicon/index.ts @@ -0,0 +1,1023 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { + createServer as createXrpcServer, + Server as XrpcServer, + Options as XrpcOptions, + AuthVerifier, + StreamAuthVerifier, +} from '@atproto/xrpc-server' +import { schemas } from './lexicons' +import * as AppRockskyActorGetActorAlbums from './types/app/rocksky/actor/getActorAlbums' +import * as AppRockskyActorGetActorArtists from './types/app/rocksky/actor/getActorArtists' +import * as AppRockskyActorGetActorLovedSongs from './types/app/rocksky/actor/getActorLovedSongs' +import * as AppRockskyActorGetActorPlaylists from './types/app/rocksky/actor/getActorPlaylists' +import * as AppRockskyActorGetActorScrobbles from './types/app/rocksky/actor/getActorScrobbles' +import * as AppRockskyActorGetActorSongs from './types/app/rocksky/actor/getActorSongs' +import * as AppRockskyActorGetProfile from './types/app/rocksky/actor/getProfile' +import * as AppRockskyAlbumGetAlbum from './types/app/rocksky/album/getAlbum' +import * as AppRockskyAlbumGetAlbums from './types/app/rocksky/album/getAlbums' +import * as AppRockskyAlbumGetAlbumTracks from './types/app/rocksky/album/getAlbumTracks' +import * as AppRockskyApikeyCreateApikey from './types/app/rocksky/apikey/createApikey' +import * as AppRockskyApikeyGetApikeys from './types/app/rocksky/apikey/getApikeys' +import * as AppRockskyApikeyRemoveApikey from './types/app/rocksky/apikey/removeApikey' +import * as AppRockskyApikeyUpdateApikey from './types/app/rocksky/apikey/updateApikey' +import * as AppRockskyArtistGetArtistAlbums from './types/app/rocksky/artist/getArtistAlbums' +import * as AppRockskyArtistGetArtist from './types/app/rocksky/artist/getArtist' +import * as AppRockskyArtistGetArtists from './types/app/rocksky/artist/getArtists' +import * as AppRockskyArtistGetArtistTracks from './types/app/rocksky/artist/getArtistTracks' +import * as AppRockskyChartsGetScrobblesChart from './types/app/rocksky/charts/getScrobblesChart' +import * as AppRockskyDropboxDownloadFile from './types/app/rocksky/dropbox/downloadFile' +import * as AppRockskyDropboxGetFiles from './types/app/rocksky/dropbox/getFiles' +import * as AppRockskyDropboxGetMetadata from './types/app/rocksky/dropbox/getMetadata' +import * as AppRockskyDropboxGetTemporaryLink from './types/app/rocksky/dropbox/getTemporaryLink' +import * as AppRockskyFeedGetNowPlayings from './types/app/rocksky/feed/getNowPlayings' +import * as AppRockskyFeedSearch from './types/app/rocksky/feed/search' +import * as AppRockskyGoogledriveDownloadFile from './types/app/rocksky/googledrive/downloadFile' +import * as AppRockskyGoogledriveGetFile from './types/app/rocksky/googledrive/getFile' +import * as AppRockskyGoogledriveGetFiles from './types/app/rocksky/googledrive/getFiles' +import * as AppRockskyLikeDislikeShout from './types/app/rocksky/like/dislikeShout' +import * as AppRockskyLikeDislikeSong from './types/app/rocksky/like/dislikeSong' +import * as AppRockskyLikeLikeShout from './types/app/rocksky/like/likeShout' +import * as AppRockskyLikeLikeSong from './types/app/rocksky/like/likeSong' +import * as AppRockskyPlayerGetCurrentlyPlaying from './types/app/rocksky/player/getCurrentlyPlaying' +import * as AppRockskyPlayerNext from './types/app/rocksky/player/next' +import * as AppRockskyPlayerPause from './types/app/rocksky/player/pause' +import * as AppRockskyPlayerPlay from './types/app/rocksky/player/play' +import * as AppRockskyPlayerPrevious from './types/app/rocksky/player/previous' +import * as AppRockskyPlayerSeek from './types/app/rocksky/player/seek' +import * as AppRockskyPlaylistGetPlaylist from './types/app/rocksky/playlist/getPlaylist' +import * as AppRockskyPlaylistGetPlaylists from './types/app/rocksky/playlist/getPlaylists' +import * as AppRockskyScrobbleCreateScrobble from './types/app/rocksky/scrobble/createScrobble' +import * as AppRockskyScrobbleGetScrobble from './types/app/rocksky/scrobble/getScrobble' +import * as AppRockskyScrobbleGetScrobbles from './types/app/rocksky/scrobble/getScrobbles' +import * as AppRockskyShoutCreateShout from './types/app/rocksky/shout/createShout' +import * as AppRockskyShoutGetAlbumShouts from './types/app/rocksky/shout/getAlbumShouts' +import * as AppRockskyShoutGetArtistShouts from './types/app/rocksky/shout/getArtistShouts' +import * as AppRockskyShoutGetProfileShouts from './types/app/rocksky/shout/getProfileShouts' +import * as AppRockskyShoutGetShoutReplies from './types/app/rocksky/shout/getShoutReplies' +import * as AppRockskyShoutGetTrackShouts from './types/app/rocksky/shout/getTrackShouts' +import * as AppRockskyShoutRemoveShout from './types/app/rocksky/shout/removeShout' +import * as AppRockskyShoutReplyShout from './types/app/rocksky/shout/replyShout' +import * as AppRockskyShoutReportShout from './types/app/rocksky/shout/reportShout' +import * as AppRockskySongCreateSong from './types/app/rocksky/song/createSong' +import * as AppRockskySongGetSong from './types/app/rocksky/song/getSong' +import * as AppRockskySongGetSongs from './types/app/rocksky/song/getSongs' +import * as AppRockskySpotifyGetCurrentlyPlaying from './types/app/rocksky/spotify/getCurrentlyPlaying' +import * as AppRockskySpotifyNext from './types/app/rocksky/spotify/next' +import * as AppRockskySpotifyPause from './types/app/rocksky/spotify/pause' +import * as AppRockskySpotifyPlay from './types/app/rocksky/spotify/play' +import * as AppRockskySpotifyPrevious from './types/app/rocksky/spotify/previous' +import * as AppRockskySpotifySeek from './types/app/rocksky/spotify/seek' +import * as AppRockskyStatsGetStats from './types/app/rocksky/stats/getStats' + +export function createServer(options?: XrpcOptions): Server { + return new Server(options) +} + +export class Server { + xrpc: XrpcServer + app: AppNS + com: ComNS + + constructor(options?: XrpcOptions) { + this.xrpc = createXrpcServer(schemas, options) + this.app = new AppNS(this) + this.com = new ComNS(this) + } +} + +export class AppNS { + _server: Server + rocksky: AppRockskyNS + bsky: AppBskyNS + + constructor(server: Server) { + this._server = server + this.rocksky = new AppRockskyNS(server) + this.bsky = new AppBskyNS(server) + } +} + +export class AppRockskyNS { + _server: Server + actor: AppRockskyActorNS + album: AppRockskyAlbumNS + apikey: AppRockskyApikeyNS + artist: AppRockskyArtistNS + charts: AppRockskyChartsNS + dropbox: AppRockskyDropboxNS + feed: AppRockskyFeedNS + googledrive: AppRockskyGoogledriveNS + like: AppRockskyLikeNS + player: AppRockskyPlayerNS + playlist: AppRockskyPlaylistNS + scrobble: AppRockskyScrobbleNS + shout: AppRockskyShoutNS + song: AppRockskySongNS + spotify: AppRockskySpotifyNS + stats: AppRockskyStatsNS + + constructor(server: Server) { + this._server = server + this.actor = new AppRockskyActorNS(server) + this.album = new AppRockskyAlbumNS(server) + this.apikey = new AppRockskyApikeyNS(server) + this.artist = new AppRockskyArtistNS(server) + this.charts = new AppRockskyChartsNS(server) + this.dropbox = new AppRockskyDropboxNS(server) + this.feed = new AppRockskyFeedNS(server) + this.googledrive = new AppRockskyGoogledriveNS(server) + this.like = new AppRockskyLikeNS(server) + this.player = new AppRockskyPlayerNS(server) + this.playlist = new AppRockskyPlaylistNS(server) + this.scrobble = new AppRockskyScrobbleNS(server) + this.shout = new AppRockskyShoutNS(server) + this.song = new AppRockskySongNS(server) + this.spotify = new AppRockskySpotifyNS(server) + this.stats = new AppRockskyStatsNS(server) + } +} + +export class AppRockskyActorNS { + _server: Server + + constructor(server: Server) { + this._server = server + } + + getActorAlbums( + cfg: ConfigOf< + AV, + AppRockskyActorGetActorAlbums.Handler>, + AppRockskyActorGetActorAlbums.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.actor.getActorAlbums' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + getActorArtists( + cfg: ConfigOf< + AV, + AppRockskyActorGetActorArtists.Handler>, + AppRockskyActorGetActorArtists.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.actor.getActorArtists' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + getActorLovedSongs( + cfg: ConfigOf< + AV, + AppRockskyActorGetActorLovedSongs.Handler>, + AppRockskyActorGetActorLovedSongs.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.actor.getActorLovedSongs' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + getActorPlaylists( + cfg: ConfigOf< + AV, + AppRockskyActorGetActorPlaylists.Handler>, + AppRockskyActorGetActorPlaylists.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.actor.getActorPlaylists' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + getActorScrobbles( + cfg: ConfigOf< + AV, + AppRockskyActorGetActorScrobbles.Handler>, + AppRockskyActorGetActorScrobbles.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.actor.getActorScrobbles' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + getActorSongs( + cfg: ConfigOf< + AV, + AppRockskyActorGetActorSongs.Handler>, + AppRockskyActorGetActorSongs.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.actor.getActorSongs' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + getProfile( + cfg: ConfigOf< + AV, + AppRockskyActorGetProfile.Handler>, + AppRockskyActorGetProfile.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.actor.getProfile' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } +} + +export class AppRockskyAlbumNS { + _server: Server + + constructor(server: Server) { + this._server = server + } + + getAlbum( + cfg: ConfigOf< + AV, + AppRockskyAlbumGetAlbum.Handler>, + AppRockskyAlbumGetAlbum.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.album.getAlbum' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + getAlbums( + cfg: ConfigOf< + AV, + AppRockskyAlbumGetAlbums.Handler>, + AppRockskyAlbumGetAlbums.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.album.getAlbums' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + getAlbumTracks( + cfg: ConfigOf< + AV, + AppRockskyAlbumGetAlbumTracks.Handler>, + AppRockskyAlbumGetAlbumTracks.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.album.getAlbumTracks' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } +} + +export class AppRockskyApikeyNS { + _server: Server + + constructor(server: Server) { + this._server = server + } + + createApikey( + cfg: ConfigOf< + AV, + AppRockskyApikeyCreateApikey.Handler>, + AppRockskyApikeyCreateApikey.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.apikey.createApikey' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + getApikeys( + cfg: ConfigOf< + AV, + AppRockskyApikeyGetApikeys.Handler>, + AppRockskyApikeyGetApikeys.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.apikey.getApikeys' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + removeApikey( + cfg: ConfigOf< + AV, + AppRockskyApikeyRemoveApikey.Handler>, + AppRockskyApikeyRemoveApikey.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.apikey.removeApikey' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + updateApikey( + cfg: ConfigOf< + AV, + AppRockskyApikeyUpdateApikey.Handler>, + AppRockskyApikeyUpdateApikey.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.apikey.updateApikey' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } +} + +export class AppRockskyArtistNS { + _server: Server + + constructor(server: Server) { + this._server = server + } + + getArtistAlbums( + cfg: ConfigOf< + AV, + AppRockskyArtistGetArtistAlbums.Handler>, + AppRockskyArtistGetArtistAlbums.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.artist.getArtistAlbums' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + getArtist( + cfg: ConfigOf< + AV, + AppRockskyArtistGetArtist.Handler>, + AppRockskyArtistGetArtist.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.artist.getArtist' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + getArtists( + cfg: ConfigOf< + AV, + AppRockskyArtistGetArtists.Handler>, + AppRockskyArtistGetArtists.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.artist.getArtists' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + getArtistTracks( + cfg: ConfigOf< + AV, + AppRockskyArtistGetArtistTracks.Handler>, + AppRockskyArtistGetArtistTracks.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.artist.getArtistTracks' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } +} + +export class AppRockskyChartsNS { + _server: Server + + constructor(server: Server) { + this._server = server + } + + getScrobblesChart( + cfg: ConfigOf< + AV, + AppRockskyChartsGetScrobblesChart.Handler>, + AppRockskyChartsGetScrobblesChart.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.charts.getScrobblesChart' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } +} + +export class AppRockskyDropboxNS { + _server: Server + + constructor(server: Server) { + this._server = server + } + + downloadFile( + cfg: ConfigOf< + AV, + AppRockskyDropboxDownloadFile.Handler>, + AppRockskyDropboxDownloadFile.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.dropbox.downloadFile' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + getFiles( + cfg: ConfigOf< + AV, + AppRockskyDropboxGetFiles.Handler>, + AppRockskyDropboxGetFiles.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.dropbox.getFiles' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + getMetadata( + cfg: ConfigOf< + AV, + AppRockskyDropboxGetMetadata.Handler>, + AppRockskyDropboxGetMetadata.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.dropbox.getMetadata' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + getTemporaryLink( + cfg: ConfigOf< + AV, + AppRockskyDropboxGetTemporaryLink.Handler>, + AppRockskyDropboxGetTemporaryLink.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.dropbox.getTemporaryLink' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } +} + +export class AppRockskyFeedNS { + _server: Server + + constructor(server: Server) { + this._server = server + } + + getNowPlayings( + cfg: ConfigOf< + AV, + AppRockskyFeedGetNowPlayings.Handler>, + AppRockskyFeedGetNowPlayings.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.feed.getNowPlayings' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + search( + cfg: ConfigOf< + AV, + AppRockskyFeedSearch.Handler>, + AppRockskyFeedSearch.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.feed.search' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } +} + +export class AppRockskyGoogledriveNS { + _server: Server + + constructor(server: Server) { + this._server = server + } + + downloadFile( + cfg: ConfigOf< + AV, + AppRockskyGoogledriveDownloadFile.Handler>, + AppRockskyGoogledriveDownloadFile.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.googledrive.downloadFile' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + getFile( + cfg: ConfigOf< + AV, + AppRockskyGoogledriveGetFile.Handler>, + AppRockskyGoogledriveGetFile.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.googledrive.getFile' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + getFiles( + cfg: ConfigOf< + AV, + AppRockskyGoogledriveGetFiles.Handler>, + AppRockskyGoogledriveGetFiles.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.googledrive.getFiles' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } +} + +export class AppRockskyLikeNS { + _server: Server + + constructor(server: Server) { + this._server = server + } + + dislikeShout( + cfg: ConfigOf< + AV, + AppRockskyLikeDislikeShout.Handler>, + AppRockskyLikeDislikeShout.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.like.dislikeShout' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + dislikeSong( + cfg: ConfigOf< + AV, + AppRockskyLikeDislikeSong.Handler>, + AppRockskyLikeDislikeSong.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.like.dislikeSong' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + likeShout( + cfg: ConfigOf< + AV, + AppRockskyLikeLikeShout.Handler>, + AppRockskyLikeLikeShout.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.like.likeShout' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + likeSong( + cfg: ConfigOf< + AV, + AppRockskyLikeLikeSong.Handler>, + AppRockskyLikeLikeSong.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.like.likeSong' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } +} + +export class AppRockskyPlayerNS { + _server: Server + + constructor(server: Server) { + this._server = server + } + + getCurrentlyPlaying( + cfg: ConfigOf< + AV, + AppRockskyPlayerGetCurrentlyPlaying.Handler>, + AppRockskyPlayerGetCurrentlyPlaying.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.player.getCurrentlyPlaying' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + next( + cfg: ConfigOf< + AV, + AppRockskyPlayerNext.Handler>, + AppRockskyPlayerNext.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.player.next' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + pause( + cfg: ConfigOf< + AV, + AppRockskyPlayerPause.Handler>, + AppRockskyPlayerPause.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.player.pause' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + play( + cfg: ConfigOf< + AV, + AppRockskyPlayerPlay.Handler>, + AppRockskyPlayerPlay.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.player.play' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + previous( + cfg: ConfigOf< + AV, + AppRockskyPlayerPrevious.Handler>, + AppRockskyPlayerPrevious.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.player.previous' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + seek( + cfg: ConfigOf< + AV, + AppRockskyPlayerSeek.Handler>, + AppRockskyPlayerSeek.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.player.seek' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } +} + +export class AppRockskyPlaylistNS { + _server: Server + + constructor(server: Server) { + this._server = server + } + + getPlaylist( + cfg: ConfigOf< + AV, + AppRockskyPlaylistGetPlaylist.Handler>, + AppRockskyPlaylistGetPlaylist.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.playlist.getPlaylist' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + getPlaylists( + cfg: ConfigOf< + AV, + AppRockskyPlaylistGetPlaylists.Handler>, + AppRockskyPlaylistGetPlaylists.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.playlist.getPlaylists' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } +} + +export class AppRockskyScrobbleNS { + _server: Server + + constructor(server: Server) { + this._server = server + } + + createScrobble( + cfg: ConfigOf< + AV, + AppRockskyScrobbleCreateScrobble.Handler>, + AppRockskyScrobbleCreateScrobble.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.scrobble.createScrobble' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + getScrobble( + cfg: ConfigOf< + AV, + AppRockskyScrobbleGetScrobble.Handler>, + AppRockskyScrobbleGetScrobble.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.scrobble.getScrobble' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + getScrobbles( + cfg: ConfigOf< + AV, + AppRockskyScrobbleGetScrobbles.Handler>, + AppRockskyScrobbleGetScrobbles.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.scrobble.getScrobbles' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } +} + +export class AppRockskyShoutNS { + _server: Server + + constructor(server: Server) { + this._server = server + } + + createShout( + cfg: ConfigOf< + AV, + AppRockskyShoutCreateShout.Handler>, + AppRockskyShoutCreateShout.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.shout.createShout' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + getAlbumShouts( + cfg: ConfigOf< + AV, + AppRockskyShoutGetAlbumShouts.Handler>, + AppRockskyShoutGetAlbumShouts.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.shout.getAlbumShouts' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + getArtistShouts( + cfg: ConfigOf< + AV, + AppRockskyShoutGetArtistShouts.Handler>, + AppRockskyShoutGetArtistShouts.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.shout.getArtistShouts' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + getProfileShouts( + cfg: ConfigOf< + AV, + AppRockskyShoutGetProfileShouts.Handler>, + AppRockskyShoutGetProfileShouts.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.shout.getProfileShouts' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + getShoutReplies( + cfg: ConfigOf< + AV, + AppRockskyShoutGetShoutReplies.Handler>, + AppRockskyShoutGetShoutReplies.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.shout.getShoutReplies' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + getTrackShouts( + cfg: ConfigOf< + AV, + AppRockskyShoutGetTrackShouts.Handler>, + AppRockskyShoutGetTrackShouts.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.shout.getTrackShouts' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + removeShout( + cfg: ConfigOf< + AV, + AppRockskyShoutRemoveShout.Handler>, + AppRockskyShoutRemoveShout.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.shout.removeShout' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + replyShout( + cfg: ConfigOf< + AV, + AppRockskyShoutReplyShout.Handler>, + AppRockskyShoutReplyShout.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.shout.replyShout' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + reportShout( + cfg: ConfigOf< + AV, + AppRockskyShoutReportShout.Handler>, + AppRockskyShoutReportShout.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.shout.reportShout' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } +} + +export class AppRockskySongNS { + _server: Server + + constructor(server: Server) { + this._server = server + } + + createSong( + cfg: ConfigOf< + AV, + AppRockskySongCreateSong.Handler>, + AppRockskySongCreateSong.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.song.createSong' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + getSong( + cfg: ConfigOf< + AV, + AppRockskySongGetSong.Handler>, + AppRockskySongGetSong.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.song.getSong' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + getSongs( + cfg: ConfigOf< + AV, + AppRockskySongGetSongs.Handler>, + AppRockskySongGetSongs.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.song.getSongs' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } +} + +export class AppRockskySpotifyNS { + _server: Server + + constructor(server: Server) { + this._server = server + } + + getCurrentlyPlaying( + cfg: ConfigOf< + AV, + AppRockskySpotifyGetCurrentlyPlaying.Handler>, + AppRockskySpotifyGetCurrentlyPlaying.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.spotify.getCurrentlyPlaying' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + next( + cfg: ConfigOf< + AV, + AppRockskySpotifyNext.Handler>, + AppRockskySpotifyNext.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.spotify.next' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + pause( + cfg: ConfigOf< + AV, + AppRockskySpotifyPause.Handler>, + AppRockskySpotifyPause.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.spotify.pause' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + play( + cfg: ConfigOf< + AV, + AppRockskySpotifyPlay.Handler>, + AppRockskySpotifyPlay.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.spotify.play' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + previous( + cfg: ConfigOf< + AV, + AppRockskySpotifyPrevious.Handler>, + AppRockskySpotifyPrevious.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.spotify.previous' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + seek( + cfg: ConfigOf< + AV, + AppRockskySpotifySeek.Handler>, + AppRockskySpotifySeek.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.spotify.seek' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } +} + +export class AppRockskyStatsNS { + _server: Server + + constructor(server: Server) { + this._server = server + } + + getStats( + cfg: ConfigOf< + AV, + AppRockskyStatsGetStats.Handler>, + AppRockskyStatsGetStats.HandlerReqCtx> + >, + ) { + const nsid = 'app.rocksky.stats.getStats' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } +} + +export class AppBskyNS { + _server: Server + actor: AppBskyActorNS + + constructor(server: Server) { + this._server = server + this.actor = new AppBskyActorNS(server) + } +} + +export class AppBskyActorNS { + _server: Server + + constructor(server: Server) { + this._server = server + } +} + +export class ComNS { + _server: Server + atproto: ComAtprotoNS + + constructor(server: Server) { + this._server = server + this.atproto = new ComAtprotoNS(server) + } +} + +export class ComAtprotoNS { + _server: Server + repo: ComAtprotoRepoNS + + constructor(server: Server) { + this._server = server + this.repo = new ComAtprotoRepoNS(server) + } +} + +export class ComAtprotoRepoNS { + _server: Server + + constructor(server: Server) { + this._server = server + } +} + +type SharedRateLimitOpts = { + name: string + calcKey?: (ctx: T) => string | null + calcPoints?: (ctx: T) => number +} +type RouteRateLimitOpts = { + durationMs: number + points: number + calcKey?: (ctx: T) => string | null + calcPoints?: (ctx: T) => number +} +type HandlerOpts = { blobLimit?: number } +type HandlerRateLimitOpts = SharedRateLimitOpts | RouteRateLimitOpts +type ConfigOf = + | Handler + | { + auth?: Auth + opts?: HandlerOpts + rateLimit?: HandlerRateLimitOpts | HandlerRateLimitOpts[] + handler: Handler + } +type ExtractAuth = Extract< + Awaited>, + { credentials: unknown } +> diff --git a/apps/api/src/lexicon/lexicons.ts b/apps/api/src/lexicon/lexicons.ts new file mode 100644 index 00000000..ef6817cb --- /dev/null +++ b/apps/api/src/lexicon/lexicons.ts @@ -0,0 +1,4152 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { LexiconDoc, Lexicons } from '@atproto/lexicon' + +export const schemaDict = { + AppRockskyActorDefs: { + lexicon: 1, + id: 'app.rocksky.actor.defs', + defs: { + profileViewDetailed: { + type: 'object', + properties: { + id: { + type: 'string', + description: 'The unique identifier of the actor.', + }, + did: { + type: 'string', + description: 'The DID of the actor.', + }, + handle: { + type: 'string', + description: 'The handle of the actor.', + }, + displayName: { + type: 'string', + description: 'The display name of the actor.', + }, + avatar: { + type: 'string', + description: "The URL of the actor's avatar image.", + format: 'uri', + }, + createdAt: { + type: 'string', + description: 'The date and time when the actor was created.', + format: 'datetime', + }, + updatedAt: { + type: 'string', + description: 'The date and time when the actor was last updated.', + format: 'datetime', + }, + }, + }, + profileViewBasic: { + type: 'object', + properties: { + id: { + type: 'string', + description: 'The unique identifier of the actor.', + }, + did: { + type: 'string', + description: 'The DID of the actor.', + }, + handle: { + type: 'string', + description: 'The handle of the actor.', + }, + displayName: { + type: 'string', + description: 'The display name of the actor.', + }, + avatar: { + type: 'string', + description: "The URL of the actor's avatar image.", + format: 'uri', + }, + createdAt: { + type: 'string', + description: 'The date and time when the actor was created.', + format: 'datetime', + }, + updatedAt: { + type: 'string', + description: 'The date and time when the actor was last updated.', + format: 'datetime', + }, + }, + }, + }, + }, + AppRockskyActorGetActorAlbums: { + lexicon: 1, + id: 'app.rocksky.actor.getActorAlbums', + defs: { + main: { + type: 'query', + description: 'Get albums for an actor', + parameters: { + type: 'params', + required: ['did'], + properties: { + did: { + type: 'string', + description: 'The DID or handle of the actor', + format: 'at-identifier', + }, + limit: { + type: 'integer', + description: 'The maximum number of albums to return', + minimum: 1, + }, + offset: { + type: 'integer', + description: 'The offset for pagination', + minimum: 0, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + properties: { + albums: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:app.rocksky.album.defs#albumViewBasic', + }, + }, + }, + }, + }, + }, + }, + }, + AppRockskyActorGetActorArtists: { + lexicon: 1, + id: 'app.rocksky.actor.getActorArtists', + defs: { + main: { + type: 'query', + description: 'Get artists for an actor', + parameters: { + type: 'params', + required: ['did'], + properties: { + did: { + type: 'string', + description: 'The DID or handle of the actor', + format: 'at-identifier', + }, + limit: { + type: 'integer', + description: 'The maximum number of albums to return', + minimum: 1, + }, + offset: { + type: 'integer', + description: 'The offset for pagination', + minimum: 0, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + properties: { + artists: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:app.rocksky.artist.defs#artistViewBasic', + }, + }, + }, + }, + }, + }, + }, + }, + AppRockskyActorGetActorLovedSongs: { + lexicon: 1, + id: 'app.rocksky.actor.getActorLovedSongs', + defs: { + main: { + type: 'query', + description: 'Get loved songs for an actor', + parameters: { + type: 'params', + required: ['did'], + properties: { + did: { + type: 'string', + description: 'The DID or handle of the actor', + format: 'at-identifier', + }, + limit: { + type: 'integer', + description: 'The maximum number of albums to return', + minimum: 1, + }, + offset: { + type: 'integer', + description: 'The offset for pagination', + minimum: 0, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + properties: { + tracks: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:app.rocksky.song.defs#songViewBasic', + }, + }, + }, + }, + }, + }, + }, + }, + AppRockskyActorGetActorPlaylists: { + lexicon: 1, + id: 'app.rocksky.actor.getActorPlaylists', + defs: { + main: { + type: 'query', + description: 'Get playlists for an actor', + parameters: { + type: 'params', + required: ['did'], + properties: { + did: { + type: 'string', + description: 'The DID or handle of the actor', + format: 'at-identifier', + }, + limit: { + type: 'integer', + description: 'The maximum number of albums to return', + minimum: 1, + }, + offset: { + type: 'integer', + description: 'The offset for pagination', + minimum: 0, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + properties: { + playlists: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:app.rocksky.playlist.defs#playlistViewBasic', + }, + }, + }, + }, + }, + }, + }, + }, + AppRockskyActorGetActorScrobbles: { + lexicon: 1, + id: 'app.rocksky.actor.getActorScrobbles', + defs: { + main: { + type: 'query', + description: 'Get scrobbles for an actor', + parameters: { + type: 'params', + required: ['did'], + properties: { + did: { + type: 'string', + description: 'The DID or handle of the actor', + format: 'at-identifier', + }, + limit: { + type: 'integer', + description: 'The maximum number of albums to return', + minimum: 1, + }, + offset: { + type: 'integer', + description: 'The offset for pagination', + minimum: 0, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + properties: { + scrobbles: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:app.rocksky.scrobble.defs#scrobbleViewBasic', + }, + }, + }, + }, + }, + }, + }, + }, + AppRockskyActorGetActorSongs: { + lexicon: 1, + id: 'app.rocksky.actor.getActorSongs', + defs: { + main: { + type: 'query', + description: 'Get songs for an actor', + parameters: { + type: 'params', + required: ['did'], + properties: { + did: { + type: 'string', + description: 'The DID or handle of the actor', + format: 'at-identifier', + }, + limit: { + type: 'integer', + description: 'The maximum number of albums to return', + minimum: 1, + }, + offset: { + type: 'integer', + description: 'The offset for pagination', + minimum: 0, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + properties: { + songs: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:app.rocksky.song.defs#songViewBasic', + }, + }, + }, + }, + }, + }, + }, + }, + AppRockskyActorGetProfile: { + lexicon: 1, + id: 'app.rocksky.actor.getProfile', + defs: { + main: { + type: 'query', + description: 'Get the profile of an actor', + parameters: { + type: 'params', + properties: { + did: { + type: 'string', + description: 'The DID or handle of the actor', + format: 'at-identifier', + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'ref', + ref: 'lex:app.rocksky.actor.defs#profileViewDetailed', + }, + }, + }, + }, + }, + AppBskyActorProfile: { + lexicon: 1, + id: 'app.bsky.actor.profile', + defs: { + main: { + type: 'record', + description: 'A declaration of a Bluesky account profile.', + key: 'literal:self', + record: { + type: 'object', + properties: { + displayName: { + type: 'string', + maxGraphemes: 64, + maxLength: 640, + }, + description: { + type: 'string', + description: 'Free-form profile description text.', + maxGraphemes: 256, + maxLength: 2560, + }, + avatar: { + type: 'blob', + description: + "Small image to be displayed next to posts from account. AKA, 'profile picture'", + accept: ['image/png', 'image/jpeg'], + maxSize: 1000000, + }, + banner: { + type: 'blob', + description: + 'Larger horizontal image to display behind profile view.', + accept: ['image/png', 'image/jpeg'], + maxSize: 10000000, + }, + labels: { + type: 'union', + description: + 'Self-label values, specific to the Bluesky application, on the overall account.', + refs: ['lex:com.atproto.label.defs#selfLabels'], + }, + joinedViaStarterPack: { + type: 'ref', + ref: 'lex:com.atproto.repo.strongRef', + }, + createdAt: { + type: 'string', + format: 'datetime', + }, + }, + }, + }, + }, + }, + AppRockskyAlbum: { + lexicon: 1, + id: 'app.rocksky.album', + defs: { + main: { + type: 'record', + description: 'A declaration of an album.', + key: 'tid', + record: { + type: 'object', + required: ['title', 'artist', 'createdAt'], + properties: { + title: { + type: 'string', + description: 'The title of the album.', + minLength: 1, + maxLength: 512, + }, + artist: { + type: 'string', + description: 'The artist of the album.', + minLength: 1, + maxLength: 256, + }, + duration: { + type: 'integer', + description: 'The duration of the album in seconds.', + }, + releaseDate: { + type: 'string', + description: 'The release date of the album.', + format: 'datetime', + }, + year: { + type: 'integer', + description: 'The year the album was released.', + }, + genre: { + type: 'string', + description: 'The genre of the album.', + maxLength: 256, + }, + albumArt: { + type: 'blob', + description: 'The album art of the album.', + accept: ['image/png', 'image/jpeg'], + maxSize: 2000000, + }, + tags: { + type: 'array', + description: 'The tags of the album.', + items: { + type: 'string', + minLength: 1, + maxLength: 256, + }, + }, + youtubeLink: { + type: 'string', + description: 'The YouTube link of the album.', + format: 'uri', + }, + spotifyLink: { + type: 'string', + description: 'The Spotify link of the album.', + format: 'uri', + }, + tidalLink: { + type: 'string', + description: 'The tidal link of the album.', + format: 'uri', + }, + appleMusicLink: { + type: 'string', + description: 'The Apple Music link of the album.', + format: 'uri', + }, + createdAt: { + type: 'string', + description: 'The date and time when the album was created.', + format: 'datetime', + }, + }, + }, + }, + }, + }, + AppRockskyAlbumDefs: { + lexicon: 1, + id: 'app.rocksky.album.defs', + defs: { + albumViewBasic: { + type: 'object', + properties: { + id: { + type: 'string', + description: 'The unique identifier of the album.', + }, + uri: { + type: 'string', + description: 'The URI of the album.', + format: 'at-uri', + }, + title: { + type: 'string', + description: 'The title of the album.', + }, + artist: { + type: 'string', + description: 'The artist of the album.', + }, + artistUri: { + type: 'string', + description: "The URI of the album's artist.", + format: 'at-uri', + }, + year: { + type: 'integer', + description: 'The year the album was released.', + }, + albumArt: { + type: 'string', + description: 'The URL of the album art image.', + format: 'uri', + }, + releaseDate: { + type: 'string', + description: 'The release date of the album.', + }, + sha256: { + type: 'string', + description: 'The SHA256 hash of the album.', + }, + playCount: { + type: 'integer', + description: 'The number of times the album has been played.', + minimum: 0, + }, + uniqueListeners: { + type: 'integer', + description: + 'The number of unique listeners who have played the album.', + minimum: 0, + }, + }, + }, + albumViewDetailed: { + type: 'object', + properties: { + id: { + type: 'string', + description: 'The unique identifier of the album.', + }, + uri: { + type: 'string', + description: 'The URI of the album.', + format: 'at-uri', + }, + title: { + type: 'string', + description: 'The title of the album.', + }, + artist: { + type: 'string', + description: 'The artist of the album.', + }, + artistUri: { + type: 'string', + description: "The URI of the album's artist.", + format: 'at-uri', + }, + year: { + type: 'integer', + description: 'The year the album was released.', + }, + albumArt: { + type: 'string', + description: 'The URL of the album art image.', + format: 'uri', + }, + releaseDate: { + type: 'string', + description: 'The release date of the album.', + }, + sha256: { + type: 'string', + description: 'The SHA256 hash of the album.', + }, + playCount: { + type: 'integer', + description: 'The number of times the album has been played.', + minimum: 0, + }, + uniqueListeners: { + type: 'integer', + description: + 'The number of unique listeners who have played the album.', + minimum: 0, + }, + tracks: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:app.rocksky.song.defs.songViewBasic', + }, + }, + }, + }, + }, + }, + AppRockskyAlbumGetAlbum: { + lexicon: 1, + id: 'app.rocksky.album.getAlbum', + defs: { + main: { + type: 'query', + description: 'Get detailed album view', + parameters: { + type: 'params', + required: ['uri'], + properties: { + uri: { + type: 'string', + description: 'The URI of the album to retrieve.', + format: 'at-uri', + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'ref', + ref: 'lex:app.rocksky.album.defs#albumViewDetailed', + }, + }, + }, + }, + }, + AppRockskyAlbumGetAlbums: { + lexicon: 1, + id: 'app.rocksky.album.getAlbums', + defs: { + main: { + type: 'query', + description: 'Get albums', + parameters: { + type: 'params', + properties: { + limit: { + type: 'integer', + description: 'The maximum number of albums to return', + minimum: 1, + }, + offset: { + type: 'integer', + description: 'The offset for pagination', + minimum: 0, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + properties: { + albums: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:app.rocksky.album.defs#albumViewBasic', + }, + }, + }, + }, + }, + }, + }, + }, + AppRockskyAlbumGetAlbumTracks: { + lexicon: 1, + id: 'app.rocksky.album.getAlbumTracks', + defs: { + main: { + type: 'query', + description: 'Get tracks for an album', + parameters: { + type: 'params', + required: ['uri'], + properties: { + uri: { + type: 'string', + description: 'The URI of the album to retrieve tracks from', + format: 'at-uri', + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + properties: { + tracks: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:app.rocksky.song.defs#songViewBasic', + }, + }, + }, + }, + }, + }, + }, + }, + AppRockskyApikeyCreateApikey: { + lexicon: 1, + id: 'app.rocksky.apikey.createApikey', + defs: { + main: { + type: 'procedure', + description: 'Create a new API key for the authenticated user', + input: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['name'], + properties: { + name: { + type: 'string', + description: 'The name of the API key.', + }, + description: { + type: 'string', + description: 'A description for the API key.', + }, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'ref', + ref: 'lex:app.rocksky.apikey.defs#apiKey', + }, + }, + }, + }, + }, + AppRockskyApikeyDefs: { + lexicon: 1, + id: 'app.rocksky.apikey.defs', + defs: { + apiKeyView: { + type: 'object', + properties: { + id: { + type: 'string', + description: 'The unique identifier of the API key.', + }, + name: { + type: 'string', + description: 'The name of the API key.', + }, + description: { + type: 'string', + description: 'A description for the API key.', + }, + createdAt: { + type: 'string', + description: 'The date and time when the API key was created.', + format: 'datetime', + }, + }, + }, + }, + }, + AppRockskyApikeysDefs: { + lexicon: 1, + id: 'app.rocksky.apikeys.defs', + defs: {}, + }, + AppRockskyApikeyGetApikeys: { + lexicon: 1, + id: 'app.rocksky.apikey.getApikeys', + defs: { + main: { + type: 'query', + description: 'Get a list of API keys for the authenticated user', + parameters: { + type: 'params', + properties: { + offset: { + type: 'integer', + description: + 'The number of API keys to skip before starting to collect the result set.', + }, + limit: { + type: 'integer', + description: 'The number of API keys to return per page.', + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + properties: { + apiKeys: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:app.rocksky.apikey.defs#apikeyView', + }, + }, + }, + }, + }, + }, + }, + }, + AppRockskyApikeyRemoveApikey: { + lexicon: 1, + id: 'app.rocksky.apikey.removeApikey', + defs: { + main: { + type: 'procedure', + description: 'Remove an API key for the authenticated user', + parameters: { + type: 'params', + required: ['id'], + properties: { + id: { + type: 'string', + description: 'The ID of the API key to remove.', + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'ref', + ref: 'lex:app.rocksky.apikey.defs#apiKey', + }, + }, + }, + }, + }, + AppRockskyApikeyUpdateApikey: { + lexicon: 1, + id: 'app.rocksky.apikey.updateApikey', + defs: { + main: { + type: 'procedure', + description: 'Update an existing API key for the authenticated user', + input: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['id', 'name'], + properties: { + id: { + type: 'string', + description: 'The ID of the API key to update.', + }, + name: { + type: 'string', + description: 'The new name of the API key.', + }, + description: { + type: 'string', + description: 'A new description for the API key.', + }, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'ref', + ref: 'lex:app.rocksky.apikey.defs#apiKey', + }, + }, + }, + }, + }, + AppRockskyArtist: { + lexicon: 1, + id: 'app.rocksky.artist', + defs: { + main: { + type: 'record', + description: 'A declaration of an artist.', + key: 'tid', + record: { + type: 'object', + required: ['name', 'createdAt'], + properties: { + name: { + type: 'string', + description: 'The name of the artist.', + minLength: 1, + maxLength: 512, + }, + bio: { + type: 'string', + description: 'The biography of the artist.', + maxLength: 1000, + }, + picture: { + type: 'blob', + description: 'The picture of the artist.', + accept: ['image/png', 'image/jpeg'], + maxSize: 2000000, + }, + tags: { + type: 'array', + description: 'The tags of the artist.', + items: { + type: 'string', + minLength: 1, + maxLength: 256, + }, + }, + born: { + type: 'string', + description: 'The birth date of the artist.', + format: 'datetime', + }, + died: { + type: 'string', + description: 'The death date of the artist.', + format: 'datetime', + }, + bornIn: { + type: 'string', + description: 'The birth place of the artist.', + maxLength: 256, + }, + createdAt: { + type: 'string', + description: 'The date when the artist was created.', + format: 'datetime', + }, + }, + }, + }, + }, + }, + AppRockskyArtistDefs: { + lexicon: 1, + id: 'app.rocksky.artist.defs', + defs: { + artistViewBasic: { + type: 'object', + properties: { + id: { + type: 'string', + description: 'The unique identifier of the artist.', + }, + uri: { + type: 'string', + description: 'The URI of the artist.', + format: 'at-uri', + }, + name: { + type: 'string', + description: 'The name of the artist.', + }, + picture: { + type: 'string', + description: 'The picture of the artist.', + }, + sha256: { + type: 'string', + description: 'The SHA256 hash of the artist.', + }, + playCount: { + type: 'integer', + description: 'The number of times the artist has been played.', + minimum: 0, + }, + uniqueListeners: { + type: 'integer', + description: + 'The number of unique listeners who have played the artist.', + minimum: 0, + }, + }, + }, + artistViewDetailed: { + type: 'object', + properties: { + id: { + type: 'string', + description: 'The unique identifier of the artist.', + }, + uri: { + type: 'string', + description: 'The URI of the artist.', + format: 'at-uri', + }, + name: { + type: 'string', + description: 'The name of the artist.', + }, + picture: { + type: 'string', + description: 'The picture of the artist.', + }, + sha256: { + type: 'string', + description: 'The SHA256 hash of the artist.', + }, + playCount: { + type: 'integer', + description: 'The number of times the artist has been played.', + minimum: 0, + }, + uniqueListeners: { + type: 'integer', + description: + 'The number of unique listeners who have played the artist.', + minimum: 0, + }, + }, + }, + }, + }, + AppRockskyArtistGetArtistAlbums: { + lexicon: 1, + id: 'app.rocksky.artist.getArtistAlbums', + defs: { + main: { + type: 'query', + description: "Get artist's albums", + parameters: { + type: 'params', + required: ['uri'], + properties: { + uri: { + type: 'string', + description: 'The URI of the artist to retrieve albums from', + format: 'at-uri', + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + properties: { + albums: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:app.rocksky.album.defs#albumViewBasic', + }, + }, + }, + }, + }, + }, + }, + }, + AppRockskyArtistGetArtist: { + lexicon: 1, + id: 'app.rocksky.artist.getArtist', + defs: { + main: { + type: 'query', + description: 'Get artist details', + parameters: { + type: 'params', + required: ['uri'], + properties: { + uri: { + type: 'string', + description: 'The URI of the artist to retrieve details from', + format: 'at-uri', + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'ref', + ref: 'lex:app.rocksky.artist.defs#artistViewDetailed', + }, + }, + }, + }, + }, + AppRockskyArtistGetArtists: { + lexicon: 1, + id: 'app.rocksky.artist.getArtists', + defs: { + main: { + type: 'query', + description: 'Get artists', + parameters: { + type: 'params', + properties: { + limit: { + type: 'integer', + description: 'The maximum number of artists to return', + minimum: 1, + }, + offset: { + type: 'integer', + description: 'The offset for pagination', + minimum: 0, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + properties: { + artists: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:app.rocksky.artist.defs#artistViewBasic', + }, + }, + }, + }, + }, + }, + }, + }, + AppRockskyArtistGetArtistTracks: { + lexicon: 1, + id: 'app.rocksky.artist.getArtistTracks', + defs: { + main: { + type: 'query', + description: "Get artist's tracks", + parameters: { + type: 'params', + properties: { + uri: { + type: 'string', + description: 'The URI of the artist to retrieve albums from', + format: 'at-uri', + }, + limit: { + type: 'integer', + description: 'The maximum number of tracks to return', + minimum: 1, + }, + offset: { + type: 'integer', + description: 'The offset for pagination', + minimum: 0, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + properties: { + tracks: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:app.rocksky.song.defs#songViewBasic', + }, + }, + }, + }, + }, + }, + }, + }, + AppRockskyChartsDefs: { + lexicon: 1, + id: 'app.rocksky.charts.defs', + defs: { + chartsView: { + type: 'object', + properties: { + scrobbles: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:app.rocksky.charts.defs#scrobbleViewBasic', + }, + }, + }, + }, + scrobbleViewBasic: { + type: 'object', + properties: { + date: { + type: 'string', + description: 'The date of the scrobble.', + format: 'datetime', + }, + count: { + type: 'integer', + description: 'The number of scrobbles on this date.', + }, + }, + }, + }, + }, + AppRockskyChartsGetScrobblesChart: { + lexicon: 1, + id: 'app.rocksky.charts.getScrobblesChart', + defs: { + main: { + type: 'query', + description: 'Get the scrobbles chart', + parameters: { + type: 'params', + properties: { + did: { + type: 'string', + description: 'The DID or handle of the actor', + format: 'at-identifier', + }, + artisturi: { + type: 'string', + description: 'The URI of the artist to filter by', + format: 'at-uri', + }, + albumuri: { + type: 'string', + description: 'The URI of the album to filter by', + format: 'at-uri', + }, + songuri: { + type: 'string', + description: 'The URI of the track to filter by', + format: 'at-uri', + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'ref', + ref: 'lex:app.rocksky.charts.defs#chartsView', + }, + }, + }, + }, + }, + AppRockskyDropboxDefs: { + lexicon: 1, + id: 'app.rocksky.dropbox.defs', + defs: { + fileView: { + type: 'object', + properties: { + id: { + type: 'string', + description: 'The unique identifier of the file.', + }, + name: { + type: 'string', + description: 'The name of the file.', + }, + pathLower: { + type: 'string', + description: 'The lowercased path of the file.', + }, + pathDisplay: { + type: 'string', + description: 'The display path of the file.', + }, + clientModified: { + type: 'string', + description: + 'The last modified date and time of the file on the client.', + format: 'datetime', + }, + serverModified: { + type: 'string', + description: + 'The last modified date and time of the file on the server.', + format: 'datetime', + }, + }, + }, + fileListView: { + type: 'object', + properties: { + files: { + type: 'array', + description: 'A list of files in the Dropbox.', + items: { + type: 'ref', + ref: 'lex:app.rocksky.dropbox.defs#fileView', + }, + }, + }, + }, + temporaryLinkView: { + type: 'object', + properties: { + link: { + type: 'string', + description: 'The temporary link to access the file.', + format: 'uri', + }, + }, + }, + }, + }, + AppRockskyDropboxDownloadFile: { + lexicon: 1, + id: 'app.rocksky.dropbox.downloadFile', + defs: { + main: { + type: 'query', + description: 'Download a file from Dropbox by its unique identifier', + parameters: { + type: 'params', + required: ['fileId'], + properties: { + fileId: { + type: 'string', + description: 'The unique identifier of the file to download', + }, + }, + }, + output: { + encoding: 'application/octet-stream', + }, + }, + }, + }, + AppRockskyDropboxGetFiles: { + lexicon: 1, + id: 'app.rocksky.dropbox.getFiles', + defs: { + main: { + type: 'query', + description: 'Retrieve a list of files from Dropbox', + parameters: { + type: 'params', + properties: { + at: { + type: 'string', + description: 'Path to the Dropbox folder or root directory', + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'ref', + ref: 'lex:app.rocksky.dropbox.defs#fileListView', + }, + }, + }, + }, + }, + AppRockskyDropboxGetMetadata: { + lexicon: 1, + id: 'app.rocksky.dropbox.getMetadata', + defs: { + main: { + type: 'query', + description: 'Retrieve metadata of a file or folder in Dropbox', + parameters: { + type: 'params', + required: ['path'], + properties: { + path: { + type: 'string', + description: 'Path to the file or folder in Dropbox', + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'ref', + ref: 'lex:app.rocksky.dropbox.defs#fileView', + }, + }, + }, + }, + }, + AppRockskyDropboxGetTemporaryLink: { + lexicon: 1, + id: 'app.rocksky.dropbox.getTemporaryLink', + defs: { + main: { + type: 'query', + description: 'Retrieve a temporary link to access a file in Dropbox', + parameters: { + type: 'params', + required: ['path'], + properties: { + path: { + type: 'string', + description: 'Path to the file in Dropbox', + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'ref', + ref: 'lex:app.rocksky.dropbox.defs#temporaryLinkView', + }, + }, + }, + }, + }, + AppRockskyFeedDefs: { + lexicon: 1, + id: 'app.rocksky.feed.defs', + defs: { + searchResultsView: { + type: 'object', + properties: { + hits: { + type: 'array', + items: { + type: 'union', + refs: [ + 'lex:app.rocksky.song.defs#songViewBasic', + 'lex:app.rocksky.album.defs#albumViewBasic', + 'lex:app.rocksky.artist.defs#artistViewBasic', + 'lex:app.rocksky.playlist.defs#playlistViewBasic', + 'lex:app.rocksky.actor.defs#profileViewBasic', + ], + }, + }, + processingTimeMs: { + type: 'integer', + }, + limit: { + type: 'integer', + }, + offset: { + type: 'integer', + }, + estimatedTotalHits: { + type: 'integer', + }, + }, + }, + nowPlayingView: { + type: 'object', + properties: { + album: { + type: 'string', + }, + albumArt: { + type: 'string', + format: 'uri', + }, + albumArtist: { + type: 'string', + }, + albumUri: { + type: 'string', + format: 'at-uri', + }, + artist: { + type: 'string', + }, + artistUri: { + type: 'string', + format: 'at-uri', + }, + avatar: { + type: 'string', + format: 'uri', + }, + createdAt: { + type: 'string', + }, + did: { + type: 'string', + format: 'at-identifier', + }, + handle: { + type: 'string', + }, + id: { + type: 'string', + }, + title: { + type: 'string', + }, + trackId: { + type: 'string', + }, + trackUri: { + type: 'string', + format: 'at-uri', + }, + uri: { + type: 'string', + format: 'at-uri', + }, + }, + }, + nowPlayingsView: { + type: 'object', + properties: { + nowPlayings: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:app.rocksky.feed.defs#nowPlayingView', + }, + }, + }, + }, + }, + }, + AppRockskyFeedGetNowPlayings: { + lexicon: 1, + id: 'app.rocksky.feed.getNowPlayings', + defs: { + main: { + type: 'query', + description: 'Get all currently playing tracks by users', + parameters: { + type: 'params', + properties: { + size: { + type: 'integer', + description: + 'The maximum number of now playing tracks to return.', + minimum: 1, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'ref', + ref: 'lex:app.rocksky.feed.defs#nowPlayingsView', + }, + }, + }, + }, + }, + AppRockskyFeedSearch: { + lexicon: 1, + id: 'app.rocksky.feed.search', + defs: { + main: { + type: 'query', + description: 'Search for content in the feed', + parameters: { + type: 'params', + required: ['query'], + properties: { + query: { + type: 'string', + description: 'The search query string', + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'ref', + ref: 'lex:app.rocksky.feed.defs#searchResultsView', + }, + }, + }, + }, + }, + AppRockskyGoogledriveDefs: { + lexicon: 1, + id: 'app.rocksky.googledrive.defs', + defs: { + fileView: { + type: 'object', + properties: { + id: { + type: 'string', + description: 'The unique identifier of the file.', + }, + }, + }, + fileListView: { + type: 'object', + properties: { + files: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:app.rocksky.googledrive.defs#fileView', + }, + }, + }, + }, + }, + }, + AppRockskyGoogledriveDownloadFile: { + lexicon: 1, + id: 'app.rocksky.googledrive.downloadFile', + defs: { + main: { + type: 'query', + description: + 'Download a file from Google Drive by its unique identifier', + parameters: { + type: 'params', + required: ['fileId'], + properties: { + fileId: { + type: 'string', + description: 'The unique identifier of the file to download', + }, + }, + }, + output: { + encoding: 'application/octet-stream', + }, + }, + }, + }, + AppRockskyGoogledriveGetFile: { + lexicon: 1, + id: 'app.rocksky.googledrive.getFile', + defs: { + main: { + type: 'query', + description: 'Get a file from Google Drive by its unique identifier', + parameters: { + type: 'params', + required: ['fileId'], + properties: { + fileId: { + type: 'string', + description: 'The unique identifier of the file to retrieve', + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'ref', + ref: 'lex:app.rocksky.googledrive.defs#fileView', + }, + }, + }, + }, + }, + AppRockskyGoogledriveGetFiles: { + lexicon: 1, + id: 'app.rocksky.googledrive.getFiles', + defs: { + main: { + type: 'query', + description: 'Get a list of files from Google Drive', + parameters: { + type: 'params', + properties: { + at: { + type: 'string', + description: 'Path to the Google Drive folder or root directory', + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'ref', + ref: 'lex:app.rocksky.googledrive.defs#fileListView', + }, + }, + }, + }, + }, + AppRockskyLikeDislikeShout: { + lexicon: 1, + id: 'app.rocksky.like.dislikeShout', + defs: { + main: { + type: 'procedure', + description: 'Dislike a shout', + input: { + encoding: 'application/json', + schema: { + type: 'object', + properties: { + uri: { + type: 'string', + description: 'The unique identifier of the shout to dislike', + format: 'at-uri', + }, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'ref', + ref: 'lex:app.rocksky.shout.defs#shoutView', + }, + }, + }, + }, + }, + AppRockskyLikeDislikeSong: { + lexicon: 1, + id: 'app.rocksky.like.dislikeSong', + defs: { + main: { + type: 'procedure', + description: 'Dislike a song', + input: { + encoding: 'application/json', + schema: { + type: 'object', + properties: { + uri: { + type: 'string', + description: 'The unique identifier of the song to dislike', + format: 'at-uri', + }, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'ref', + ref: 'lex:app.rocksky.song.defs#songViewDetailed', + }, + }, + }, + }, + }, + AppRockskyLike: { + lexicon: 1, + id: 'app.rocksky.like', + defs: { + main: { + type: 'record', + description: 'A declaration of a like.', + key: 'tid', + record: { + type: 'object', + required: ['createdAt', 'subject'], + properties: { + createdAt: { + type: 'string', + description: 'The date when the like was created.', + format: 'datetime', + }, + subject: { + type: 'ref', + ref: 'lex:com.atproto.repo.strongRef', + }, + }, + }, + }, + }, + }, + AppRockskyLikeLikeShout: { + lexicon: 1, + id: 'app.rocksky.like.likeShout', + defs: { + main: { + type: 'procedure', + description: 'Like a shout', + input: { + encoding: 'application/json', + schema: { + type: 'object', + properties: { + uri: { + type: 'string', + description: 'The unique identifier of the shout to like', + format: 'at-uri', + }, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'ref', + ref: 'lex:app.rocksky.shout.defs#shoutView', + }, + }, + }, + }, + }, + AppRockskyLikeLikeSong: { + lexicon: 1, + id: 'app.rocksky.like.likeSong', + defs: { + main: { + type: 'procedure', + description: 'Like a song', + input: { + encoding: 'application/json', + schema: { + type: 'object', + properties: { + uri: { + type: 'string', + description: 'The unique identifier of the song to like', + format: 'at-uri', + }, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'ref', + ref: 'lex:app.rocksky.song.defs#songViewDetailed', + }, + }, + }, + }, + }, + AppRockskyPlayerDefs: { + lexicon: 1, + id: 'app.rocksky.player.defs', + defs: { + currentlyPlayingViewDetailed: { + type: 'object', + properties: { + title: { + type: 'string', + description: 'The title of the currently playing track', + }, + }, + }, + }, + }, + AppRockskyPlayerGetCurrentlyPlaying: { + lexicon: 1, + id: 'app.rocksky.player.getCurrentlyPlaying', + defs: { + main: { + type: 'query', + description: 'Get the currently playing track', + parameters: { + type: 'params', + properties: { + actor: { + type: 'string', + description: + 'Handle or DID of the actor to retrieve the currently playing track for. If not provided, defaults to the current user.', + format: 'at-identifier', + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'ref', + ref: 'lex:app.rocksky.player.defs#currentlyPlayingViewDetailed', + }, + }, + }, + }, + }, + AppRockskyPlayerNext: { + lexicon: 1, + id: 'app.rocksky.player.next', + defs: { + main: { + type: 'procedure', + description: 'Play the next track in the queue', + }, + }, + }, + AppRockskyPlayerPause: { + lexicon: 1, + id: 'app.rocksky.player.pause', + defs: { + main: { + type: 'procedure', + description: 'Pause the currently playing track', + }, + }, + }, + AppRockskyPlayerPlay: { + lexicon: 1, + id: 'app.rocksky.player.play', + defs: { + main: { + type: 'procedure', + description: 'Resume playback of the currently paused track', + }, + }, + }, + AppRockskyPlayerPrevious: { + lexicon: 1, + id: 'app.rocksky.player.previous', + defs: { + main: { + type: 'procedure', + description: 'Play the previous track in the queue', + }, + }, + }, + AppRockskyPlayerSeek: { + lexicon: 1, + id: 'app.rocksky.player.seek', + defs: { + main: { + type: 'procedure', + description: + 'Seek to a specific position in the currently playing track', + parameters: { + type: 'params', + required: ['position'], + properties: { + position: { + type: 'integer', + description: 'The position in seconds to seek to', + }, + }, + }, + }, + }, + }, + AppRockskyPlaylistDefs: { + lexicon: 1, + id: 'app.rocksky.playlist.defs', + defs: { + playlistViewDetailed: { + type: 'object', + description: + 'Detailed view of a playlist, including its tracks and metadata', + properties: { + id: { + type: 'string', + description: 'The unique identifier of the playlist.', + }, + title: { + type: 'string', + description: 'The title of the playlist.', + }, + uri: { + type: 'string', + description: 'The URI of the playlist.', + format: 'at-uri', + }, + curatorDid: { + type: 'string', + description: 'The DID of the curator of the playlist.', + format: 'at-identifier', + }, + curatorHandle: { + type: 'string', + description: 'The handle of the curator of the playlist.', + format: 'at-identifier', + }, + curatorName: { + type: 'string', + description: 'The name of the curator of the playlist.', + }, + curatorAvatarUrl: { + type: 'string', + description: 'The URL of the avatar image of the curator.', + format: 'uri', + }, + description: { + type: 'string', + description: 'A description of the playlist.', + }, + coverImageUrl: { + type: 'string', + description: 'The URL of the cover image for the playlist.', + format: 'uri', + }, + createdAt: { + type: 'string', + description: 'The date and time when the playlist was created.', + format: 'datetime', + }, + tracks: { + type: 'array', + description: 'A list of tracks in the playlist.', + items: { + type: 'ref', + ref: 'lex:app.rocksky.song.defs#songViewBasic', + }, + }, + }, + }, + playlistViewBasic: { + type: 'object', + description: 'Basic view of a playlist, including its metadata', + properties: { + id: { + type: 'string', + description: 'The unique identifier of the playlist.', + }, + title: { + type: 'string', + description: 'The title of the playlist.', + }, + uri: { + type: 'string', + description: 'The URI of the playlist.', + format: 'at-uri', + }, + curatorDid: { + type: 'string', + description: 'The DID of the curator of the playlist.', + format: 'at-identifier', + }, + curatorHandle: { + type: 'string', + description: 'The handle of the curator of the playlist.', + format: 'at-identifier', + }, + curatorName: { + type: 'string', + description: 'The name of the curator of the playlist.', + }, + curatorAvatarUrl: { + type: 'string', + description: 'The URL of the avatar image of the curator.', + format: 'uri', + }, + description: { + type: 'string', + description: 'A description of the playlist.', + }, + coverImageUrl: { + type: 'string', + description: 'The URL of the cover image for the playlist.', + format: 'uri', + }, + createdAt: { + type: 'string', + description: 'The date and time when the playlist was created.', + format: 'datetime', + }, + trackCount: { + type: 'integer', + description: 'The number of tracks in the playlist.', + minimum: 0, + }, + }, + }, + }, + }, + AppRockskyPlaylistGetPlaylist: { + lexicon: 1, + id: 'app.rocksky.playlist.getPlaylist', + defs: { + main: { + type: 'query', + description: 'Retrieve a playlist by its ID', + parameters: { + type: 'params', + required: ['uri'], + properties: { + uri: { + type: 'string', + description: 'The URI of the playlist to retrieve.', + format: 'at-uri', + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'ref', + ref: 'lex:app.rocksky.playlist.defs#playlistViewDetailed', + }, + }, + }, + }, + }, + AppRockskyPlaylistGetPlaylists: { + lexicon: 1, + id: 'app.rocksky.playlist.getPlaylists', + defs: { + main: { + type: 'query', + description: 'Retrieve a list of playlists', + parameters: { + type: 'params', + properties: { + limit: { + type: 'integer', + description: 'The maximum number of playlists to return.', + }, + offset: { + type: 'integer', + description: + 'The offset for pagination, used to skip a number of playlists.', + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + properties: { + playlists: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:app.rocksky.playlist.defs#playlistViewBasic', + }, + }, + }, + }, + }, + }, + }, + }, + AppRockskyPlaylist: { + lexicon: 1, + id: 'app.rocksky.playlist', + defs: { + main: { + type: 'record', + description: 'A declaration of a playlist.', + key: 'tid', + record: { + type: 'object', + required: ['name', 'createdAt'], + properties: { + name: { + type: 'string', + description: 'The name of the playlist.', + minLength: 1, + maxLength: 512, + }, + description: { + type: 'string', + description: 'The playlist description.', + minLength: 1, + maxLength: 256, + }, + picture: { + type: 'blob', + description: 'The picture of the playlist.', + accept: ['image/png', 'image/jpeg'], + maxSize: 2000000, + }, + tracks: { + type: 'array', + description: 'The tracks in the playlist.', + items: { + type: 'ref', + ref: 'lex:app.rocksky.song#record', + }, + }, + createdAt: { + type: 'string', + description: 'The date the playlist was created.', + format: 'datetime', + }, + spotifyLink: { + type: 'string', + description: 'The Spotify link of the playlist.', + }, + tidalLink: { + type: 'string', + description: 'The Tidal link of the playlist.', + }, + youtubeLink: { + type: 'string', + description: 'The YouTube link of the playlist.', + }, + appleMusicLink: { + type: 'string', + description: 'The Apple Music link of the playlist.', + }, + }, + }, + }, + }, + }, + AppRockskyRadioDefs: { + lexicon: 1, + id: 'app.rocksky.radio.defs', + defs: { + radioViewBasic: { + type: 'object', + properties: { + id: { + type: 'string', + description: 'The unique identifier of the radio.', + }, + name: { + type: 'string', + description: 'The name of the radio.', + }, + description: { + type: 'string', + description: 'A brief description of the radio.', + }, + createdAt: { + type: 'string', + description: 'The date and time when the radio was created.', + format: 'datetime', + }, + }, + }, + radioViewDetailed: { + type: 'object', + properties: { + id: { + type: 'string', + description: 'The unique identifier of the radio.', + }, + name: { + type: 'string', + description: 'The name of the radio.', + }, + description: { + type: 'string', + description: 'A brief description of the radio.', + }, + website: { + type: 'string', + description: 'The website of the radio.', + format: 'uri', + }, + url: { + type: 'string', + description: 'The streaming URL of the radio.', + format: 'uri', + }, + genre: { + type: 'string', + description: 'The genre of the radio.', + }, + logo: { + type: 'string', + description: 'The logo of the radio station.', + }, + createdAt: { + type: 'string', + description: 'The date and time when the radio was created.', + format: 'datetime', + }, + }, + }, + }, + }, + AppRockskyRadio: { + lexicon: 1, + id: 'app.rocksky.radio', + defs: { + main: { + type: 'record', + description: 'A declaration of a radio station.', + key: 'tid', + record: { + type: 'object', + required: ['name', 'url', 'createdAt'], + properties: { + name: { + type: 'string', + description: 'The name of the radio station.', + minLength: 1, + maxLength: 512, + }, + url: { + type: 'string', + description: 'The URL of the radio station.', + format: 'uri', + }, + description: { + type: 'string', + description: 'A description of the radio station.', + minLength: 1, + maxLength: 1000, + }, + genre: { + type: 'string', + description: 'The genre of the radio station.', + minLength: 1, + maxLength: 256, + }, + logo: { + type: 'blob', + description: 'The logo of the radio station.', + accept: ['image/png', 'image/jpeg'], + maxSize: 2000000, + }, + website: { + type: 'string', + description: 'The website of the radio station.', + format: 'uri', + }, + createdAt: { + type: 'string', + description: 'The date when the radio station was created.', + format: 'datetime', + }, + }, + }, + }, + }, + }, + AppRockskyScrobbleCreateScrobble: { + lexicon: 1, + id: 'app.rocksky.scrobble.createScrobble', + defs: { + main: { + type: 'procedure', + description: 'Create a new scrobble', + input: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['title', 'artist'], + properties: { + title: { + type: 'string', + description: 'The title of the track being scrobbled', + }, + artist: { + type: 'string', + description: 'The artist of the track being scrobbled', + }, + album: { + type: 'string', + description: 'The album of the track being scrobbled', + }, + duration: { + type: 'integer', + description: 'The duration of the track in seconds', + }, + mbId: { + type: 'string', + description: 'The MusicBrainz ID of the track, if available', + }, + albumArt: { + type: 'string', + description: 'The URL of the album art for the track', + format: 'uri', + }, + trackNumber: { + type: 'integer', + description: 'The track number of the track in the album', + }, + releaseDate: { + type: 'string', + description: + 'The release date of the track, formatted as YYYY-MM-DD', + }, + year: { + type: 'integer', + description: 'The year the track was released', + }, + discNumber: { + type: 'integer', + description: + 'The disc number of the track in the album, if applicable', + }, + lyrics: { + type: 'string', + description: 'The lyrics of the track, if available', + }, + composer: { + type: 'string', + description: 'The composer of the track, if available', + }, + copyrightMessage: { + type: 'string', + description: + 'The copyright message for the track, if available', + }, + label: { + type: 'string', + description: 'The record label of the track, if available', + }, + artistPicture: { + type: 'string', + description: "The URL of the artist's picture, if available", + format: 'uri', + }, + spotifyLink: { + type: 'string', + description: 'The Spotify link for the track, if available', + format: 'uri', + }, + lastfmLink: { + type: 'string', + description: 'The Last.fm link for the track, if available', + format: 'uri', + }, + tidalLink: { + type: 'string', + description: 'The Tidal link for the track, if available', + format: 'uri', + }, + appleMusicLink: { + type: 'string', + description: 'The Apple Music link for the track, if available', + format: 'uri', + }, + youtubeLink: { + type: 'string', + description: 'The Youtube link for the track, if available', + format: 'uri', + }, + deezerLink: { + type: 'string', + description: 'The Deezer link for the track, if available', + format: 'uri', + }, + timestamp: { + type: 'integer', + description: + 'The timestamp of the scrobble in milliseconds since epoch', + }, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'ref', + ref: 'lex:app.rocksky.scrobble.defs#scrobbleViewBasic', + }, + }, + }, + }, + }, + AppRockskyScrobbleDefs: { + lexicon: 1, + id: 'app.rocksky.scrobble.defs', + defs: { + scrobbleViewBasic: { + type: 'object', + properties: { + id: { + type: 'string', + description: 'The unique identifier of the scrobble.', + }, + user: { + type: 'string', + description: 'The handle of the user who created the scrobble.', + }, + title: { + type: 'string', + description: 'The title of the scrobble.', + }, + artist: { + type: 'string', + description: 'The artist of the song.', + }, + artistUri: { + type: 'string', + description: 'The URI of the artist.', + format: 'at-uri', + }, + album: { + type: 'string', + description: 'The album of the song.', + }, + albumUri: { + type: 'string', + description: 'The URI of the album.', + format: 'at-uri', + }, + cover: { + type: 'string', + description: 'The album art URL of the song.', + format: 'uri', + }, + date: { + type: 'string', + description: 'The timestamp when the scrobble was created.', + format: 'datetime', + }, + uri: { + type: 'string', + description: 'The URI of the scrobble.', + format: 'uri', + }, + sha256: { + type: 'string', + description: 'The SHA256 hash of the scrobble data.', + }, + }, + }, + scrobbleViewDetailed: { + type: 'object', + properties: { + id: { + type: 'string', + description: 'The unique identifier of the scrobble.', + }, + user: { + type: 'string', + description: 'The handle of the user who created the scrobble.', + }, + title: { + type: 'string', + description: 'The title of the scrobble.', + }, + artist: { + type: 'string', + description: 'The artist of the song.', + }, + artistUri: { + type: 'string', + description: 'The URI of the artist.', + format: 'at-uri', + }, + album: { + type: 'string', + description: 'The album of the song.', + }, + albumUri: { + type: 'string', + description: 'The URI of the album.', + format: 'at-uri', + }, + cover: { + type: 'string', + description: 'The album art URL of the song.', + format: 'uri', + }, + date: { + type: 'string', + description: 'The timestamp when the scrobble was created.', + format: 'datetime', + }, + uri: { + type: 'string', + description: 'The URI of the scrobble.', + format: 'uri', + }, + sha256: { + type: 'string', + description: 'The SHA256 hash of the scrobble data.', + }, + listeners: { + type: 'integer', + description: 'The number of listeners', + }, + scrobbles: { + type: 'integer', + description: 'The number of scrobbles for this song', + }, + }, + }, + }, + }, + AppRockskyScrobbleGetScrobble: { + lexicon: 1, + id: 'app.rocksky.scrobble.getScrobble', + defs: { + main: { + type: 'query', + description: 'Get a scrobble by its unique identifier', + parameters: { + type: 'params', + required: ['uri'], + properties: { + uri: { + type: 'string', + description: 'The unique identifier of the scrobble', + format: 'at-uri', + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'ref', + ref: 'lex:app.rocksky.scrobble.defs#scrobbleViewDetailed', + }, + }, + }, + }, + }, + AppRockskyScrobbleGetScrobbles: { + lexicon: 1, + id: 'app.rocksky.scrobble.getScrobbles', + defs: { + main: { + type: 'query', + description: 'Get scrobbles all scrobbles', + parameters: { + type: 'params', + properties: { + did: { + type: 'string', + description: 'The DID or handle of the actor', + format: 'at-identifier', + }, + limit: { + type: 'integer', + description: 'The maximum number of scrobbles to return', + minimum: 1, + }, + offset: { + type: 'integer', + description: 'The offset for pagination', + minimum: 0, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + properties: { + scrobbles: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:app.rocksky.scrobble.defs#scrobbleViewBasic', + }, + }, + }, + }, + }, + }, + }, + }, + AppRockskyScrobble: { + lexicon: 1, + id: 'app.rocksky.scrobble', + defs: { + main: { + type: 'record', + description: 'A declaration of a scrobble.', + key: 'tid', + record: { + type: 'object', + required: [ + 'title', + 'artist', + 'album', + 'albumArtist', + 'duration', + 'createdAt', + ], + properties: { + title: { + type: 'string', + description: 'The title of the song.', + minLength: 1, + maxLength: 512, + }, + artist: { + type: 'string', + description: 'The artist of the song.', + minLength: 1, + maxLength: 256, + }, + albumArtist: { + type: 'string', + description: 'The album artist of the song.', + minLength: 1, + maxLength: 256, + }, + album: { + type: 'string', + description: 'The album of the song.', + minLength: 1, + maxLength: 256, + }, + duration: { + type: 'integer', + description: 'The duration of the song in seconds.', + minimum: 1, + }, + trackNumber: { + type: 'integer', + description: 'The track number of the song in the album.', + minimum: 1, + }, + discNumber: { + type: 'integer', + description: 'The disc number of the song in the album.', + minimum: 1, + }, + releaseDate: { + type: 'string', + description: 'The release date of the song.', + format: 'datetime', + }, + year: { + type: 'integer', + description: 'The year the song was released.', + }, + genre: { + type: 'string', + description: 'The genre of the song.', + maxLength: 256, + }, + tags: { + type: 'array', + description: 'The tags of the song.', + items: { + type: 'string', + minLength: 1, + maxLength: 256, + }, + }, + composer: { + type: 'string', + description: 'The composer of the song.', + maxLength: 256, + }, + lyrics: { + type: 'string', + description: 'The lyrics of the song.', + maxLength: 10000, + }, + copyrightMessage: { + type: 'string', + description: 'The copyright message of the song.', + maxLength: 256, + }, + wiki: { + type: 'string', + description: 'Informations about the song', + maxLength: 10000, + }, + albumArt: { + type: 'blob', + description: 'The album art of the song.', + accept: ['image/png', 'image/jpeg'], + maxSize: 2000000, + }, + youtubeLink: { + type: 'string', + description: 'The YouTube link of the song.', + format: 'uri', + }, + spotifyLink: { + type: 'string', + description: 'The Spotify link of the song.', + format: 'uri', + }, + tidalLink: { + type: 'string', + description: 'The Tidal link of the song.', + format: 'uri', + }, + appleMusicLink: { + type: 'string', + description: 'The Apple Music link of the song.', + format: 'uri', + }, + createdAt: { + type: 'string', + description: 'The date when the song was created.', + format: 'datetime', + }, + mbid: { + type: 'string', + description: 'The MusicBrainz ID of the song.', + }, + label: { + type: 'string', + description: 'The label of the song.', + maxLength: 256, + }, + }, + }, + }, + }, + }, + AppRockskyShoutCreateShout: { + lexicon: 1, + id: 'app.rocksky.shout.createShout', + defs: { + main: { + type: 'procedure', + description: 'Create a new shout', + input: { + encoding: 'application/json', + schema: { + type: 'object', + properties: { + message: { + type: 'string', + description: 'The content of the shout', + minLength: 1, + }, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'ref', + ref: 'lex:app.rocksky.shout.defs#shoutView', + }, + }, + }, + }, + }, + AppRockskyShoutDefs: { + lexicon: 1, + id: 'app.rocksky.shout.defs', + defs: { + author: { + type: 'object', + properties: { + id: { + type: 'string', + description: 'The unique identifier of the author.', + }, + did: { + type: 'string', + description: 'The decentralized identifier (DID) of the author.', + format: 'at-identifier', + }, + handle: { + type: 'string', + description: 'The handle of the author.', + format: 'at-identifier', + }, + displayName: { + type: 'string', + description: 'The display name of the author.', + }, + avatar: { + type: 'string', + description: "The URL of the author's avatar image.", + format: 'uri', + }, + }, + }, + shoutView: { + type: 'object', + properties: { + id: { + type: 'string', + description: 'The unique identifier of the shout.', + }, + message: { + type: 'string', + description: 'The content of the shout.', + }, + parent: { + type: 'string', + description: + 'The ID of the parent shout if this is a reply, otherwise null.', + }, + createdAt: { + type: 'string', + description: 'The date and time when the shout was created.', + format: 'datetime', + }, + author: { + type: 'ref', + description: 'The author of the shout.', + ref: 'lex:app.rocksky.shout.defs#author', + }, + }, + }, + }, + }, + AppRockskyShoutGetAlbumShouts: { + lexicon: 1, + id: 'app.rocksky.shout.getAlbumShouts', + defs: { + main: { + type: 'query', + description: 'Get shouts for an album', + parameters: { + type: 'params', + required: ['uri'], + properties: { + uri: { + type: 'string', + description: + 'The unique identifier of the album to retrieve shouts for', + format: 'at-uri', + }, + limit: { + type: 'integer', + description: 'The maximum number of shouts to return', + minimum: 1, + }, + offset: { + type: 'integer', + description: + 'The number of shouts to skip before starting to collect the result set', + minimum: 0, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + properties: { + shouts: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:app.rocksky.shout.defs#shoutViewBasic', + }, + }, + }, + }, + }, + }, + }, + }, + AppRockskyShoutGetArtistShouts: { + lexicon: 1, + id: 'app.rocksky.shout.getArtistShouts', + defs: { + main: { + type: 'query', + description: 'Get shouts for an artist', + parameters: { + type: 'params', + required: ['uri'], + properties: { + uri: { + type: 'string', + description: 'The URI of the artist to retrieve shouts for', + format: 'at-uri', + }, + limit: { + type: 'integer', + description: 'The maximum number of shouts to return', + minimum: 1, + }, + offset: { + type: 'integer', + description: + 'The number of shouts to skip before starting to collect the result set', + minimum: 0, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + properties: { + shouts: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:app.rocksky.shout.defs#shoutViewBasic', + }, + }, + }, + }, + }, + }, + }, + }, + AppRockskyShoutGetProfileShouts: { + lexicon: 1, + id: 'app.rocksky.shout.getProfileShouts', + defs: { + main: { + type: 'query', + description: "Get the shouts of an actor's profile", + parameters: { + type: 'params', + required: ['did'], + properties: { + did: { + type: 'string', + description: 'The DID or handle of the actor', + format: 'at-identifier', + }, + offset: { + type: 'integer', + description: 'The offset for pagination', + minimum: 0, + }, + limit: { + type: 'integer', + description: 'The maximum number of shouts to return', + minimum: 1, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + properties: { + shouts: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:app.rocksky.shout.defs#shoutViewBasic', + }, + }, + }, + }, + }, + }, + }, + }, + AppRockskyShoutGetShoutReplies: { + lexicon: 1, + id: 'app.rocksky.shout.getShoutReplies', + defs: { + main: { + type: 'query', + description: 'Get replies to a shout', + parameters: { + type: 'params', + required: ['uri'], + properties: { + uri: { + type: 'string', + description: 'The URI of the shout to retrieve replies for', + format: 'at-uri', + }, + limit: { + type: 'integer', + description: 'The maximum number of shouts to return', + minimum: 1, + }, + offset: { + type: 'integer', + description: + 'The number of shouts to skip before starting to collect the result set', + minimum: 0, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + properties: { + shouts: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:app.rocksky.shout.defs#shoutViewBasic', + }, + }, + }, + }, + }, + }, + }, + }, + AppRockskyShoutGetTrackShouts: { + lexicon: 1, + id: 'app.rocksky.shout.getTrackShouts', + defs: { + main: { + type: 'query', + description: 'Get all shouts for a specific track', + parameters: { + type: 'params', + required: ['uri'], + properties: { + uri: { + type: 'string', + description: 'The URI of the track to retrieve shouts for', + format: 'at-uri', + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + properties: { + shouts: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:app.rocksky.shout.defs#shoutViewBasic', + }, + }, + }, + }, + }, + }, + }, + }, + AppRockskyShoutRemoveShout: { + lexicon: 1, + id: 'app.rocksky.shout.removeShout', + defs: { + main: { + type: 'procedure', + description: 'Remove a shout by its ID', + parameters: { + type: 'params', + required: ['id'], + properties: { + id: { + type: 'string', + description: 'The ID of the shout to be removed', + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'ref', + ref: 'lex:app.rocksky.shout.defs#shoutView', + }, + }, + }, + }, + }, + AppRockskyShoutReplyShout: { + lexicon: 1, + id: 'app.rocksky.shout.replyShout', + defs: { + main: { + type: 'procedure', + description: 'Reply to a shout', + input: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['shoutId', 'message'], + properties: { + shoutId: { + type: 'string', + description: 'The unique identifier of the shout to reply to', + }, + message: { + type: 'string', + description: 'The content of the reply', + minLength: 1, + }, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'ref', + ref: 'lex:app.rocksky.shout.defs#shoutView', + }, + }, + }, + }, + }, + AppRockskyShoutReportShout: { + lexicon: 1, + id: 'app.rocksky.shout.reportShout', + defs: { + main: { + type: 'procedure', + description: 'Report a shout for moderation', + input: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['shoutId'], + properties: { + shoutId: { + type: 'string', + description: 'The unique identifier of the shout to report', + }, + reason: { + type: 'string', + description: 'The reason for reporting the shout', + minLength: 1, + }, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'ref', + ref: 'lex:app.rocksky.shout.defs#shoutView', + }, + }, + }, + }, + }, + AppRockskyShout: { + lexicon: 1, + id: 'app.rocksky.shout', + defs: { + main: { + type: 'record', + description: 'A declaration of a shout.', + key: 'tid', + record: { + type: 'object', + required: ['message', 'createdAt', 'subject'], + properties: { + message: { + type: 'string', + description: 'The message of the shout.', + minLength: 1, + maxLength: 1000, + }, + createdAt: { + type: 'string', + description: 'The date when the shout was created.', + format: 'datetime', + }, + parent: { + type: 'ref', + ref: 'lex:com.atproto.repo.strongRef', + }, + subject: { + type: 'ref', + ref: 'lex:com.atproto.repo.strongRef', + }, + }, + }, + }, + }, + }, + AppRockskySongCreateSong: { + lexicon: 1, + id: 'app.rocksky.song.createSong', + defs: { + main: { + type: 'procedure', + description: 'Create a new song', + input: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['title', 'artist', 'album', 'albumArtist'], + properties: { + title: { + type: 'string', + description: 'The title of the song', + }, + artist: { + type: 'string', + description: 'The artist of the song', + }, + albumArtist: { + type: 'string', + description: + 'The album artist of the song, if different from the main artist', + }, + album: { + type: 'string', + description: 'The album of the song, if applicable', + }, + duration: { + type: 'integer', + description: 'The duration of the song in seconds', + }, + mbId: { + type: 'string', + description: 'The MusicBrainz ID of the song, if available', + }, + albumArt: { + type: 'string', + description: 'The URL of the album art for the song', + format: 'uri', + }, + trackNumber: { + type: 'integer', + description: + 'The track number of the song in the album, if applicable', + }, + releaseDate: { + type: 'string', + description: + 'The release date of the song, formatted as YYYY-MM-DD', + }, + year: { + type: 'integer', + description: 'The year the song was released', + }, + discNumber: { + type: 'integer', + description: + 'The disc number of the song in the album, if applicable', + }, + lyrics: { + type: 'string', + description: 'The lyrics of the song, if available', + }, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'ref', + ref: 'lex:app.rocksky.song.defs#songViewDetailed', + }, + }, + }, + }, + }, + AppRockskySongDefs: { + lexicon: 1, + id: 'app.rocksky.song.defs', + defs: { + songViewBasic: { + type: 'object', + properties: { + id: { + type: 'string', + description: 'The unique identifier of the song.', + }, + title: { + type: 'string', + description: 'The title of the song.', + }, + artist: { + type: 'string', + description: 'The artist of the song.', + }, + albumArtist: { + type: 'string', + description: 'The artist of the album the song belongs to.', + }, + albumArt: { + type: 'string', + description: 'The URL of the album art image.', + format: 'uri', + }, + uri: { + type: 'string', + description: 'The URI of the song.', + format: 'at-uri', + }, + album: { + type: 'string', + description: 'The album of the song.', + }, + duration: { + type: 'integer', + description: 'The duration of the song in milliseconds.', + }, + trackNumber: { + type: 'integer', + description: 'The track number of the song in the album.', + }, + discNumber: { + type: 'integer', + description: 'The disc number of the song in the album.', + }, + playCount: { + type: 'integer', + description: 'The number of times the song has been played.', + minimum: 0, + }, + uniqueListeners: { + type: 'integer', + description: + 'The number of unique listeners who have played the song.', + minimum: 0, + }, + albumUri: { + type: 'string', + description: 'The URI of the album the song belongs to.', + format: 'at-uri', + }, + artistUri: { + type: 'string', + description: 'The URI of the artist of the song.', + format: 'at-uri', + }, + sha256: { + type: 'string', + description: 'The SHA256 hash of the song.', + }, + createdAt: { + type: 'string', + description: 'The timestamp when the song was created.', + format: 'datetime', + }, + }, + }, + songViewDetailed: { + type: 'object', + properties: { + id: { + type: 'string', + description: 'The unique identifier of the song.', + }, + title: { + type: 'string', + description: 'The title of the song.', + }, + artist: { + type: 'string', + description: 'The artist of the song.', + }, + albumArtist: { + type: 'string', + description: 'The artist of the album the song belongs to.', + }, + albumArt: { + type: 'string', + description: 'The URL of the album art image.', + format: 'uri', + }, + uri: { + type: 'string', + description: 'The URI of the song.', + format: 'at-uri', + }, + album: { + type: 'string', + description: 'The album of the song.', + }, + duration: { + type: 'integer', + description: 'The duration of the song in milliseconds.', + }, + trackNumber: { + type: 'integer', + description: 'The track number of the song in the album.', + }, + discNumber: { + type: 'integer', + description: 'The disc number of the song in the album.', + }, + playCount: { + type: 'integer', + description: 'The number of times the song has been played.', + minimum: 0, + }, + uniqueListeners: { + type: 'integer', + description: + 'The number of unique listeners who have played the song.', + minimum: 0, + }, + albumUri: { + type: 'string', + description: 'The URI of the album the song belongs to.', + format: 'at-uri', + }, + artistUri: { + type: 'string', + description: 'The URI of the artist of the song.', + format: 'at-uri', + }, + sha256: { + type: 'string', + description: 'The SHA256 hash of the song.', + }, + createdAt: { + type: 'string', + description: 'The timestamp when the song was created.', + format: 'datetime', + }, + }, + }, + }, + }, + AppRockskySongGetSong: { + lexicon: 1, + id: 'app.rocksky.song.getSong', + defs: { + main: { + type: 'query', + description: 'Get a song by its uri', + parameters: { + type: 'params', + required: ['uri'], + properties: { + uri: { + type: 'string', + description: 'The unique identifier of the song to retrieve', + format: 'at-uri', + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'ref', + ref: 'lex:app.rocksky.song.defs#songViewDetailed', + }, + }, + }, + }, + }, + AppRockskySongGetSongs: { + lexicon: 1, + id: 'app.rocksky.song.getSongs', + defs: { + main: { + type: 'query', + description: 'Get songs', + parameters: { + type: 'params', + properties: { + limit: { + type: 'integer', + description: 'The maximum number of songs to return', + minimum: 1, + }, + offset: { + type: 'integer', + description: 'The offset for pagination', + minimum: 0, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + properties: { + songs: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:app.rocksky.song.defs#songViewBasic', + }, + }, + }, + }, + }, + }, + }, + }, + AppRockskyLovedSong: { + lexicon: 1, + id: 'app.rocksky.lovedSong', + defs: { + main: { + type: 'record', + description: 'A declaration of a song.', + key: 'tid', + record: { + type: 'object', + required: ['title', 'artist', 'album', 'duration', 'createdAt'], + properties: { + title: { + type: 'string', + description: 'The title of the song.', + minLength: 1, + maxLength: 512, + }, + artist: { + type: 'string', + description: 'The artist of the song.', + minLength: 1, + maxLength: 256, + }, + albumArtist: { + type: 'string', + description: 'The album artist of the song.', + minLength: 1, + maxLength: 256, + }, + album: { + type: 'string', + description: 'The album of the song.', + minLength: 1, + maxLength: 256, + }, + duration: { + type: 'integer', + description: 'The duration of the song in seconds.', + minimum: 1, + }, + trackNumber: { + type: 'integer', + description: 'The track number of the song in the album.', + minimum: 1, + }, + discNumber: { + type: 'integer', + description: 'The disc number of the song in the album.', + minimum: 1, + }, + releaseDate: { + type: 'string', + description: 'The release date of the song.', + format: 'datetime', + }, + year: { + type: 'integer', + description: 'The year the song was released.', + }, + genre: { + type: 'string', + description: 'The genre of the song.', + maxLength: 256, + }, + tags: { + type: 'array', + description: 'The tags of the song.', + items: { + type: 'string', + minLength: 1, + maxLength: 256, + }, + }, + composer: { + type: 'string', + description: 'The composer of the song.', + maxLength: 256, + }, + lyrics: { + type: 'string', + description: 'The lyrics of the song.', + maxLength: 10000, + }, + copyrightMessage: { + type: 'string', + description: 'The copyright message of the song.', + minLength: 1, + maxLength: 256, + }, + wiki: { + type: 'string', + description: 'Informations about the song', + maxLength: 10000, + }, + albumArt: { + type: 'blob', + description: 'The album art of the song.', + accept: ['image/png', 'image/jpeg'], + maxSize: 2000000, + }, + youtubeLink: { + type: 'string', + description: 'The YouTube link of the song.', + format: 'uri', + }, + spotifyLink: { + type: 'string', + description: 'The Spotify link of the song.', + format: 'uri', + }, + tidalLink: { + type: 'string', + description: 'The Tidal link of the song.', + format: 'uri', + }, + appleMusicLink: { + type: 'string', + description: 'The Apple Music link of the song.', + format: 'uri', + }, + createdAt: { + type: 'string', + description: 'The date when the song was created.', + format: 'datetime', + }, + }, + }, + }, + }, + }, + AppRockskySong: { + lexicon: 1, + id: 'app.rocksky.song', + defs: { + main: { + type: 'record', + description: 'A declaration of a song.', + key: 'tid', + record: { + type: 'object', + required: [ + 'title', + 'artist', + 'album', + 'albumArtist', + 'duration', + 'createdAt', + ], + properties: { + title: { + type: 'string', + description: 'The title of the song.', + minLength: 1, + maxLength: 512, + }, + artist: { + type: 'string', + description: 'The artist of the song.', + minLength: 1, + maxLength: 256, + }, + albumArtist: { + type: 'string', + description: 'The album artist of the song.', + minLength: 1, + maxLength: 256, + }, + album: { + type: 'string', + description: 'The album of the song.', + minLength: 1, + maxLength: 256, + }, + duration: { + type: 'integer', + description: 'The duration of the song in seconds.', + minimum: 1, + }, + trackNumber: { + type: 'integer', + description: 'The track number of the song in the album.', + minimum: 1, + }, + discNumber: { + type: 'integer', + description: 'The disc number of the song in the album.', + minimum: 1, + }, + releaseDate: { + type: 'string', + description: 'The release date of the song.', + format: 'datetime', + }, + year: { + type: 'integer', + description: 'The year the song was released.', + }, + genre: { + type: 'string', + description: 'The genre of the song.', + minLength: 1, + maxLength: 256, + }, + tags: { + type: 'array', + description: 'The tags of the song.', + items: { + type: 'string', + minLength: 1, + maxLength: 256, + }, + }, + composer: { + type: 'string', + description: 'The composer of the song.', + maxLength: 256, + }, + lyrics: { + type: 'string', + description: 'The lyrics of the song.', + maxLength: 10000, + }, + copyrightMessage: { + type: 'string', + description: 'The copyright message of the song.', + maxLength: 256, + }, + wiki: { + type: 'string', + description: 'Informations about the song', + maxLength: 10000, + }, + albumArt: { + type: 'blob', + description: 'The album art of the song.', + accept: ['image/png', 'image/jpeg'], + maxSize: 2000000, + }, + youtubeLink: { + type: 'string', + description: 'The YouTube link of the song.', + format: 'uri', + }, + spotifyLink: { + type: 'string', + description: 'The Spotify link of the song.', + format: 'uri', + }, + tidalLink: { + type: 'string', + description: 'The Tidal link of the song.', + format: 'uri', + }, + appleMusicLink: { + type: 'string', + description: 'The Apple Music link of the song.', + format: 'uri', + }, + createdAt: { + type: 'string', + description: 'The date when the song was created.', + format: 'datetime', + }, + mbid: { + type: 'string', + description: 'The MusicBrainz ID of the song.', + }, + label: { + type: 'string', + description: 'The label of the song.', + maxLength: 256, + }, + }, + }, + }, + }, + }, + AppRockskySpotifyDefs: { + lexicon: 1, + id: 'app.rocksky.spotify.defs', + defs: { + spotifyTrackView: { + type: 'object', + properties: { + id: { + type: 'string', + description: 'The unique identifier of the Spotify track.', + }, + name: { + type: 'string', + description: 'The name of the track.', + }, + artist: { + type: 'string', + description: 'The name of the artist.', + }, + album: { + type: 'string', + description: 'The name of the album.', + }, + duration: { + type: 'integer', + description: 'The duration of the track in milliseconds.', + }, + previewUrl: { + type: 'string', + description: 'A URL to a preview of the track.', + }, + }, + }, + }, + }, + AppRockskySpotifyGetCurrentlyPlaying: { + lexicon: 1, + id: 'app.rocksky.spotify.getCurrentlyPlaying', + defs: { + main: { + type: 'query', + description: 'Get the currently playing track', + parameters: { + type: 'params', + properties: { + actor: { + type: 'string', + description: + 'Handle or DID of the actor to retrieve the currently playing track for. If not provided, defaults to the current user.', + format: 'at-identifier', + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'ref', + ref: 'lex:app.rocksky.player.defs#currentlyPlayingViewDetailed', + }, + }, + }, + }, + }, + AppRockskySpotifyNext: { + lexicon: 1, + id: 'app.rocksky.spotify.next', + defs: { + main: { + type: 'procedure', + description: 'Play the next track in the queue', + }, + }, + }, + AppRockskySpotifyPause: { + lexicon: 1, + id: 'app.rocksky.spotify.pause', + defs: { + main: { + type: 'procedure', + description: 'Pause the currently playing track', + }, + }, + }, + AppRockskySpotifyPlay: { + lexicon: 1, + id: 'app.rocksky.spotify.play', + defs: { + main: { + type: 'procedure', + description: 'Resume playback of the currently paused track', + }, + }, + }, + AppRockskySpotifyPrevious: { + lexicon: 1, + id: 'app.rocksky.spotify.previous', + defs: { + main: { + type: 'procedure', + description: 'Play the previous track in the queue', + }, + }, + }, + AppRockskySpotifySeek: { + lexicon: 1, + id: 'app.rocksky.spotify.seek', + defs: { + main: { + type: 'procedure', + description: + 'Seek to a specific position in the currently playing track', + parameters: { + type: 'params', + required: ['position'], + properties: { + position: { + type: 'integer', + description: 'The position in seconds to seek to', + }, + }, + }, + }, + }, + }, + AppRockskyStatsDefs: { + lexicon: 1, + id: 'app.rocksky.stats.defs', + defs: { + statsView: { + type: 'object', + properties: { + scrobbles: { + type: 'integer', + description: 'The total number of scrobbles.', + }, + artists: { + type: 'integer', + description: 'The total number of unique artists scrobbled.', + }, + lovedTracks: { + type: 'integer', + description: 'The total number of tracks marked as loved.', + }, + albums: { + type: 'integer', + description: 'The total number of unique albums scrobbled.', + }, + tracks: { + type: 'integer', + description: 'The total number of unique tracks scrobbled.', + }, + }, + }, + }, + }, + AppRockskyStatsGetStats: { + lexicon: 1, + id: 'app.rocksky.stats.getStats', + defs: { + main: { + type: 'query', + parameters: { + type: 'params', + required: ['did'], + properties: { + did: { + type: 'string', + description: 'The DID or handle of the user to get stats for.', + format: 'at-identifier', + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'ref', + ref: 'lex:app.rocksky.stats.defs#statsView', + }, + }, + }, + }, + }, + ComAtprotoRepoStrongRef: { + lexicon: 1, + id: 'com.atproto.repo.strongRef', + description: 'A URI with a content-hash fingerprint.', + defs: { + main: { + type: 'object', + required: ['uri', 'cid'], + properties: { + uri: { + type: 'string', + format: 'at-uri', + }, + cid: { + type: 'string', + format: 'cid', + }, + }, + }, + }, + }, +} as const satisfies Record + +export const schemas = Object.values(schemaDict) +export const lexicons: Lexicons = new Lexicons(schemas) +export const ids = { + AppRockskyActorDefs: 'app.rocksky.actor.defs', + AppRockskyActorGetActorAlbums: 'app.rocksky.actor.getActorAlbums', + AppRockskyActorGetActorArtists: 'app.rocksky.actor.getActorArtists', + AppRockskyActorGetActorLovedSongs: 'app.rocksky.actor.getActorLovedSongs', + AppRockskyActorGetActorPlaylists: 'app.rocksky.actor.getActorPlaylists', + AppRockskyActorGetActorScrobbles: 'app.rocksky.actor.getActorScrobbles', + AppRockskyActorGetActorSongs: 'app.rocksky.actor.getActorSongs', + AppRockskyActorGetProfile: 'app.rocksky.actor.getProfile', + AppBskyActorProfile: 'app.bsky.actor.profile', + AppRockskyAlbum: 'app.rocksky.album', + AppRockskyAlbumDefs: 'app.rocksky.album.defs', + AppRockskyAlbumGetAlbum: 'app.rocksky.album.getAlbum', + AppRockskyAlbumGetAlbums: 'app.rocksky.album.getAlbums', + AppRockskyAlbumGetAlbumTracks: 'app.rocksky.album.getAlbumTracks', + AppRockskyApikeyCreateApikey: 'app.rocksky.apikey.createApikey', + AppRockskyApikeyDefs: 'app.rocksky.apikey.defs', + AppRockskyApikeysDefs: 'app.rocksky.apikeys.defs', + AppRockskyApikeyGetApikeys: 'app.rocksky.apikey.getApikeys', + AppRockskyApikeyRemoveApikey: 'app.rocksky.apikey.removeApikey', + AppRockskyApikeyUpdateApikey: 'app.rocksky.apikey.updateApikey', + AppRockskyArtist: 'app.rocksky.artist', + AppRockskyArtistDefs: 'app.rocksky.artist.defs', + AppRockskyArtistGetArtistAlbums: 'app.rocksky.artist.getArtistAlbums', + AppRockskyArtistGetArtist: 'app.rocksky.artist.getArtist', + AppRockskyArtistGetArtists: 'app.rocksky.artist.getArtists', + AppRockskyArtistGetArtistTracks: 'app.rocksky.artist.getArtistTracks', + AppRockskyChartsDefs: 'app.rocksky.charts.defs', + AppRockskyChartsGetScrobblesChart: 'app.rocksky.charts.getScrobblesChart', + AppRockskyDropboxDefs: 'app.rocksky.dropbox.defs', + AppRockskyDropboxDownloadFile: 'app.rocksky.dropbox.downloadFile', + AppRockskyDropboxGetFiles: 'app.rocksky.dropbox.getFiles', + AppRockskyDropboxGetMetadata: 'app.rocksky.dropbox.getMetadata', + AppRockskyDropboxGetTemporaryLink: 'app.rocksky.dropbox.getTemporaryLink', + AppRockskyFeedDefs: 'app.rocksky.feed.defs', + AppRockskyFeedGetNowPlayings: 'app.rocksky.feed.getNowPlayings', + AppRockskyFeedSearch: 'app.rocksky.feed.search', + AppRockskyGoogledriveDefs: 'app.rocksky.googledrive.defs', + AppRockskyGoogledriveDownloadFile: 'app.rocksky.googledrive.downloadFile', + AppRockskyGoogledriveGetFile: 'app.rocksky.googledrive.getFile', + AppRockskyGoogledriveGetFiles: 'app.rocksky.googledrive.getFiles', + AppRockskyLikeDislikeShout: 'app.rocksky.like.dislikeShout', + AppRockskyLikeDislikeSong: 'app.rocksky.like.dislikeSong', + AppRockskyLike: 'app.rocksky.like', + AppRockskyLikeLikeShout: 'app.rocksky.like.likeShout', + AppRockskyLikeLikeSong: 'app.rocksky.like.likeSong', + AppRockskyPlayerDefs: 'app.rocksky.player.defs', + AppRockskyPlayerGetCurrentlyPlaying: 'app.rocksky.player.getCurrentlyPlaying', + AppRockskyPlayerNext: 'app.rocksky.player.next', + AppRockskyPlayerPause: 'app.rocksky.player.pause', + AppRockskyPlayerPlay: 'app.rocksky.player.play', + AppRockskyPlayerPrevious: 'app.rocksky.player.previous', + AppRockskyPlayerSeek: 'app.rocksky.player.seek', + AppRockskyPlaylistDefs: 'app.rocksky.playlist.defs', + AppRockskyPlaylistGetPlaylist: 'app.rocksky.playlist.getPlaylist', + AppRockskyPlaylistGetPlaylists: 'app.rocksky.playlist.getPlaylists', + AppRockskyPlaylist: 'app.rocksky.playlist', + AppRockskyRadioDefs: 'app.rocksky.radio.defs', + AppRockskyRadio: 'app.rocksky.radio', + AppRockskyScrobbleCreateScrobble: 'app.rocksky.scrobble.createScrobble', + AppRockskyScrobbleDefs: 'app.rocksky.scrobble.defs', + AppRockskyScrobbleGetScrobble: 'app.rocksky.scrobble.getScrobble', + AppRockskyScrobbleGetScrobbles: 'app.rocksky.scrobble.getScrobbles', + AppRockskyScrobble: 'app.rocksky.scrobble', + AppRockskyShoutCreateShout: 'app.rocksky.shout.createShout', + AppRockskyShoutDefs: 'app.rocksky.shout.defs', + AppRockskyShoutGetAlbumShouts: 'app.rocksky.shout.getAlbumShouts', + AppRockskyShoutGetArtistShouts: 'app.rocksky.shout.getArtistShouts', + AppRockskyShoutGetProfileShouts: 'app.rocksky.shout.getProfileShouts', + AppRockskyShoutGetShoutReplies: 'app.rocksky.shout.getShoutReplies', + AppRockskyShoutGetTrackShouts: 'app.rocksky.shout.getTrackShouts', + AppRockskyShoutRemoveShout: 'app.rocksky.shout.removeShout', + AppRockskyShoutReplyShout: 'app.rocksky.shout.replyShout', + AppRockskyShoutReportShout: 'app.rocksky.shout.reportShout', + AppRockskyShout: 'app.rocksky.shout', + AppRockskySongCreateSong: 'app.rocksky.song.createSong', + AppRockskySongDefs: 'app.rocksky.song.defs', + AppRockskySongGetSong: 'app.rocksky.song.getSong', + AppRockskySongGetSongs: 'app.rocksky.song.getSongs', + AppRockskyLovedSong: 'app.rocksky.lovedSong', + AppRockskySong: 'app.rocksky.song', + AppRockskySpotifyDefs: 'app.rocksky.spotify.defs', + AppRockskySpotifyGetCurrentlyPlaying: + 'app.rocksky.spotify.getCurrentlyPlaying', + AppRockskySpotifyNext: 'app.rocksky.spotify.next', + AppRockskySpotifyPause: 'app.rocksky.spotify.pause', + AppRockskySpotifyPlay: 'app.rocksky.spotify.play', + AppRockskySpotifyPrevious: 'app.rocksky.spotify.previous', + AppRockskySpotifySeek: 'app.rocksky.spotify.seek', + AppRockskyStatsDefs: 'app.rocksky.stats.defs', + AppRockskyStatsGetStats: 'app.rocksky.stats.getStats', + ComAtprotoRepoStrongRef: 'com.atproto.repo.strongRef', +} diff --git a/apps/api/src/lexicon/types/app/bsky/actor/profile.ts b/apps/api/src/lexicon/types/app/bsky/actor/profile.ts new file mode 100644 index 00000000..9fd9b737 --- /dev/null +++ b/apps/api/src/lexicon/types/app/bsky/actor/profile.ts @@ -0,0 +1,38 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs' +import * as ComAtprotoRepoStrongRef from '../../../com/atproto/repo/strongRef' + +export interface Record { + displayName?: string + /** Free-form profile description text. */ + description?: string + /** Small image to be displayed next to posts from account. AKA, 'profile picture' */ + avatar?: BlobRef + /** Larger horizontal image to display behind profile view. */ + banner?: BlobRef + labels?: + | ComAtprotoLabelDefs.SelfLabels + | { $type: string; [k: string]: unknown } + joinedViaStarterPack?: ComAtprotoRepoStrongRef.Main + createdAt?: string + [k: string]: unknown +} + +export function isRecord(v: unknown): v is Record { + return ( + isObj(v) && + hasProp(v, '$type') && + (v.$type === 'app.bsky.actor.profile#main' || + v.$type === 'app.bsky.actor.profile') + ) +} + +export function validateRecord(v: unknown): ValidationResult { + return lexicons.validate('app.bsky.actor.profile#main', v) +} diff --git a/apps/api/src/lexicon/types/app/rocksky/actor/defs.ts b/apps/api/src/lexicon/types/app/rocksky/actor/defs.ts new file mode 100644 index 00000000..c369ffd0 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/actor/defs.ts @@ -0,0 +1,67 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' + +export interface ProfileViewDetailed { + /** The unique identifier of the actor. */ + id?: string + /** The DID of the actor. */ + did?: string + /** The handle of the actor. */ + handle?: string + /** The display name of the actor. */ + displayName?: string + /** The URL of the actor's avatar image. */ + avatar?: string + /** The date and time when the actor was created. */ + createdAt?: string + /** The date and time when the actor was last updated. */ + updatedAt?: string + [k: string]: unknown +} + +export function isProfileViewDetailed(v: unknown): v is ProfileViewDetailed { + return ( + isObj(v) && + hasProp(v, '$type') && + v.$type === 'app.rocksky.actor.defs#profileViewDetailed' + ) +} + +export function validateProfileViewDetailed(v: unknown): ValidationResult { + return lexicons.validate('app.rocksky.actor.defs#profileViewDetailed', v) +} + +export interface ProfileViewBasic { + /** The unique identifier of the actor. */ + id?: string + /** The DID of the actor. */ + did?: string + /** The handle of the actor. */ + handle?: string + /** The display name of the actor. */ + displayName?: string + /** The URL of the actor's avatar image. */ + avatar?: string + /** The date and time when the actor was created. */ + createdAt?: string + /** The date and time when the actor was last updated. */ + updatedAt?: string + [k: string]: unknown +} + +export function isProfileViewBasic(v: unknown): v is ProfileViewBasic { + return ( + isObj(v) && + hasProp(v, '$type') && + v.$type === 'app.rocksky.actor.defs#profileViewBasic' + ) +} + +export function validateProfileViewBasic(v: unknown): ValidationResult { + return lexicons.validate('app.rocksky.actor.defs#profileViewBasic', v) +} diff --git a/apps/api/src/lexicon/types/app/rocksky/actor/getActorAlbums.ts b/apps/api/src/lexicon/types/app/rocksky/actor/getActorAlbums.ts new file mode 100644 index 00000000..ebb36170 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/actor/getActorAlbums.ts @@ -0,0 +1,52 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskyAlbumDefs from '../album/defs' + +export interface QueryParams { + /** The DID or handle of the actor */ + did: string + /** The maximum number of albums to return */ + limit?: number + /** The offset for pagination */ + offset?: number +} + +export type InputSchema = undefined + +export interface OutputSchema { + albums?: AppRockskyAlbumDefs.AlbumViewBasic[] + [k: string]: unknown +} + +export type HandlerInput = undefined + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/actor/getActorArtists.ts b/apps/api/src/lexicon/types/app/rocksky/actor/getActorArtists.ts new file mode 100644 index 00000000..4c56bf04 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/actor/getActorArtists.ts @@ -0,0 +1,52 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskyArtistDefs from '../artist/defs' + +export interface QueryParams { + /** The DID or handle of the actor */ + did: string + /** The maximum number of albums to return */ + limit?: number + /** The offset for pagination */ + offset?: number +} + +export type InputSchema = undefined + +export interface OutputSchema { + artists?: AppRockskyArtistDefs.ArtistViewBasic[] + [k: string]: unknown +} + +export type HandlerInput = undefined + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/actor/getActorLovedSongs.ts b/apps/api/src/lexicon/types/app/rocksky/actor/getActorLovedSongs.ts new file mode 100644 index 00000000..cc1a8128 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/actor/getActorLovedSongs.ts @@ -0,0 +1,52 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskySongDefs from '../song/defs' + +export interface QueryParams { + /** The DID or handle of the actor */ + did: string + /** The maximum number of albums to return */ + limit?: number + /** The offset for pagination */ + offset?: number +} + +export type InputSchema = undefined + +export interface OutputSchema { + tracks?: AppRockskySongDefs.SongViewBasic[] + [k: string]: unknown +} + +export type HandlerInput = undefined + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/actor/getActorPlaylists.ts b/apps/api/src/lexicon/types/app/rocksky/actor/getActorPlaylists.ts new file mode 100644 index 00000000..8efd9ec3 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/actor/getActorPlaylists.ts @@ -0,0 +1,52 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskyPlaylistDefs from '../playlist/defs' + +export interface QueryParams { + /** The DID or handle of the actor */ + did: string + /** The maximum number of albums to return */ + limit?: number + /** The offset for pagination */ + offset?: number +} + +export type InputSchema = undefined + +export interface OutputSchema { + playlists?: AppRockskyPlaylistDefs.PlaylistViewBasic[] + [k: string]: unknown +} + +export type HandlerInput = undefined + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/actor/getActorScrobbles.ts b/apps/api/src/lexicon/types/app/rocksky/actor/getActorScrobbles.ts new file mode 100644 index 00000000..f16bfaee --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/actor/getActorScrobbles.ts @@ -0,0 +1,52 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskyScrobbleDefs from '../scrobble/defs' + +export interface QueryParams { + /** The DID or handle of the actor */ + did: string + /** The maximum number of albums to return */ + limit?: number + /** The offset for pagination */ + offset?: number +} + +export type InputSchema = undefined + +export interface OutputSchema { + scrobbles?: AppRockskyScrobbleDefs.ScrobbleViewBasic[] + [k: string]: unknown +} + +export type HandlerInput = undefined + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/actor/getActorSongs.ts b/apps/api/src/lexicon/types/app/rocksky/actor/getActorSongs.ts new file mode 100644 index 00000000..2142fd21 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/actor/getActorSongs.ts @@ -0,0 +1,52 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskySongDefs from '../song/defs' + +export interface QueryParams { + /** The DID or handle of the actor */ + did: string + /** The maximum number of albums to return */ + limit?: number + /** The offset for pagination */ + offset?: number +} + +export type InputSchema = undefined + +export interface OutputSchema { + songs?: AppRockskySongDefs.SongViewBasic[] + [k: string]: unknown +} + +export type HandlerInput = undefined + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/actor/getProfile.ts b/apps/api/src/lexicon/types/app/rocksky/actor/getProfile.ts new file mode 100644 index 00000000..3b2e62fe --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/actor/getProfile.ts @@ -0,0 +1,43 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskyActorDefs from './defs' + +export interface QueryParams { + /** The DID or handle of the actor */ + did?: string +} + +export type InputSchema = undefined +export type OutputSchema = AppRockskyActorDefs.ProfileViewDetailed +export type HandlerInput = undefined + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/album.ts b/apps/api/src/lexicon/types/app/rocksky/album.ts new file mode 100644 index 00000000..ac170a4c --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/album.ts @@ -0,0 +1,49 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../lexicons' +import { isObj, hasProp } from '../../../util' +import { CID } from 'multiformats/cid' + +export interface Record { + /** The title of the album. */ + title: string + /** The artist of the album. */ + artist: string + /** The duration of the album in seconds. */ + duration?: number + /** The release date of the album. */ + releaseDate?: string + /** The year the album was released. */ + year?: number + /** The genre of the album. */ + genre?: string + /** The album art of the album. */ + albumArt?: BlobRef + /** The tags of the album. */ + tags?: string[] + /** The YouTube link of the album. */ + youtubeLink?: string + /** The Spotify link of the album. */ + spotifyLink?: string + /** The tidal link of the album. */ + tidalLink?: string + /** The Apple Music link of the album. */ + appleMusicLink?: string + /** The date and time when the album was created. */ + createdAt: string + [k: string]: unknown +} + +export function isRecord(v: unknown): v is Record { + return ( + isObj(v) && + hasProp(v, '$type') && + (v.$type === 'app.rocksky.album#main' || v.$type === 'app.rocksky.album') + ) +} + +export function validateRecord(v: unknown): ValidationResult { + return lexicons.validate('app.rocksky.album#main', v) +} diff --git a/apps/api/src/lexicon/types/app/rocksky/album/defs.ts b/apps/api/src/lexicon/types/app/rocksky/album/defs.ts new file mode 100644 index 00000000..43b0a717 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/album/defs.ts @@ -0,0 +1,85 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import * as AppRockskySongDefsSongViewBasic from '../song/defs/songViewBasic' + +export interface AlbumViewBasic { + /** The unique identifier of the album. */ + id?: string + /** The URI of the album. */ + uri?: string + /** The title of the album. */ + title?: string + /** The artist of the album. */ + artist?: string + /** The URI of the album's artist. */ + artistUri?: string + /** The year the album was released. */ + year?: number + /** The URL of the album art image. */ + albumArt?: string + /** The release date of the album. */ + releaseDate?: string + /** The SHA256 hash of the album. */ + sha256?: string + /** The number of times the album has been played. */ + playCount?: number + /** The number of unique listeners who have played the album. */ + uniqueListeners?: number + [k: string]: unknown +} + +export function isAlbumViewBasic(v: unknown): v is AlbumViewBasic { + return ( + isObj(v) && + hasProp(v, '$type') && + v.$type === 'app.rocksky.album.defs#albumViewBasic' + ) +} + +export function validateAlbumViewBasic(v: unknown): ValidationResult { + return lexicons.validate('app.rocksky.album.defs#albumViewBasic', v) +} + +export interface AlbumViewDetailed { + /** The unique identifier of the album. */ + id?: string + /** The URI of the album. */ + uri?: string + /** The title of the album. */ + title?: string + /** The artist of the album. */ + artist?: string + /** The URI of the album's artist. */ + artistUri?: string + /** The year the album was released. */ + year?: number + /** The URL of the album art image. */ + albumArt?: string + /** The release date of the album. */ + releaseDate?: string + /** The SHA256 hash of the album. */ + sha256?: string + /** The number of times the album has been played. */ + playCount?: number + /** The number of unique listeners who have played the album. */ + uniqueListeners?: number + tracks?: AppRockskySongDefsSongViewBasic.Main[] + [k: string]: unknown +} + +export function isAlbumViewDetailed(v: unknown): v is AlbumViewDetailed { + return ( + isObj(v) && + hasProp(v, '$type') && + v.$type === 'app.rocksky.album.defs#albumViewDetailed' + ) +} + +export function validateAlbumViewDetailed(v: unknown): ValidationResult { + return lexicons.validate('app.rocksky.album.defs#albumViewDetailed', v) +} diff --git a/apps/api/src/lexicon/types/app/rocksky/album/getAlbum.ts b/apps/api/src/lexicon/types/app/rocksky/album/getAlbum.ts new file mode 100644 index 00000000..89f0be90 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/album/getAlbum.ts @@ -0,0 +1,43 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskyAlbumDefs from './defs' + +export interface QueryParams { + /** The URI of the album to retrieve. */ + uri: string +} + +export type InputSchema = undefined +export type OutputSchema = AppRockskyAlbumDefs.AlbumViewDetailed +export type HandlerInput = undefined + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/album/getAlbumTracks.ts b/apps/api/src/lexicon/types/app/rocksky/album/getAlbumTracks.ts new file mode 100644 index 00000000..3a32b5bc --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/album/getAlbumTracks.ts @@ -0,0 +1,48 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskySongDefs from '../song/defs' + +export interface QueryParams { + /** The URI of the album to retrieve tracks from */ + uri: string +} + +export type InputSchema = undefined + +export interface OutputSchema { + tracks?: AppRockskySongDefs.SongViewBasic[] + [k: string]: unknown +} + +export type HandlerInput = undefined + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/album/getAlbums.ts b/apps/api/src/lexicon/types/app/rocksky/album/getAlbums.ts new file mode 100644 index 00000000..3b914f80 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/album/getAlbums.ts @@ -0,0 +1,50 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskyAlbumDefs from './defs' + +export interface QueryParams { + /** The maximum number of albums to return */ + limit?: number + /** The offset for pagination */ + offset?: number +} + +export type InputSchema = undefined + +export interface OutputSchema { + albums?: AppRockskyAlbumDefs.AlbumViewBasic[] + [k: string]: unknown +} + +export type HandlerInput = undefined + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/apikey/createApikey.ts b/apps/api/src/lexicon/types/app/rocksky/apikey/createApikey.ts new file mode 100644 index 00000000..68490540 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/apikey/createApikey.ts @@ -0,0 +1,51 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskyApikeyDefs from './defs' + +export interface QueryParams {} + +export interface InputSchema { + /** The name of the API key. */ + name: string + /** A description for the API key. */ + description?: string + [k: string]: unknown +} + +export type OutputSchema = AppRockskyApikeyDefs.ApiKey + +export interface HandlerInput { + encoding: 'application/json' + body: InputSchema +} + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/apikey/defs.ts b/apps/api/src/lexicon/types/app/rocksky/apikey/defs.ts new file mode 100644 index 00000000..5ff984d9 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/apikey/defs.ts @@ -0,0 +1,31 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' + +export interface ApiKeyView { + /** The unique identifier of the API key. */ + id?: string + /** The name of the API key. */ + name?: string + /** A description for the API key. */ + description?: string + /** The date and time when the API key was created. */ + createdAt?: string + [k: string]: unknown +} + +export function isApiKeyView(v: unknown): v is ApiKeyView { + return ( + isObj(v) && + hasProp(v, '$type') && + v.$type === 'app.rocksky.apikey.defs#apiKeyView' + ) +} + +export function validateApiKeyView(v: unknown): ValidationResult { + return lexicons.validate('app.rocksky.apikey.defs#apiKeyView', v) +} diff --git a/apps/api/src/lexicon/types/app/rocksky/apikey/getApikeys.ts b/apps/api/src/lexicon/types/app/rocksky/apikey/getApikeys.ts new file mode 100644 index 00000000..f0429569 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/apikey/getApikeys.ts @@ -0,0 +1,50 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskyApikeyDefs from './defs' + +export interface QueryParams { + /** The number of API keys to skip before starting to collect the result set. */ + offset?: number + /** The number of API keys to return per page. */ + limit?: number +} + +export type InputSchema = undefined + +export interface OutputSchema { + apiKeys?: AppRockskyApikeyDefs.ApikeyView[] + [k: string]: unknown +} + +export type HandlerInput = undefined + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/apikey/removeApikey.ts b/apps/api/src/lexicon/types/app/rocksky/apikey/removeApikey.ts new file mode 100644 index 00000000..3ec6a1c0 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/apikey/removeApikey.ts @@ -0,0 +1,43 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskyApikeyDefs from './defs' + +export interface QueryParams { + /** The ID of the API key to remove. */ + id: string +} + +export type InputSchema = undefined +export type OutputSchema = AppRockskyApikeyDefs.ApiKey +export type HandlerInput = undefined + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/apikey/updateApikey.ts b/apps/api/src/lexicon/types/app/rocksky/apikey/updateApikey.ts new file mode 100644 index 00000000..46ccc6cd --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/apikey/updateApikey.ts @@ -0,0 +1,53 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskyApikeyDefs from './defs' + +export interface QueryParams {} + +export interface InputSchema { + /** The ID of the API key to update. */ + id: string + /** The new name of the API key. */ + name: string + /** A new description for the API key. */ + description?: string + [k: string]: unknown +} + +export type OutputSchema = AppRockskyApikeyDefs.ApiKey + +export interface HandlerInput { + encoding: 'application/json' + body: InputSchema +} + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/apikeys/defs.ts b/apps/api/src/lexicon/types/app/rocksky/apikeys/defs.ts new file mode 100644 index 00000000..3943ee36 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/apikeys/defs.ts @@ -0,0 +1,7 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' diff --git a/apps/api/src/lexicon/types/app/rocksky/artist.ts b/apps/api/src/lexicon/types/app/rocksky/artist.ts new file mode 100644 index 00000000..4b2ba0fa --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/artist.ts @@ -0,0 +1,39 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../lexicons' +import { isObj, hasProp } from '../../../util' +import { CID } from 'multiformats/cid' + +export interface Record { + /** The name of the artist. */ + name: string + /** The biography of the artist. */ + bio?: string + /** The picture of the artist. */ + picture?: BlobRef + /** The tags of the artist. */ + tags?: string[] + /** The birth date of the artist. */ + born?: string + /** The death date of the artist. */ + died?: string + /** The birth place of the artist. */ + bornIn?: string + /** The date when the artist was created. */ + createdAt: string + [k: string]: unknown +} + +export function isRecord(v: unknown): v is Record { + return ( + isObj(v) && + hasProp(v, '$type') && + (v.$type === 'app.rocksky.artist#main' || v.$type === 'app.rocksky.artist') + ) +} + +export function validateRecord(v: unknown): ValidationResult { + return lexicons.validate('app.rocksky.artist#main', v) +} diff --git a/apps/api/src/lexicon/types/app/rocksky/artist/defs.ts b/apps/api/src/lexicon/types/app/rocksky/artist/defs.ts new file mode 100644 index 00000000..d7257954 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/artist/defs.ts @@ -0,0 +1,67 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' + +export interface ArtistViewBasic { + /** The unique identifier of the artist. */ + id?: string + /** The URI of the artist. */ + uri?: string + /** The name of the artist. */ + name?: string + /** The picture of the artist. */ + picture?: string + /** The SHA256 hash of the artist. */ + sha256?: string + /** The number of times the artist has been played. */ + playCount?: number + /** The number of unique listeners who have played the artist. */ + uniqueListeners?: number + [k: string]: unknown +} + +export function isArtistViewBasic(v: unknown): v is ArtistViewBasic { + return ( + isObj(v) && + hasProp(v, '$type') && + v.$type === 'app.rocksky.artist.defs#artistViewBasic' + ) +} + +export function validateArtistViewBasic(v: unknown): ValidationResult { + return lexicons.validate('app.rocksky.artist.defs#artistViewBasic', v) +} + +export interface ArtistViewDetailed { + /** The unique identifier of the artist. */ + id?: string + /** The URI of the artist. */ + uri?: string + /** The name of the artist. */ + name?: string + /** The picture of the artist. */ + picture?: string + /** The SHA256 hash of the artist. */ + sha256?: string + /** The number of times the artist has been played. */ + playCount?: number + /** The number of unique listeners who have played the artist. */ + uniqueListeners?: number + [k: string]: unknown +} + +export function isArtistViewDetailed(v: unknown): v is ArtistViewDetailed { + return ( + isObj(v) && + hasProp(v, '$type') && + v.$type === 'app.rocksky.artist.defs#artistViewDetailed' + ) +} + +export function validateArtistViewDetailed(v: unknown): ValidationResult { + return lexicons.validate('app.rocksky.artist.defs#artistViewDetailed', v) +} diff --git a/apps/api/src/lexicon/types/app/rocksky/artist/getArtist.ts b/apps/api/src/lexicon/types/app/rocksky/artist/getArtist.ts new file mode 100644 index 00000000..b3d0a5ff --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/artist/getArtist.ts @@ -0,0 +1,43 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskyArtistDefs from './defs' + +export interface QueryParams { + /** The URI of the artist to retrieve details from */ + uri: string +} + +export type InputSchema = undefined +export type OutputSchema = AppRockskyArtistDefs.ArtistViewDetailed +export type HandlerInput = undefined + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/artist/getArtistAlbums.ts b/apps/api/src/lexicon/types/app/rocksky/artist/getArtistAlbums.ts new file mode 100644 index 00000000..681ef9c9 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/artist/getArtistAlbums.ts @@ -0,0 +1,48 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskyAlbumDefs from '../album/defs' + +export interface QueryParams { + /** The URI of the artist to retrieve albums from */ + uri: string +} + +export type InputSchema = undefined + +export interface OutputSchema { + albums?: AppRockskyAlbumDefs.AlbumViewBasic[] + [k: string]: unknown +} + +export type HandlerInput = undefined + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/artist/getArtistTracks.ts b/apps/api/src/lexicon/types/app/rocksky/artist/getArtistTracks.ts new file mode 100644 index 00000000..db1f6497 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/artist/getArtistTracks.ts @@ -0,0 +1,52 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskySongDefs from '../song/defs' + +export interface QueryParams { + /** The URI of the artist to retrieve albums from */ + uri?: string + /** The maximum number of tracks to return */ + limit?: number + /** The offset for pagination */ + offset?: number +} + +export type InputSchema = undefined + +export interface OutputSchema { + tracks?: AppRockskySongDefs.SongViewBasic[] + [k: string]: unknown +} + +export type HandlerInput = undefined + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/artist/getArtists.ts b/apps/api/src/lexicon/types/app/rocksky/artist/getArtists.ts new file mode 100644 index 00000000..483a57b8 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/artist/getArtists.ts @@ -0,0 +1,50 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskyArtistDefs from './defs' + +export interface QueryParams { + /** The maximum number of artists to return */ + limit?: number + /** The offset for pagination */ + offset?: number +} + +export type InputSchema = undefined + +export interface OutputSchema { + artists?: AppRockskyArtistDefs.ArtistViewBasic[] + [k: string]: unknown +} + +export type HandlerInput = undefined + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/charts/defs.ts b/apps/api/src/lexicon/types/app/rocksky/charts/defs.ts new file mode 100644 index 00000000..4f54fc53 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/charts/defs.ts @@ -0,0 +1,44 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' + +export interface ChartsView { + scrobbles?: ScrobbleViewBasic[] + [k: string]: unknown +} + +export function isChartsView(v: unknown): v is ChartsView { + return ( + isObj(v) && + hasProp(v, '$type') && + v.$type === 'app.rocksky.charts.defs#chartsView' + ) +} + +export function validateChartsView(v: unknown): ValidationResult { + return lexicons.validate('app.rocksky.charts.defs#chartsView', v) +} + +export interface ScrobbleViewBasic { + /** The date of the scrobble. */ + date?: string + /** The number of scrobbles on this date. */ + count?: number + [k: string]: unknown +} + +export function isScrobbleViewBasic(v: unknown): v is ScrobbleViewBasic { + return ( + isObj(v) && + hasProp(v, '$type') && + v.$type === 'app.rocksky.charts.defs#scrobbleViewBasic' + ) +} + +export function validateScrobbleViewBasic(v: unknown): ValidationResult { + return lexicons.validate('app.rocksky.charts.defs#scrobbleViewBasic', v) +} diff --git a/apps/api/src/lexicon/types/app/rocksky/charts/getScrobblesChart.ts b/apps/api/src/lexicon/types/app/rocksky/charts/getScrobblesChart.ts new file mode 100644 index 00000000..b814f99e --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/charts/getScrobblesChart.ts @@ -0,0 +1,49 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskyChartsDefs from './defs' + +export interface QueryParams { + /** The DID or handle of the actor */ + did?: string + /** The URI of the artist to filter by */ + artisturi?: string + /** The URI of the album to filter by */ + albumuri?: string + /** The URI of the track to filter by */ + songuri?: string +} + +export type InputSchema = undefined +export type OutputSchema = AppRockskyChartsDefs.ChartsView +export type HandlerInput = undefined + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/dropbox/defs.ts b/apps/api/src/lexicon/types/app/rocksky/dropbox/defs.ts new file mode 100644 index 00000000..a451452e --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/dropbox/defs.ts @@ -0,0 +1,71 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' + +export interface FileView { + /** The unique identifier of the file. */ + id?: string + /** The name of the file. */ + name?: string + /** The lowercased path of the file. */ + pathLower?: string + /** The display path of the file. */ + pathDisplay?: string + /** The last modified date and time of the file on the client. */ + clientModified?: string + /** The last modified date and time of the file on the server. */ + serverModified?: string + [k: string]: unknown +} + +export function isFileView(v: unknown): v is FileView { + return ( + isObj(v) && + hasProp(v, '$type') && + v.$type === 'app.rocksky.dropbox.defs#fileView' + ) +} + +export function validateFileView(v: unknown): ValidationResult { + return lexicons.validate('app.rocksky.dropbox.defs#fileView', v) +} + +export interface FileListView { + /** A list of files in the Dropbox. */ + files?: FileView[] + [k: string]: unknown +} + +export function isFileListView(v: unknown): v is FileListView { + return ( + isObj(v) && + hasProp(v, '$type') && + v.$type === 'app.rocksky.dropbox.defs#fileListView' + ) +} + +export function validateFileListView(v: unknown): ValidationResult { + return lexicons.validate('app.rocksky.dropbox.defs#fileListView', v) +} + +export interface TemporaryLinkView { + /** The temporary link to access the file. */ + link?: string + [k: string]: unknown +} + +export function isTemporaryLinkView(v: unknown): v is TemporaryLinkView { + return ( + isObj(v) && + hasProp(v, '$type') && + v.$type === 'app.rocksky.dropbox.defs#temporaryLinkView' + ) +} + +export function validateTemporaryLinkView(v: unknown): ValidationResult { + return lexicons.validate('app.rocksky.dropbox.defs#temporaryLinkView', v) +} diff --git a/apps/api/src/lexicon/types/app/rocksky/dropbox/downloadFile.ts b/apps/api/src/lexicon/types/app/rocksky/dropbox/downloadFile.ts new file mode 100644 index 00000000..271eab55 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/dropbox/downloadFile.ts @@ -0,0 +1,42 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import stream from 'stream' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' + +export interface QueryParams { + /** The unique identifier of the file to download */ + fileId: string +} + +export type InputSchema = undefined +export type HandlerInput = undefined + +export interface HandlerSuccess { + encoding: 'application/octet-stream' + body: Uint8Array | stream.Readable + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/dropbox/getFiles.ts b/apps/api/src/lexicon/types/app/rocksky/dropbox/getFiles.ts new file mode 100644 index 00000000..9f432db0 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/dropbox/getFiles.ts @@ -0,0 +1,43 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskyDropboxDefs from './defs' + +export interface QueryParams { + /** Path to the Dropbox folder or root directory */ + at?: string +} + +export type InputSchema = undefined +export type OutputSchema = AppRockskyDropboxDefs.FileListView +export type HandlerInput = undefined + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/dropbox/getMetadata.ts b/apps/api/src/lexicon/types/app/rocksky/dropbox/getMetadata.ts new file mode 100644 index 00000000..267f0576 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/dropbox/getMetadata.ts @@ -0,0 +1,43 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskyDropboxDefs from './defs' + +export interface QueryParams { + /** Path to the file or folder in Dropbox */ + path: string +} + +export type InputSchema = undefined +export type OutputSchema = AppRockskyDropboxDefs.FileView +export type HandlerInput = undefined + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/dropbox/getTemporaryLink.ts b/apps/api/src/lexicon/types/app/rocksky/dropbox/getTemporaryLink.ts new file mode 100644 index 00000000..ac51e328 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/dropbox/getTemporaryLink.ts @@ -0,0 +1,43 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskyDropboxDefs from './defs' + +export interface QueryParams { + /** Path to the file in Dropbox */ + path: string +} + +export type InputSchema = undefined +export type OutputSchema = AppRockskyDropboxDefs.TemporaryLinkView +export type HandlerInput = undefined + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/feed/defs.ts b/apps/api/src/lexicon/types/app/rocksky/feed/defs.ts new file mode 100644 index 00000000..c132e6ef --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/feed/defs.ts @@ -0,0 +1,88 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import * as AppRockskySongDefs from '../song/defs' +import * as AppRockskyAlbumDefs from '../album/defs' +import * as AppRockskyArtistDefs from '../artist/defs' +import * as AppRockskyPlaylistDefs from '../playlist/defs' +import * as AppRockskyActorDefs from '../actor/defs' + +export interface SearchResultsView { + hits?: ( + | AppRockskySongDefs.SongViewBasic + | AppRockskyAlbumDefs.AlbumViewBasic + | AppRockskyArtistDefs.ArtistViewBasic + | AppRockskyPlaylistDefs.PlaylistViewBasic + | AppRockskyActorDefs.ProfileViewBasic + | { $type: string; [k: string]: unknown } + )[] + processingTimeMs?: number + limit?: number + offset?: number + estimatedTotalHits?: number + [k: string]: unknown +} + +export function isSearchResultsView(v: unknown): v is SearchResultsView { + return ( + isObj(v) && + hasProp(v, '$type') && + v.$type === 'app.rocksky.feed.defs#searchResultsView' + ) +} + +export function validateSearchResultsView(v: unknown): ValidationResult { + return lexicons.validate('app.rocksky.feed.defs#searchResultsView', v) +} + +export interface NowPlayingView { + album?: string + albumArt?: string + albumArtist?: string + albumUri?: string + artist?: string + artistUri?: string + avatar?: string + createdAt?: string + did?: string + handle?: string + id?: string + title?: string + trackId?: string + trackUri?: string + uri?: string + [k: string]: unknown +} + +export function isNowPlayingView(v: unknown): v is NowPlayingView { + return ( + isObj(v) && + hasProp(v, '$type') && + v.$type === 'app.rocksky.feed.defs#nowPlayingView' + ) +} + +export function validateNowPlayingView(v: unknown): ValidationResult { + return lexicons.validate('app.rocksky.feed.defs#nowPlayingView', v) +} + +export interface NowPlayingsView { + nowPlayings?: NowPlayingView[] + [k: string]: unknown +} + +export function isNowPlayingsView(v: unknown): v is NowPlayingsView { + return ( + isObj(v) && + hasProp(v, '$type') && + v.$type === 'app.rocksky.feed.defs#nowPlayingsView' + ) +} + +export function validateNowPlayingsView(v: unknown): ValidationResult { + return lexicons.validate('app.rocksky.feed.defs#nowPlayingsView', v) +} diff --git a/apps/api/src/lexicon/types/app/rocksky/feed/getNowPlayings.ts b/apps/api/src/lexicon/types/app/rocksky/feed/getNowPlayings.ts new file mode 100644 index 00000000..b16b579c --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/feed/getNowPlayings.ts @@ -0,0 +1,43 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskyFeedDefs from './defs' + +export interface QueryParams { + /** The maximum number of now playing tracks to return. */ + size?: number +} + +export type InputSchema = undefined +export type OutputSchema = AppRockskyFeedDefs.NowPlayingsView +export type HandlerInput = undefined + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/feed/search.ts b/apps/api/src/lexicon/types/app/rocksky/feed/search.ts new file mode 100644 index 00000000..1209fec8 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/feed/search.ts @@ -0,0 +1,43 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskyFeedDefs from './defs' + +export interface QueryParams { + /** The search query string */ + query: string +} + +export type InputSchema = undefined +export type OutputSchema = AppRockskyFeedDefs.SearchResultsView +export type HandlerInput = undefined + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/googledrive/defs.ts b/apps/api/src/lexicon/types/app/rocksky/googledrive/defs.ts new file mode 100644 index 00000000..7d93cc5c --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/googledrive/defs.ts @@ -0,0 +1,42 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' + +export interface FileView { + /** The unique identifier of the file. */ + id?: string + [k: string]: unknown +} + +export function isFileView(v: unknown): v is FileView { + return ( + isObj(v) && + hasProp(v, '$type') && + v.$type === 'app.rocksky.googledrive.defs#fileView' + ) +} + +export function validateFileView(v: unknown): ValidationResult { + return lexicons.validate('app.rocksky.googledrive.defs#fileView', v) +} + +export interface FileListView { + files?: FileView[] + [k: string]: unknown +} + +export function isFileListView(v: unknown): v is FileListView { + return ( + isObj(v) && + hasProp(v, '$type') && + v.$type === 'app.rocksky.googledrive.defs#fileListView' + ) +} + +export function validateFileListView(v: unknown): ValidationResult { + return lexicons.validate('app.rocksky.googledrive.defs#fileListView', v) +} diff --git a/apps/api/src/lexicon/types/app/rocksky/googledrive/downloadFile.ts b/apps/api/src/lexicon/types/app/rocksky/googledrive/downloadFile.ts new file mode 100644 index 00000000..271eab55 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/googledrive/downloadFile.ts @@ -0,0 +1,42 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import stream from 'stream' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' + +export interface QueryParams { + /** The unique identifier of the file to download */ + fileId: string +} + +export type InputSchema = undefined +export type HandlerInput = undefined + +export interface HandlerSuccess { + encoding: 'application/octet-stream' + body: Uint8Array | stream.Readable + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/googledrive/getFile.ts b/apps/api/src/lexicon/types/app/rocksky/googledrive/getFile.ts new file mode 100644 index 00000000..c8ce3937 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/googledrive/getFile.ts @@ -0,0 +1,43 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskyGoogledriveDefs from './defs' + +export interface QueryParams { + /** The unique identifier of the file to retrieve */ + fileId: string +} + +export type InputSchema = undefined +export type OutputSchema = AppRockskyGoogledriveDefs.FileView +export type HandlerInput = undefined + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/googledrive/getFiles.ts b/apps/api/src/lexicon/types/app/rocksky/googledrive/getFiles.ts new file mode 100644 index 00000000..9fc99f61 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/googledrive/getFiles.ts @@ -0,0 +1,43 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskyGoogledriveDefs from './defs' + +export interface QueryParams { + /** Path to the Google Drive folder or root directory */ + at?: string +} + +export type InputSchema = undefined +export type OutputSchema = AppRockskyGoogledriveDefs.FileListView +export type HandlerInput = undefined + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/like.ts b/apps/api/src/lexicon/types/app/rocksky/like.ts new file mode 100644 index 00000000..e58657aa --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/like.ts @@ -0,0 +1,27 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../lexicons' +import { isObj, hasProp } from '../../../util' +import { CID } from 'multiformats/cid' +import * as ComAtprotoRepoStrongRef from '../../com/atproto/repo/strongRef' + +export interface Record { + /** The date when the like was created. */ + createdAt: string + subject: ComAtprotoRepoStrongRef.Main + [k: string]: unknown +} + +export function isRecord(v: unknown): v is Record { + return ( + isObj(v) && + hasProp(v, '$type') && + (v.$type === 'app.rocksky.like#main' || v.$type === 'app.rocksky.like') + ) +} + +export function validateRecord(v: unknown): ValidationResult { + return lexicons.validate('app.rocksky.like#main', v) +} diff --git a/apps/api/src/lexicon/types/app/rocksky/like/dislikeShout.ts b/apps/api/src/lexicon/types/app/rocksky/like/dislikeShout.ts new file mode 100644 index 00000000..5e5a140f --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/like/dislikeShout.ts @@ -0,0 +1,49 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskyShoutDefs from '../shout/defs' + +export interface QueryParams {} + +export interface InputSchema { + /** The unique identifier of the shout to dislike */ + uri?: string + [k: string]: unknown +} + +export type OutputSchema = AppRockskyShoutDefs.ShoutView + +export interface HandlerInput { + encoding: 'application/json' + body: InputSchema +} + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/like/dislikeSong.ts b/apps/api/src/lexicon/types/app/rocksky/like/dislikeSong.ts new file mode 100644 index 00000000..fb31df74 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/like/dislikeSong.ts @@ -0,0 +1,49 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskySongDefs from '../song/defs' + +export interface QueryParams {} + +export interface InputSchema { + /** The unique identifier of the song to dislike */ + uri?: string + [k: string]: unknown +} + +export type OutputSchema = AppRockskySongDefs.SongViewDetailed + +export interface HandlerInput { + encoding: 'application/json' + body: InputSchema +} + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/like/likeShout.ts b/apps/api/src/lexicon/types/app/rocksky/like/likeShout.ts new file mode 100644 index 00000000..07174581 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/like/likeShout.ts @@ -0,0 +1,49 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskyShoutDefs from '../shout/defs' + +export interface QueryParams {} + +export interface InputSchema { + /** The unique identifier of the shout to like */ + uri?: string + [k: string]: unknown +} + +export type OutputSchema = AppRockskyShoutDefs.ShoutView + +export interface HandlerInput { + encoding: 'application/json' + body: InputSchema +} + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/like/likeSong.ts b/apps/api/src/lexicon/types/app/rocksky/like/likeSong.ts new file mode 100644 index 00000000..68655fcd --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/like/likeSong.ts @@ -0,0 +1,49 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskySongDefs from '../song/defs' + +export interface QueryParams {} + +export interface InputSchema { + /** The unique identifier of the song to like */ + uri?: string + [k: string]: unknown +} + +export type OutputSchema = AppRockskySongDefs.SongViewDetailed + +export interface HandlerInput { + encoding: 'application/json' + body: InputSchema +} + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/lovedSong.ts b/apps/api/src/lexicon/types/app/rocksky/lovedSong.ts new file mode 100644 index 00000000..cb0aab5e --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/lovedSong.ts @@ -0,0 +1,66 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../lexicons' +import { isObj, hasProp } from '../../../util' +import { CID } from 'multiformats/cid' + +export interface Record { + /** The title of the song. */ + title: string + /** The artist of the song. */ + artist: string + /** The album artist of the song. */ + albumArtist?: string + /** The album of the song. */ + album: string + /** The duration of the song in seconds. */ + duration: number + /** The track number of the song in the album. */ + trackNumber?: number + /** The disc number of the song in the album. */ + discNumber?: number + /** The release date of the song. */ + releaseDate?: string + /** The year the song was released. */ + year?: number + /** The genre of the song. */ + genre?: string + /** The tags of the song. */ + tags?: string[] + /** The composer of the song. */ + composer?: string + /** The lyrics of the song. */ + lyrics?: string + /** The copyright message of the song. */ + copyrightMessage?: string + /** Informations about the song */ + wiki?: string + /** The album art of the song. */ + albumArt?: BlobRef + /** The YouTube link of the song. */ + youtubeLink?: string + /** The Spotify link of the song. */ + spotifyLink?: string + /** The Tidal link of the song. */ + tidalLink?: string + /** The Apple Music link of the song. */ + appleMusicLink?: string + /** The date when the song was created. */ + createdAt: string + [k: string]: unknown +} + +export function isRecord(v: unknown): v is Record { + return ( + isObj(v) && + hasProp(v, '$type') && + (v.$type === 'app.rocksky.lovedSong#main' || + v.$type === 'app.rocksky.lovedSong') + ) +} + +export function validateRecord(v: unknown): ValidationResult { + return lexicons.validate('app.rocksky.lovedSong#main', v) +} diff --git a/apps/api/src/lexicon/types/app/rocksky/player/defs.ts b/apps/api/src/lexicon/types/app/rocksky/player/defs.ts new file mode 100644 index 00000000..06237d6c --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/player/defs.ts @@ -0,0 +1,32 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' + +export interface CurrentlyPlayingViewDetailed { + /** The title of the currently playing track */ + title?: string + [k: string]: unknown +} + +export function isCurrentlyPlayingViewDetailed( + v: unknown, +): v is CurrentlyPlayingViewDetailed { + return ( + isObj(v) && + hasProp(v, '$type') && + v.$type === 'app.rocksky.player.defs#currentlyPlayingViewDetailed' + ) +} + +export function validateCurrentlyPlayingViewDetailed( + v: unknown, +): ValidationResult { + return lexicons.validate( + 'app.rocksky.player.defs#currentlyPlayingViewDetailed', + v, + ) +} diff --git a/apps/api/src/lexicon/types/app/rocksky/player/getCurrentlyPlaying.ts b/apps/api/src/lexicon/types/app/rocksky/player/getCurrentlyPlaying.ts new file mode 100644 index 00000000..8b90df1a --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/player/getCurrentlyPlaying.ts @@ -0,0 +1,43 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskyPlayerDefs from './defs' + +export interface QueryParams { + /** Handle or DID of the actor to retrieve the currently playing track for. If not provided, defaults to the current user. */ + actor?: string +} + +export type InputSchema = undefined +export type OutputSchema = AppRockskyPlayerDefs.CurrentlyPlayingViewDetailed +export type HandlerInput = undefined + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/player/next.ts b/apps/api/src/lexicon/types/app/rocksky/player/next.ts new file mode 100644 index 00000000..7620d0ab --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/player/next.ts @@ -0,0 +1,32 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' + +export interface QueryParams {} + +export type InputSchema = undefined +export type HandlerInput = undefined + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | void +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/player/pause.ts b/apps/api/src/lexicon/types/app/rocksky/player/pause.ts new file mode 100644 index 00000000..7620d0ab --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/player/pause.ts @@ -0,0 +1,32 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' + +export interface QueryParams {} + +export type InputSchema = undefined +export type HandlerInput = undefined + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | void +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/player/play.ts b/apps/api/src/lexicon/types/app/rocksky/player/play.ts new file mode 100644 index 00000000..7620d0ab --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/player/play.ts @@ -0,0 +1,32 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' + +export interface QueryParams {} + +export type InputSchema = undefined +export type HandlerInput = undefined + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | void +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/player/previous.ts b/apps/api/src/lexicon/types/app/rocksky/player/previous.ts new file mode 100644 index 00000000..7620d0ab --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/player/previous.ts @@ -0,0 +1,32 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' + +export interface QueryParams {} + +export type InputSchema = undefined +export type HandlerInput = undefined + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | void +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/player/seek.ts b/apps/api/src/lexicon/types/app/rocksky/player/seek.ts new file mode 100644 index 00000000..dd93805e --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/player/seek.ts @@ -0,0 +1,35 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' + +export interface QueryParams { + /** The position in seconds to seek to */ + position: number +} + +export type InputSchema = undefined +export type HandlerInput = undefined + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | void +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/playlist.ts b/apps/api/src/lexicon/types/app/rocksky/playlist.ts new file mode 100644 index 00000000..7b2786a8 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/playlist.ts @@ -0,0 +1,43 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../lexicons' +import { isObj, hasProp } from '../../../util' +import { CID } from 'multiformats/cid' +import * as AppRockskySong from './song' + +export interface Record { + /** The name of the playlist. */ + name: string + /** The playlist description. */ + description?: string + /** The picture of the playlist. */ + picture?: BlobRef + /** The tracks in the playlist. */ + tracks?: AppRockskySong.Record[] + /** The date the playlist was created. */ + createdAt: string + /** The Spotify link of the playlist. */ + spotifyLink?: string + /** The Tidal link of the playlist. */ + tidalLink?: string + /** The YouTube link of the playlist. */ + youtubeLink?: string + /** The Apple Music link of the playlist. */ + appleMusicLink?: string + [k: string]: unknown +} + +export function isRecord(v: unknown): v is Record { + return ( + isObj(v) && + hasProp(v, '$type') && + (v.$type === 'app.rocksky.playlist#main' || + v.$type === 'app.rocksky.playlist') + ) +} + +export function validateRecord(v: unknown): ValidationResult { + return lexicons.validate('app.rocksky.playlist#main', v) +} diff --git a/apps/api/src/lexicon/types/app/rocksky/playlist/defs.ts b/apps/api/src/lexicon/types/app/rocksky/playlist/defs.ts new file mode 100644 index 00000000..bad166b9 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/playlist/defs.ts @@ -0,0 +1,86 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import * as AppRockskySongDefs from '../song/defs' + +/** Detailed view of a playlist, including its tracks and metadata */ +export interface PlaylistViewDetailed { + /** The unique identifier of the playlist. */ + id?: string + /** The title of the playlist. */ + title?: string + /** The URI of the playlist. */ + uri?: string + /** The DID of the curator of the playlist. */ + curatorDid?: string + /** The handle of the curator of the playlist. */ + curatorHandle?: string + /** The name of the curator of the playlist. */ + curatorName?: string + /** The URL of the avatar image of the curator. */ + curatorAvatarUrl?: string + /** A description of the playlist. */ + description?: string + /** The URL of the cover image for the playlist. */ + coverImageUrl?: string + /** The date and time when the playlist was created. */ + createdAt?: string + /** A list of tracks in the playlist. */ + tracks?: AppRockskySongDefs.SongViewBasic[] + [k: string]: unknown +} + +export function isPlaylistViewDetailed(v: unknown): v is PlaylistViewDetailed { + return ( + isObj(v) && + hasProp(v, '$type') && + v.$type === 'app.rocksky.playlist.defs#playlistViewDetailed' + ) +} + +export function validatePlaylistViewDetailed(v: unknown): ValidationResult { + return lexicons.validate('app.rocksky.playlist.defs#playlistViewDetailed', v) +} + +/** Basic view of a playlist, including its metadata */ +export interface PlaylistViewBasic { + /** The unique identifier of the playlist. */ + id?: string + /** The title of the playlist. */ + title?: string + /** The URI of the playlist. */ + uri?: string + /** The DID of the curator of the playlist. */ + curatorDid?: string + /** The handle of the curator of the playlist. */ + curatorHandle?: string + /** The name of the curator of the playlist. */ + curatorName?: string + /** The URL of the avatar image of the curator. */ + curatorAvatarUrl?: string + /** A description of the playlist. */ + description?: string + /** The URL of the cover image for the playlist. */ + coverImageUrl?: string + /** The date and time when the playlist was created. */ + createdAt?: string + /** The number of tracks in the playlist. */ + trackCount?: number + [k: string]: unknown +} + +export function isPlaylistViewBasic(v: unknown): v is PlaylistViewBasic { + return ( + isObj(v) && + hasProp(v, '$type') && + v.$type === 'app.rocksky.playlist.defs#playlistViewBasic' + ) +} + +export function validatePlaylistViewBasic(v: unknown): ValidationResult { + return lexicons.validate('app.rocksky.playlist.defs#playlistViewBasic', v) +} diff --git a/apps/api/src/lexicon/types/app/rocksky/playlist/getPlaylist.ts b/apps/api/src/lexicon/types/app/rocksky/playlist/getPlaylist.ts new file mode 100644 index 00000000..93225239 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/playlist/getPlaylist.ts @@ -0,0 +1,43 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskyPlaylistDefs from './defs' + +export interface QueryParams { + /** The URI of the playlist to retrieve. */ + uri: string +} + +export type InputSchema = undefined +export type OutputSchema = AppRockskyPlaylistDefs.PlaylistViewDetailed +export type HandlerInput = undefined + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/playlist/getPlaylists.ts b/apps/api/src/lexicon/types/app/rocksky/playlist/getPlaylists.ts new file mode 100644 index 00000000..71988caa --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/playlist/getPlaylists.ts @@ -0,0 +1,50 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskyPlaylistDefs from './defs' + +export interface QueryParams { + /** The maximum number of playlists to return. */ + limit?: number + /** The offset for pagination, used to skip a number of playlists. */ + offset?: number +} + +export type InputSchema = undefined + +export interface OutputSchema { + playlists?: AppRockskyPlaylistDefs.PlaylistViewBasic[] + [k: string]: unknown +} + +export type HandlerInput = undefined + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/radio.ts b/apps/api/src/lexicon/types/app/rocksky/radio.ts new file mode 100644 index 00000000..68b5d3b4 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/radio.ts @@ -0,0 +1,37 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../lexicons' +import { isObj, hasProp } from '../../../util' +import { CID } from 'multiformats/cid' + +export interface Record { + /** The name of the radio station. */ + name: string + /** The URL of the radio station. */ + url: string + /** A description of the radio station. */ + description?: string + /** The genre of the radio station. */ + genre?: string + /** The logo of the radio station. */ + logo?: BlobRef + /** The website of the radio station. */ + website?: string + /** The date when the radio station was created. */ + createdAt: string + [k: string]: unknown +} + +export function isRecord(v: unknown): v is Record { + return ( + isObj(v) && + hasProp(v, '$type') && + (v.$type === 'app.rocksky.radio#main' || v.$type === 'app.rocksky.radio') + ) +} + +export function validateRecord(v: unknown): ValidationResult { + return lexicons.validate('app.rocksky.radio#main', v) +} diff --git a/apps/api/src/lexicon/types/app/rocksky/radio/defs.ts b/apps/api/src/lexicon/types/app/rocksky/radio/defs.ts new file mode 100644 index 00000000..05ad0d89 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/radio/defs.ts @@ -0,0 +1,63 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' + +export interface RadioViewBasic { + /** The unique identifier of the radio. */ + id?: string + /** The name of the radio. */ + name?: string + /** A brief description of the radio. */ + description?: string + /** The date and time when the radio was created. */ + createdAt?: string + [k: string]: unknown +} + +export function isRadioViewBasic(v: unknown): v is RadioViewBasic { + return ( + isObj(v) && + hasProp(v, '$type') && + v.$type === 'app.rocksky.radio.defs#radioViewBasic' + ) +} + +export function validateRadioViewBasic(v: unknown): ValidationResult { + return lexicons.validate('app.rocksky.radio.defs#radioViewBasic', v) +} + +export interface RadioViewDetailed { + /** The unique identifier of the radio. */ + id?: string + /** The name of the radio. */ + name?: string + /** A brief description of the radio. */ + description?: string + /** The website of the radio. */ + website?: string + /** The streaming URL of the radio. */ + url?: string + /** The genre of the radio. */ + genre?: string + /** The logo of the radio station. */ + logo?: string + /** The date and time when the radio was created. */ + createdAt?: string + [k: string]: unknown +} + +export function isRadioViewDetailed(v: unknown): v is RadioViewDetailed { + return ( + isObj(v) && + hasProp(v, '$type') && + v.$type === 'app.rocksky.radio.defs#radioViewDetailed' + ) +} + +export function validateRadioViewDetailed(v: unknown): ValidationResult { + return lexicons.validate('app.rocksky.radio.defs#radioViewDetailed', v) +} diff --git a/apps/api/src/lexicon/types/app/rocksky/scrobble.ts b/apps/api/src/lexicon/types/app/rocksky/scrobble.ts new file mode 100644 index 00000000..0385b73f --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/scrobble.ts @@ -0,0 +1,70 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../lexicons' +import { isObj, hasProp } from '../../../util' +import { CID } from 'multiformats/cid' + +export interface Record { + /** The title of the song. */ + title: string + /** The artist of the song. */ + artist: string + /** The album artist of the song. */ + albumArtist: string + /** The album of the song. */ + album: string + /** The duration of the song in seconds. */ + duration: number + /** The track number of the song in the album. */ + trackNumber?: number + /** The disc number of the song in the album. */ + discNumber?: number + /** The release date of the song. */ + releaseDate?: string + /** The year the song was released. */ + year?: number + /** The genre of the song. */ + genre?: string + /** The tags of the song. */ + tags?: string[] + /** The composer of the song. */ + composer?: string + /** The lyrics of the song. */ + lyrics?: string + /** The copyright message of the song. */ + copyrightMessage?: string + /** Informations about the song */ + wiki?: string + /** The album art of the song. */ + albumArt?: BlobRef + /** The YouTube link of the song. */ + youtubeLink?: string + /** The Spotify link of the song. */ + spotifyLink?: string + /** The Tidal link of the song. */ + tidalLink?: string + /** The Apple Music link of the song. */ + appleMusicLink?: string + /** The date when the song was created. */ + createdAt: string + /** The MusicBrainz ID of the song. */ + mbid?: string + /** The label of the song. */ + label?: string + [k: string]: unknown +} + +export function isRecord(v: unknown): v is Record { + return ( + isObj(v) && + hasProp(v, '$type') && + (v.$type === 'app.rocksky.scrobble#main' || + v.$type === 'app.rocksky.scrobble') + ) +} + +export function validateRecord(v: unknown): ValidationResult { + return lexicons.validate('app.rocksky.scrobble#main', v) +} diff --git a/apps/api/src/lexicon/types/app/rocksky/scrobble/createScrobble.ts b/apps/api/src/lexicon/types/app/rocksky/scrobble/createScrobble.ts new file mode 100644 index 00000000..112361e4 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/scrobble/createScrobble.ts @@ -0,0 +1,91 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskyScrobbleDefs from './defs' + +export interface QueryParams {} + +export interface InputSchema { + /** The title of the track being scrobbled */ + title: string + /** The artist of the track being scrobbled */ + artist: string + /** The album of the track being scrobbled */ + album?: string + /** The duration of the track in seconds */ + duration?: number + /** The MusicBrainz ID of the track, if available */ + mbId?: string + /** The URL of the album art for the track */ + albumArt?: string + /** The track number of the track in the album */ + trackNumber?: number + /** The release date of the track, formatted as YYYY-MM-DD */ + releaseDate?: string + /** The year the track was released */ + year?: number + /** The disc number of the track in the album, if applicable */ + discNumber?: number + /** The lyrics of the track, if available */ + lyrics?: string + /** The composer of the track, if available */ + composer?: string + /** The copyright message for the track, if available */ + copyrightMessage?: string + /** The record label of the track, if available */ + label?: string + /** The URL of the artist's picture, if available */ + artistPicture?: string + /** The Spotify link for the track, if available */ + spotifyLink?: string + /** The Last.fm link for the track, if available */ + lastfmLink?: string + /** The Tidal link for the track, if available */ + tidalLink?: string + /** The Apple Music link for the track, if available */ + appleMusicLink?: string + /** The Youtube link for the track, if available */ + youtubeLink?: string + /** The Deezer link for the track, if available */ + deezerLink?: string + /** The timestamp of the scrobble in milliseconds since epoch */ + timestamp?: number + [k: string]: unknown +} + +export type OutputSchema = AppRockskyScrobbleDefs.ScrobbleViewBasic + +export interface HandlerInput { + encoding: 'application/json' + body: InputSchema +} + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/scrobble/defs.ts b/apps/api/src/lexicon/types/app/rocksky/scrobble/defs.ts new file mode 100644 index 00000000..e6c88073 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/scrobble/defs.ts @@ -0,0 +1,87 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' + +export interface ScrobbleViewBasic { + /** The unique identifier of the scrobble. */ + id?: string + /** The handle of the user who created the scrobble. */ + user?: string + /** The title of the scrobble. */ + title?: string + /** The artist of the song. */ + artist?: string + /** The URI of the artist. */ + artistUri?: string + /** The album of the song. */ + album?: string + /** The URI of the album. */ + albumUri?: string + /** The album art URL of the song. */ + cover?: string + /** The timestamp when the scrobble was created. */ + date?: string + /** The URI of the scrobble. */ + uri?: string + /** The SHA256 hash of the scrobble data. */ + sha256?: string + [k: string]: unknown +} + +export function isScrobbleViewBasic(v: unknown): v is ScrobbleViewBasic { + return ( + isObj(v) && + hasProp(v, '$type') && + v.$type === 'app.rocksky.scrobble.defs#scrobbleViewBasic' + ) +} + +export function validateScrobbleViewBasic(v: unknown): ValidationResult { + return lexicons.validate('app.rocksky.scrobble.defs#scrobbleViewBasic', v) +} + +export interface ScrobbleViewDetailed { + /** The unique identifier of the scrobble. */ + id?: string + /** The handle of the user who created the scrobble. */ + user?: string + /** The title of the scrobble. */ + title?: string + /** The artist of the song. */ + artist?: string + /** The URI of the artist. */ + artistUri?: string + /** The album of the song. */ + album?: string + /** The URI of the album. */ + albumUri?: string + /** The album art URL of the song. */ + cover?: string + /** The timestamp when the scrobble was created. */ + date?: string + /** The URI of the scrobble. */ + uri?: string + /** The SHA256 hash of the scrobble data. */ + sha256?: string + /** The number of listeners */ + listeners?: number + /** The number of scrobbles for this song */ + scrobbles?: number + [k: string]: unknown +} + +export function isScrobbleViewDetailed(v: unknown): v is ScrobbleViewDetailed { + return ( + isObj(v) && + hasProp(v, '$type') && + v.$type === 'app.rocksky.scrobble.defs#scrobbleViewDetailed' + ) +} + +export function validateScrobbleViewDetailed(v: unknown): ValidationResult { + return lexicons.validate('app.rocksky.scrobble.defs#scrobbleViewDetailed', v) +} diff --git a/apps/api/src/lexicon/types/app/rocksky/scrobble/getScrobble.ts b/apps/api/src/lexicon/types/app/rocksky/scrobble/getScrobble.ts new file mode 100644 index 00000000..7be8fa29 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/scrobble/getScrobble.ts @@ -0,0 +1,43 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskyScrobbleDefs from './defs' + +export interface QueryParams { + /** The unique identifier of the scrobble */ + uri: string +} + +export type InputSchema = undefined +export type OutputSchema = AppRockskyScrobbleDefs.ScrobbleViewDetailed +export type HandlerInput = undefined + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/scrobble/getScrobbles.ts b/apps/api/src/lexicon/types/app/rocksky/scrobble/getScrobbles.ts new file mode 100644 index 00000000..989a6229 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/scrobble/getScrobbles.ts @@ -0,0 +1,52 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskyScrobbleDefs from './defs' + +export interface QueryParams { + /** The DID or handle of the actor */ + did?: string + /** The maximum number of scrobbles to return */ + limit?: number + /** The offset for pagination */ + offset?: number +} + +export type InputSchema = undefined + +export interface OutputSchema { + scrobbles?: AppRockskyScrobbleDefs.ScrobbleViewBasic[] + [k: string]: unknown +} + +export type HandlerInput = undefined + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/shout.ts b/apps/api/src/lexicon/types/app/rocksky/shout.ts new file mode 100644 index 00000000..351d5200 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/shout.ts @@ -0,0 +1,30 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../lexicons' +import { isObj, hasProp } from '../../../util' +import { CID } from 'multiformats/cid' +import * as ComAtprotoRepoStrongRef from '../../com/atproto/repo/strongRef' + +export interface Record { + /** The message of the shout. */ + message: string + /** The date when the shout was created. */ + createdAt: string + parent?: ComAtprotoRepoStrongRef.Main + subject: ComAtprotoRepoStrongRef.Main + [k: string]: unknown +} + +export function isRecord(v: unknown): v is Record { + return ( + isObj(v) && + hasProp(v, '$type') && + (v.$type === 'app.rocksky.shout#main' || v.$type === 'app.rocksky.shout') + ) +} + +export function validateRecord(v: unknown): ValidationResult { + return lexicons.validate('app.rocksky.shout#main', v) +} diff --git a/apps/api/src/lexicon/types/app/rocksky/shout/createShout.ts b/apps/api/src/lexicon/types/app/rocksky/shout/createShout.ts new file mode 100644 index 00000000..f465e7c1 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/shout/createShout.ts @@ -0,0 +1,49 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskyShoutDefs from './defs' + +export interface QueryParams {} + +export interface InputSchema { + /** The content of the shout */ + message?: string + [k: string]: unknown +} + +export type OutputSchema = AppRockskyShoutDefs.ShoutView + +export interface HandlerInput { + encoding: 'application/json' + body: InputSchema +} + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/shout/defs.ts b/apps/api/src/lexicon/types/app/rocksky/shout/defs.ts new file mode 100644 index 00000000..14d3404a --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/shout/defs.ts @@ -0,0 +1,58 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' + +export interface Author { + /** The unique identifier of the author. */ + id?: string + /** The decentralized identifier (DID) of the author. */ + did?: string + /** The handle of the author. */ + handle?: string + /** The display name of the author. */ + displayName?: string + /** The URL of the author's avatar image. */ + avatar?: string + [k: string]: unknown +} + +export function isAuthor(v: unknown): v is Author { + return ( + isObj(v) && + hasProp(v, '$type') && + v.$type === 'app.rocksky.shout.defs#author' + ) +} + +export function validateAuthor(v: unknown): ValidationResult { + return lexicons.validate('app.rocksky.shout.defs#author', v) +} + +export interface ShoutView { + /** The unique identifier of the shout. */ + id?: string + /** The content of the shout. */ + message?: string + /** The ID of the parent shout if this is a reply, otherwise null. */ + parent?: string + /** The date and time when the shout was created. */ + createdAt?: string + author?: Author + [k: string]: unknown +} + +export function isShoutView(v: unknown): v is ShoutView { + return ( + isObj(v) && + hasProp(v, '$type') && + v.$type === 'app.rocksky.shout.defs#shoutView' + ) +} + +export function validateShoutView(v: unknown): ValidationResult { + return lexicons.validate('app.rocksky.shout.defs#shoutView', v) +} diff --git a/apps/api/src/lexicon/types/app/rocksky/shout/getAlbumShouts.ts b/apps/api/src/lexicon/types/app/rocksky/shout/getAlbumShouts.ts new file mode 100644 index 00000000..842c20f8 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/shout/getAlbumShouts.ts @@ -0,0 +1,52 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskyShoutDefs from './defs' + +export interface QueryParams { + /** The unique identifier of the album to retrieve shouts for */ + uri: string + /** The maximum number of shouts to return */ + limit?: number + /** The number of shouts to skip before starting to collect the result set */ + offset?: number +} + +export type InputSchema = undefined + +export interface OutputSchema { + shouts?: AppRockskyShoutDefs.ShoutViewBasic[] + [k: string]: unknown +} + +export type HandlerInput = undefined + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/shout/getArtistShouts.ts b/apps/api/src/lexicon/types/app/rocksky/shout/getArtistShouts.ts new file mode 100644 index 00000000..67e6f27b --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/shout/getArtistShouts.ts @@ -0,0 +1,52 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskyShoutDefs from './defs' + +export interface QueryParams { + /** The URI of the artist to retrieve shouts for */ + uri: string + /** The maximum number of shouts to return */ + limit?: number + /** The number of shouts to skip before starting to collect the result set */ + offset?: number +} + +export type InputSchema = undefined + +export interface OutputSchema { + shouts?: AppRockskyShoutDefs.ShoutViewBasic[] + [k: string]: unknown +} + +export type HandlerInput = undefined + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/shout/getProfileShouts.ts b/apps/api/src/lexicon/types/app/rocksky/shout/getProfileShouts.ts new file mode 100644 index 00000000..3a7b308c --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/shout/getProfileShouts.ts @@ -0,0 +1,52 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskyShoutDefs from './defs' + +export interface QueryParams { + /** The DID or handle of the actor */ + did: string + /** The offset for pagination */ + offset?: number + /** The maximum number of shouts to return */ + limit?: number +} + +export type InputSchema = undefined + +export interface OutputSchema { + shouts?: AppRockskyShoutDefs.ShoutViewBasic[] + [k: string]: unknown +} + +export type HandlerInput = undefined + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/shout/getShoutReplies.ts b/apps/api/src/lexicon/types/app/rocksky/shout/getShoutReplies.ts new file mode 100644 index 00000000..7776b3cd --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/shout/getShoutReplies.ts @@ -0,0 +1,52 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskyShoutDefs from './defs' + +export interface QueryParams { + /** The URI of the shout to retrieve replies for */ + uri: string + /** The maximum number of shouts to return */ + limit?: number + /** The number of shouts to skip before starting to collect the result set */ + offset?: number +} + +export type InputSchema = undefined + +export interface OutputSchema { + shouts?: AppRockskyShoutDefs.ShoutViewBasic[] + [k: string]: unknown +} + +export type HandlerInput = undefined + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/shout/getTrackShouts.ts b/apps/api/src/lexicon/types/app/rocksky/shout/getTrackShouts.ts new file mode 100644 index 00000000..4059f75e --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/shout/getTrackShouts.ts @@ -0,0 +1,48 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskyShoutDefs from './defs' + +export interface QueryParams { + /** The URI of the track to retrieve shouts for */ + uri: string +} + +export type InputSchema = undefined + +export interface OutputSchema { + shouts?: AppRockskyShoutDefs.ShoutViewBasic[] + [k: string]: unknown +} + +export type HandlerInput = undefined + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/shout/removeShout.ts b/apps/api/src/lexicon/types/app/rocksky/shout/removeShout.ts new file mode 100644 index 00000000..b09720f2 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/shout/removeShout.ts @@ -0,0 +1,43 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskyShoutDefs from './defs' + +export interface QueryParams { + /** The ID of the shout to be removed */ + id: string +} + +export type InputSchema = undefined +export type OutputSchema = AppRockskyShoutDefs.ShoutView +export type HandlerInput = undefined + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/shout/replyShout.ts b/apps/api/src/lexicon/types/app/rocksky/shout/replyShout.ts new file mode 100644 index 00000000..4c703c9c --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/shout/replyShout.ts @@ -0,0 +1,51 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskyShoutDefs from './defs' + +export interface QueryParams {} + +export interface InputSchema { + /** The unique identifier of the shout to reply to */ + shoutId: string + /** The content of the reply */ + message: string + [k: string]: unknown +} + +export type OutputSchema = AppRockskyShoutDefs.ShoutView + +export interface HandlerInput { + encoding: 'application/json' + body: InputSchema +} + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/shout/reportShout.ts b/apps/api/src/lexicon/types/app/rocksky/shout/reportShout.ts new file mode 100644 index 00000000..db43497b --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/shout/reportShout.ts @@ -0,0 +1,51 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskyShoutDefs from './defs' + +export interface QueryParams {} + +export interface InputSchema { + /** The unique identifier of the shout to report */ + shoutId: string + /** The reason for reporting the shout */ + reason?: string + [k: string]: unknown +} + +export type OutputSchema = AppRockskyShoutDefs.ShoutView + +export interface HandlerInput { + encoding: 'application/json' + body: InputSchema +} + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/song.ts b/apps/api/src/lexicon/types/app/rocksky/song.ts new file mode 100644 index 00000000..685648f1 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/song.ts @@ -0,0 +1,69 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../lexicons' +import { isObj, hasProp } from '../../../util' +import { CID } from 'multiformats/cid' + +export interface Record { + /** The title of the song. */ + title: string + /** The artist of the song. */ + artist: string + /** The album artist of the song. */ + albumArtist: string + /** The album of the song. */ + album: string + /** The duration of the song in seconds. */ + duration: number + /** The track number of the song in the album. */ + trackNumber?: number + /** The disc number of the song in the album. */ + discNumber?: number + /** The release date of the song. */ + releaseDate?: string + /** The year the song was released. */ + year?: number + /** The genre of the song. */ + genre?: string + /** The tags of the song. */ + tags?: string[] + /** The composer of the song. */ + composer?: string + /** The lyrics of the song. */ + lyrics?: string + /** The copyright message of the song. */ + copyrightMessage?: string + /** Informations about the song */ + wiki?: string + /** The album art of the song. */ + albumArt?: BlobRef + /** The YouTube link of the song. */ + youtubeLink?: string + /** The Spotify link of the song. */ + spotifyLink?: string + /** The Tidal link of the song. */ + tidalLink?: string + /** The Apple Music link of the song. */ + appleMusicLink?: string + /** The date when the song was created. */ + createdAt: string + /** The MusicBrainz ID of the song. */ + mbid?: string + /** The label of the song. */ + label?: string + [k: string]: unknown +} + +export function isRecord(v: unknown): v is Record { + return ( + isObj(v) && + hasProp(v, '$type') && + (v.$type === 'app.rocksky.song#main' || v.$type === 'app.rocksky.song') + ) +} + +export function validateRecord(v: unknown): ValidationResult { + return lexicons.validate('app.rocksky.song#main', v) +} diff --git a/apps/api/src/lexicon/types/app/rocksky/song/createSong.ts b/apps/api/src/lexicon/types/app/rocksky/song/createSong.ts new file mode 100644 index 00000000..d957f159 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/song/createSong.ts @@ -0,0 +1,71 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskySongDefs from './defs' + +export interface QueryParams {} + +export interface InputSchema { + /** The title of the song */ + title: string + /** The artist of the song */ + artist: string + /** The album artist of the song, if different from the main artist */ + albumArtist: string + /** The album of the song, if applicable */ + album: string + /** The duration of the song in seconds */ + duration?: number + /** The MusicBrainz ID of the song, if available */ + mbId?: string + /** The URL of the album art for the song */ + albumArt?: string + /** The track number of the song in the album, if applicable */ + trackNumber?: number + /** The release date of the song, formatted as YYYY-MM-DD */ + releaseDate?: string + /** The year the song was released */ + year?: number + /** The disc number of the song in the album, if applicable */ + discNumber?: number + /** The lyrics of the song, if available */ + lyrics?: string + [k: string]: unknown +} + +export type OutputSchema = AppRockskySongDefs.SongViewDetailed + +export interface HandlerInput { + encoding: 'application/json' + body: InputSchema +} + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/song/defs.ts b/apps/api/src/lexicon/types/app/rocksky/song/defs.ts new file mode 100644 index 00000000..a6f6577d --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/song/defs.ts @@ -0,0 +1,103 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' + +export interface SongViewBasic { + /** The unique identifier of the song. */ + id?: string + /** The title of the song. */ + title?: string + /** The artist of the song. */ + artist?: string + /** The artist of the album the song belongs to. */ + albumArtist?: string + /** The URL of the album art image. */ + albumArt?: string + /** The URI of the song. */ + uri?: string + /** The album of the song. */ + album?: string + /** The duration of the song in milliseconds. */ + duration?: number + /** The track number of the song in the album. */ + trackNumber?: number + /** The disc number of the song in the album. */ + discNumber?: number + /** The number of times the song has been played. */ + playCount?: number + /** The number of unique listeners who have played the song. */ + uniqueListeners?: number + /** The URI of the album the song belongs to. */ + albumUri?: string + /** The URI of the artist of the song. */ + artistUri?: string + /** The SHA256 hash of the song. */ + sha256?: string + /** The timestamp when the song was created. */ + createdAt?: string + [k: string]: unknown +} + +export function isSongViewBasic(v: unknown): v is SongViewBasic { + return ( + isObj(v) && + hasProp(v, '$type') && + v.$type === 'app.rocksky.song.defs#songViewBasic' + ) +} + +export function validateSongViewBasic(v: unknown): ValidationResult { + return lexicons.validate('app.rocksky.song.defs#songViewBasic', v) +} + +export interface SongViewDetailed { + /** The unique identifier of the song. */ + id?: string + /** The title of the song. */ + title?: string + /** The artist of the song. */ + artist?: string + /** The artist of the album the song belongs to. */ + albumArtist?: string + /** The URL of the album art image. */ + albumArt?: string + /** The URI of the song. */ + uri?: string + /** The album of the song. */ + album?: string + /** The duration of the song in milliseconds. */ + duration?: number + /** The track number of the song in the album. */ + trackNumber?: number + /** The disc number of the song in the album. */ + discNumber?: number + /** The number of times the song has been played. */ + playCount?: number + /** The number of unique listeners who have played the song. */ + uniqueListeners?: number + /** The URI of the album the song belongs to. */ + albumUri?: string + /** The URI of the artist of the song. */ + artistUri?: string + /** The SHA256 hash of the song. */ + sha256?: string + /** The timestamp when the song was created. */ + createdAt?: string + [k: string]: unknown +} + +export function isSongViewDetailed(v: unknown): v is SongViewDetailed { + return ( + isObj(v) && + hasProp(v, '$type') && + v.$type === 'app.rocksky.song.defs#songViewDetailed' + ) +} + +export function validateSongViewDetailed(v: unknown): ValidationResult { + return lexicons.validate('app.rocksky.song.defs#songViewDetailed', v) +} diff --git a/apps/api/src/lexicon/types/app/rocksky/song/getSong.ts b/apps/api/src/lexicon/types/app/rocksky/song/getSong.ts new file mode 100644 index 00000000..9cd6a7d8 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/song/getSong.ts @@ -0,0 +1,43 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskySongDefs from './defs' + +export interface QueryParams { + /** The unique identifier of the song to retrieve */ + uri: string +} + +export type InputSchema = undefined +export type OutputSchema = AppRockskySongDefs.SongViewDetailed +export type HandlerInput = undefined + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/song/getSongs.ts b/apps/api/src/lexicon/types/app/rocksky/song/getSongs.ts new file mode 100644 index 00000000..49e95225 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/song/getSongs.ts @@ -0,0 +1,50 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskySongDefs from './defs' + +export interface QueryParams { + /** The maximum number of songs to return */ + limit?: number + /** The offset for pagination */ + offset?: number +} + +export type InputSchema = undefined + +export interface OutputSchema { + songs?: AppRockskySongDefs.SongViewBasic[] + [k: string]: unknown +} + +export type HandlerInput = undefined + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/spotify/defs.ts b/apps/api/src/lexicon/types/app/rocksky/spotify/defs.ts new file mode 100644 index 00000000..946729cd --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/spotify/defs.ts @@ -0,0 +1,35 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' + +export interface SpotifyTrackView { + /** The unique identifier of the Spotify track. */ + id?: string + /** The name of the track. */ + name?: string + /** The name of the artist. */ + artist?: string + /** The name of the album. */ + album?: string + /** The duration of the track in milliseconds. */ + duration?: number + /** A URL to a preview of the track. */ + previewUrl?: string + [k: string]: unknown +} + +export function isSpotifyTrackView(v: unknown): v is SpotifyTrackView { + return ( + isObj(v) && + hasProp(v, '$type') && + v.$type === 'app.rocksky.spotify.defs#spotifyTrackView' + ) +} + +export function validateSpotifyTrackView(v: unknown): ValidationResult { + return lexicons.validate('app.rocksky.spotify.defs#spotifyTrackView', v) +} diff --git a/apps/api/src/lexicon/types/app/rocksky/spotify/getCurrentlyPlaying.ts b/apps/api/src/lexicon/types/app/rocksky/spotify/getCurrentlyPlaying.ts new file mode 100644 index 00000000..41b8ff7c --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/spotify/getCurrentlyPlaying.ts @@ -0,0 +1,43 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskyPlayerDefs from '../player/defs' + +export interface QueryParams { + /** Handle or DID of the actor to retrieve the currently playing track for. If not provided, defaults to the current user. */ + actor?: string +} + +export type InputSchema = undefined +export type OutputSchema = AppRockskyPlayerDefs.CurrentlyPlayingViewDetailed +export type HandlerInput = undefined + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/spotify/next.ts b/apps/api/src/lexicon/types/app/rocksky/spotify/next.ts new file mode 100644 index 00000000..7620d0ab --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/spotify/next.ts @@ -0,0 +1,32 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' + +export interface QueryParams {} + +export type InputSchema = undefined +export type HandlerInput = undefined + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | void +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/spotify/pause.ts b/apps/api/src/lexicon/types/app/rocksky/spotify/pause.ts new file mode 100644 index 00000000..7620d0ab --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/spotify/pause.ts @@ -0,0 +1,32 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' + +export interface QueryParams {} + +export type InputSchema = undefined +export type HandlerInput = undefined + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | void +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/spotify/play.ts b/apps/api/src/lexicon/types/app/rocksky/spotify/play.ts new file mode 100644 index 00000000..7620d0ab --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/spotify/play.ts @@ -0,0 +1,32 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' + +export interface QueryParams {} + +export type InputSchema = undefined +export type HandlerInput = undefined + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | void +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/spotify/previous.ts b/apps/api/src/lexicon/types/app/rocksky/spotify/previous.ts new file mode 100644 index 00000000..7620d0ab --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/spotify/previous.ts @@ -0,0 +1,32 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' + +export interface QueryParams {} + +export type InputSchema = undefined +export type HandlerInput = undefined + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | void +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/spotify/seek.ts b/apps/api/src/lexicon/types/app/rocksky/spotify/seek.ts new file mode 100644 index 00000000..dd93805e --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/spotify/seek.ts @@ -0,0 +1,35 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' + +export interface QueryParams { + /** The position in seconds to seek to */ + position: number +} + +export type InputSchema = undefined +export type HandlerInput = undefined + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | void +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/app/rocksky/stats/defs.ts b/apps/api/src/lexicon/types/app/rocksky/stats/defs.ts new file mode 100644 index 00000000..61adfa97 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/stats/defs.ts @@ -0,0 +1,33 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' + +export interface StatsView { + /** The total number of scrobbles. */ + scrobbles?: number + /** The total number of unique artists scrobbled. */ + artists?: number + /** The total number of tracks marked as loved. */ + lovedTracks?: number + /** The total number of unique albums scrobbled. */ + albums?: number + /** The total number of unique tracks scrobbled. */ + tracks?: number + [k: string]: unknown +} + +export function isStatsView(v: unknown): v is StatsView { + return ( + isObj(v) && + hasProp(v, '$type') && + v.$type === 'app.rocksky.stats.defs#statsView' + ) +} + +export function validateStatsView(v: unknown): ValidationResult { + return lexicons.validate('app.rocksky.stats.defs#statsView', v) +} diff --git a/apps/api/src/lexicon/types/app/rocksky/stats/getStats.ts b/apps/api/src/lexicon/types/app/rocksky/stats/getStats.ts new file mode 100644 index 00000000..6b863af8 --- /dev/null +++ b/apps/api/src/lexicon/types/app/rocksky/stats/getStats.ts @@ -0,0 +1,43 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import express from 'express' +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' +import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server' +import * as AppRockskyStatsDefs from './defs' + +export interface QueryParams { + /** The DID or handle of the user to get stats for. */ + did: string +} + +export type InputSchema = undefined +export type OutputSchema = AppRockskyStatsDefs.StatsView +export type HandlerInput = undefined + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough +export type HandlerReqCtx = { + auth: HA + params: QueryParams + input: HandlerInput + req: express.Request + res: express.Response + resetRouteRateLimits: () => Promise +} +export type Handler = ( + ctx: HandlerReqCtx, +) => Promise | HandlerOutput diff --git a/apps/api/src/lexicon/types/com/atproto/repo/strongRef.ts b/apps/api/src/lexicon/types/com/atproto/repo/strongRef.ts new file mode 100644 index 00000000..8b21a6dd --- /dev/null +++ b/apps/api/src/lexicon/types/com/atproto/repo/strongRef.ts @@ -0,0 +1,26 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' + +export interface Main { + uri: string + cid: string + [k: string]: unknown +} + +export function isMain(v: unknown): v is Main { + return ( + isObj(v) && + hasProp(v, '$type') && + (v.$type === 'com.atproto.repo.strongRef#main' || + v.$type === 'com.atproto.repo.strongRef') + ) +} + +export function validateMain(v: unknown): ValidationResult { + return lexicons.validate('com.atproto.repo.strongRef#main', v) +} diff --git a/apps/api/src/lexicon/util.ts b/apps/api/src/lexicon/util.ts new file mode 100644 index 00000000..d7e70440 --- /dev/null +++ b/apps/api/src/lexicon/util.ts @@ -0,0 +1,13 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +export function isObj(v: unknown): v is Record { + return typeof v === 'object' && v !== null +} + +export function hasProp( + data: object, + prop: K, +): data is Record { + return prop in data +} diff --git a/apps/api/src/lib/agent.ts b/apps/api/src/lib/agent.ts new file mode 100644 index 00000000..3c7310ce --- /dev/null +++ b/apps/api/src/lib/agent.ts @@ -0,0 +1,28 @@ +import { Agent } from "@atproto/api"; +import { NodeOAuthClient } from "@atproto/oauth-client-node"; + +export async function createAgent( + oauthClient: NodeOAuthClient, + did: string +): Promise { + let agent = null; + let retry = 0; + do { + try { + const oauthSession = await oauthClient.restore(did); + agent = oauthSession ? new Agent(oauthSession) : null; + if (agent === null) { + await new Promise((r) => setTimeout(r, 1000)); + retry += 1; + } + } catch (e) { + console.log("Error creating agent"); + console.log(did); + console.log(e); + await new Promise((r) => setTimeout(r, 1000)); + retry += 1; + } + } while (agent === null && retry < 5); + + return agent; +} diff --git a/apps/api/src/lib/authVerifier.ts b/apps/api/src/lib/authVerifier.ts new file mode 100644 index 00000000..ce1693f4 --- /dev/null +++ b/apps/api/src/lib/authVerifier.ts @@ -0,0 +1,28 @@ +import { AuthOutput } from "@atproto/xrpc-server"; +import express from "express"; +import jwt from "jsonwebtoken"; +import { env } from "./env"; + +type ReqCtx = { + req: express.Request; +}; + +export default function authVerifier(ctx: ReqCtx): AuthOutput { + if (!ctx.req.headers.authorization) { + return {}; + } + + const bearer = (ctx.req.headers.authorization || "").split(" ")[1]?.trim(); + + if (bearer && bearer !== "null") { + const credentials = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + + return { + credentials, + }; + } + + return {}; +} diff --git a/apps/api/src/lib/crypto.ts b/apps/api/src/lib/crypto.ts new file mode 100644 index 00000000..69609470 --- /dev/null +++ b/apps/api/src/lib/crypto.ts @@ -0,0 +1,28 @@ +import crypto from "crypto"; +import { env } from "./env"; + +export function encrypt(text: string, key: string) { + const iv = Buffer.from(env.SPOTIFY_ENCRYPTION_IV, "hex"); + const cipher = crypto.createCipheriv( + "aes-256-ctr", + Buffer.from(key, "hex"), + iv + ); + const encrypted = Buffer.concat([ + cipher.update(text, "utf8"), + cipher.final(), + ]); + return encrypted.toString("hex"); +} + +export function decrypt(encrypted: string, key: string) { + const iv = Buffer.from(env.SPOTIFY_ENCRYPTION_IV, "hex"); + const content = Buffer.from(encrypted, "hex"); + const decipher = crypto.createDecipheriv( + "aes-256-ctr", + Buffer.from(key, "hex"), + iv + ); + const decrypted = Buffer.concat([decipher.update(content), decipher.final()]); + return decrypted.toString("utf8"); +} diff --git a/apps/api/src/lib/didUnstorageCache.ts b/apps/api/src/lib/didUnstorageCache.ts new file mode 100644 index 00000000..403eea54 --- /dev/null +++ b/apps/api/src/lib/didUnstorageCache.ts @@ -0,0 +1,76 @@ +import { + type CacheResult, + type DidCache, + type DidDocument, +} from "@atproto/identity"; +import type { Storage } from "unstorage"; + +const HOUR = 60e3 * 60; +const DAY = HOUR * 24; + +type CacheVal = { + doc: DidDocument; + updatedAt: number; +}; + +/** + * An unstorage based DidCache with staleness and max TTL + */ +export class StorageCache implements DidCache { + public staleTTL: number; + public maxTTL: number; + public cache: Storage; + private prefix: string; + constructor({ + store, + prefix, + staleTTL, + maxTTL, + }: { + store: Storage; + prefix: string; + staleTTL?: number; + maxTTL?: number; + }) { + this.cache = store as Storage; + this.prefix = prefix; + this.staleTTL = staleTTL ?? HOUR; + this.maxTTL = maxTTL ?? DAY; + } + + async cacheDid(did: string, doc: DidDocument): Promise { + await this.cache.set(this.prefix + did, { doc, updatedAt: Date.now() }); + } + + async refreshCache( + did: string, + getDoc: () => Promise + ): Promise { + const doc = await getDoc(); + if (doc) { + await this.cacheDid(did, doc); + } + } + + async checkCache(did: string): Promise { + const val = await this.cache.get(this.prefix + did); + if (!val) return null; + const now = Date.now(); + const expired = now > val.updatedAt + this.maxTTL; + const stale = now > val.updatedAt + this.staleTTL; + return { + ...val, + did, + stale, + expired, + }; + } + + async clearEntry(did: string): Promise { + await this.cache.remove(this.prefix + did); + } + + async clear(): Promise { + await this.cache.clear(this.prefix); + } +} diff --git a/apps/api/src/lib/downloadImage.ts b/apps/api/src/lib/downloadImage.ts new file mode 100644 index 00000000..ec7fc6ba --- /dev/null +++ b/apps/api/src/lib/downloadImage.ts @@ -0,0 +1,19 @@ +import axios from "axios"; + +export async function getContentType(url: string): Promise { + const response = await axios.head(url); + return response.headers["content-type"] || null; +} + +export default async function downloadImage( + url?: string | null +): Promise { + if (!url) { + return null; + } + + const response = await axios.get(url, { + responseType: "arraybuffer", + }); + return Buffer.from(response.data); +} diff --git a/apps/api/src/lib/env.ts b/apps/api/src/lib/env.ts new file mode 100644 index 00000000..66a009e2 --- /dev/null +++ b/apps/api/src/lib/env.ts @@ -0,0 +1,42 @@ +import dotenv from "dotenv"; +import { cleanEnv, host, port, str, testOnly } from "envalid"; + +dotenv.config(); + +export const env = cleanEnv(process.env, { + NODE_ENV: str({ + devDefault: testOnly("test"), + choices: ["development", "production", "test"], + }), + HOST: host({ devDefault: testOnly("localhost") }), + PORT: port({ devDefault: testOnly(8000) }), + PUBLIC_URL: str({}), + DB_PATH: str({ devDefault: ":memory:" }), + KV_DB_PATH: str({ devDefault: ":memory:" }), + COOKIE_SECRET: str({ devDefault: "00000000000000000000000000000000" }), + FRONTEND_URL: str({ devDefault: "http://localhost:5174" }), + JWT_SECRET: str({ devDefault: "00000000000000000000000000000000" }), + SPOTIFY_REDIRECT_URI: str({ + devDefault: "http://localhost:8000/spotify/callback", + }), + SPOTIFY_CLIENT_ID: str({}), + SPOTIFY_CLIENT_SECRET: str({}), + SPOTIFY_ENCRYPTION_KEY: str({}), + SPOTIFY_ENCRYPTION_IV: str(), + ROCKSKY_BETA_TOKEN: str({}), + XATA_POSTGRES_URL: str({}), + NATS_URL: str({ devDefault: "nats://localhost:4222" }), + ANALYTICS: str({ devDefault: "http://localhost:7879" }), + DROPBOX_CLIENT_ID: str({}), + DROPBOX_CLIENT_SECRET: str({}), + DROPBOX_REDIRECT_URI: str({}), + GOOGLE_REDIRECT_URI: str({}), + GOOGLE_DRIVE: str({ default: "http://localhost:7880" }), + DROPBOX: str({ default: "http://localhost:7881" }), + REDIS_URL: str({ default: "redis://localhost:6379" }), + PRIVATE_KEY_1: str({}), + PRIVATE_KEY_2: str({}), + PRIVATE_KEY_3: str({}), + MEILISEARCH_URL: str({ devDefault: "http://localhost:7700" }), + MEILISEARCH_API_KEY: str({}), +}); diff --git a/apps/api/src/lib/idResolver.ts b/apps/api/src/lib/idResolver.ts new file mode 100644 index 00000000..3cff20e4 --- /dev/null +++ b/apps/api/src/lib/idResolver.ts @@ -0,0 +1,52 @@ +import { IdResolver } from "@atproto/identity"; +import type { Storage } from "unstorage"; +import { StorageCache } from "./didUnstorageCache"; + +const HOUR = 60e3 * 60; +const DAY = HOUR * 24; +const WEEK = HOUR * 7; + +export function createIdResolver(kv: Storage) { + return new IdResolver({ + didCache: new StorageCache({ + store: kv, + prefix: "didCache:", + staleTTL: DAY, + maxTTL: WEEK, + }), + }); +} + +export interface BidirectionalResolver { + resolveDidToHandle(did: string): Promise; + resolveDidsToHandles(dids: string[]): Promise>; +} + +export function createBidirectionalResolver(resolver: IdResolver) { + return { + async resolveDidToHandle(did: string): Promise { + const didDoc = await resolver.did.resolveAtprotoData(did); + + // asynchronously double check that the handle resolves back + resolver.handle.resolve(didDoc.handle).then((resolvedHandle) => { + if (resolvedHandle !== did) { + resolver.did.ensureResolve(did, true); + } + }); + return didDoc?.handle ?? did; + }, + + async resolveDidsToHandles( + dids: string[] + ): Promise> { + const didHandleMap: Record = {}; + const resolves = await Promise.all( + dids.map((did) => this.resolveDidToHandle(did).catch((_) => did)) + ); + for (let i = 0; i < dids.length; i++) { + didHandleMap[dids[i]] = resolves[i]; + } + return didHandleMap; + }, + }; +} diff --git a/apps/api/src/lib/index.ts b/apps/api/src/lib/index.ts new file mode 100644 index 00000000..21b172fe --- /dev/null +++ b/apps/api/src/lib/index.ts @@ -0,0 +1,58 @@ +import _ from "lodash"; +import * as R from "ramda"; + +export const dedupeTracksKeepLyrics = (tracks) => { + const trackMap = new Map(); + + for (const track of tracks) { + const key = `${track.discNumber} - ${track.trackNumber}`; + + if (!key) continue; + + const existing = trackMap.get(key); + + // If current has lyrics and either no existing or existing has no lyrics, replace it + if (!existing || (!existing.lyrics && track.lyrics)) { + trackMap.set(key, track); + } + } + + return Array.from(trackMap.values()); +}; + +type AnyObject = Record; + +const isObject = (val: unknown): val is AnyObject => + typeof val === "object" && val !== null && !Array.isArray(val); + +export const deepCamelCaseKeys = (obj: T): any => { + if (Array.isArray(obj)) { + return obj.map(deepCamelCaseKeys); + } else if (isObject(obj)) { + return R.pipe( + R.toPairs, + R.map( + ([key, value]) => + [_.camelCase(String(key)), deepCamelCaseKeys(value)] as [string, any] + ), + R.fromPairs + )(obj as object); + } + return obj; +}; + +export const deepSnakeCaseKeys = (obj: T): any => { + if (Array.isArray(obj)) { + return obj.map(deepSnakeCaseKeys); + } else if (isObject(obj)) { + return R.pipe( + R.toPairs, + R.map( + ([key, value]) => + [_.snakeCase(String(key)), deepSnakeCaseKeys(value)] as [string, any] + ), + R.fromPairs + )(obj as object); + } + return obj; +}; diff --git a/apps/api/src/lovedtracks/lovedtracks.service.ts b/apps/api/src/lovedtracks/lovedtracks.service.ts new file mode 100644 index 00000000..17bf7f2a --- /dev/null +++ b/apps/api/src/lovedtracks/lovedtracks.service.ts @@ -0,0 +1,261 @@ +import { Agent } from "@atproto/api"; +import { TID } from "@atproto/common"; +import { equals } from "@xata.io/client"; +import { Context } from "context"; +import { createHash } from "crypto"; +import * as LikeLexicon from "lexicon/types/app/rocksky/like"; +import { validateMain } from "lexicon/types/com/atproto/repo/strongRef"; +import { Track } from "types/track"; + +export async function likeTrack( + ctx: Context, + track: Track, + user, + agent: Agent +) { + const existingTrack = await ctx.client.db.tracks + .filter( + "sha256", + equals( + createHash("sha256") + .update( + `${track.title} - ${track.artist} - ${track.album}`.toLowerCase() + ) + .digest("hex") + ) + ) + .getFirst(); + + const { xata_id: track_id } = await ctx.client.db.tracks.createOrUpdate( + existingTrack?.xata_id, + { + title: track.title, + artist: track.artist, + album: track.album, + album_art: track.albumArt, + album_artist: track.albumArtist, + track_number: track.trackNumber, + duration: track.duration, + mb_id: track.mbId, + composer: track.composer, + lyrics: track.lyrics, + disc_number: track.discNumber, + // compute sha256 (lowercase(title + artist + album)) + sha256: createHash("sha256") + .update( + `${track.title} - ${track.artist} - ${track.album}`.toLowerCase() + ) + .digest("hex"), + } + ); + + const existingArtist = await ctx.client.db.artists + .filter( + "sha256", + equals( + createHash("sha256") + .update(track.albumArtist.toLocaleLowerCase()) + .digest("hex") + ) + ) + .getFirst(); + const { xata_id: artist_id } = await ctx.client.db.artists.createOrUpdate( + existingArtist?.xata_id, + { + name: track.albumArtist, + // compute sha256 (lowercase(name)) + sha256: createHash("sha256") + .update(track.albumArtist.toLowerCase()) + .digest("hex"), + } + ); + + const existingAlbum = await ctx.client.db.albums + .filter( + "sha256", + equals( + createHash("sha256") + .update(`${track.album} - ${track.albumArtist}`.toLowerCase()) + .digest("hex") + ) + ) + .getFirst(); + + const { xata_id: album_id } = await ctx.client.db.albums.createOrUpdate( + existingAlbum?.xata_id, + { + title: track.album, + artist: track.albumArtist, + album_art: track.albumArt, + year: track.year, + release_date: track.releaseDate + ? track.releaseDate.toISOString() + : undefined, + // compute sha256 (lowercase(title + artist)) + sha256: createHash("sha256") + .update(`${track.album} - ${track.albumArtist}`.toLowerCase()) + .digest("hex"), + } + ); + + const existingAlbumTrack = await ctx.client.db.album_tracks + .filter("album_id", equals(album_id)) + .filter("track_id", equals(track_id)) + .getFirst(); + + await ctx.client.db.album_tracks.createOrUpdate(existingAlbumTrack?.xata_id, { + album_id, + track_id, + }); + + const existingArtistTrack = await ctx.client.db.artist_tracks + .filter("artist_id", equals(artist_id)) + .filter("track_id", equals(track_id)) + .getFirst(); + + await ctx.client.db.artist_tracks.createOrUpdate( + existingArtistTrack?.xata_id, + { + artist_id, + track_id, + } + ); + + const existingArtistAlbum = await ctx.client.db.artist_albums + .filter("artist_id", equals(artist_id)) + .filter("album_id", equals(album_id)) + .getFirst(); + + await ctx.client.db.artist_albums.createOrUpdate( + existingArtistAlbum?.xata_id, + { + artist_id, + album_id, + } + ); + + const lovedTrack = await ctx.client.db.loved_tracks + .filter("user_id", equals(user.xata_id)) + .filter("track_id", equals(track_id)) + .getFirst(); + + let created = await ctx.client.db.loved_tracks.createOrUpdate( + lovedTrack?.xata_id, + { + user_id: user.xata_id, + track_id, + } + ); + + if (existingTrack.uri) { + const rkey = TID.nextStr(); + const subjectRecord = await agent.com.atproto.repo.getRecord({ + repo: existingTrack.uri + .split("/") + .slice(0, 3) + .join("/") + .split("at://")[1], + collection: "app.rocksky.song", + rkey: existingTrack.uri.split("/").pop(), + }); + + const subjectRef = validateMain({ + uri: existingTrack.uri, + cid: subjectRecord.data.cid, + }); + if (!subjectRef.success) { + throw new Error("[like] invalid ref"); + } + + const record = { + $type: "app.rocksky.like", + subject: subjectRef.value, + createdAt: new Date().toISOString(), + }; + + if (!LikeLexicon.validateRecord(record).success) { + console.log(LikeLexicon.validateRecord(record)); + throw new Error("Invalid record"); + } + + try { + const res = await agent.com.atproto.repo.createRecord({ + repo: agent.assertDid, + collection: "app.rocksky.like", + rkey, + record, + validate: false, + }); + const uri = res.data.uri; + console.log(`Like record created at: ${uri}`); + created = await ctx.client.db.loved_tracks.update(created.xata_id, { + uri, + }); + } catch (e) { + console.error(`Error creating like record: ${e.message}`); + } + } + + const message = JSON.stringify(created); + ctx.nc.publish("rocksky.like", Buffer.from(message)); + + return created; +} + +export async function unLikeTrack( + ctx: Context, + trackSha256: string, + user, + agent: Agent +) { + const track = await ctx.client.db.tracks + .filter("sha256", equals(trackSha256)) + .getFirst(); + + if (!track) { + return; + } + + const lovedTrack = await ctx.client.db.loved_tracks + .filter("user_id", equals(user.xata_id)) + .filter("track_id", equals(track.xata_id)) + .getFirst(); + + if (!lovedTrack) { + return; + } + + const rkey = lovedTrack.uri.split("/").pop(); + + await Promise.all([ + agent.com.atproto.repo.deleteRecord({ + repo: agent.assertDid, + collection: "app.rocksky.like", + rkey, + }), + ctx.client.db.loved_tracks.delete(lovedTrack.xata_id), + ]); + + const message = JSON.stringify(lovedTrack); + ctx.nc.publish("rocksky.unlike", Buffer.from(message)); +} + +export async function getLovedTracks( + ctx: Context, + user, + size = 10, + offset = 0 +) { + const lovedTracks = await ctx.client.db.loved_tracks + .select(["track_id.*"]) + .filter("user_id", equals(user.xata_id)) + .sort("xata_createdat", "desc") + .getPaginated({ + pagination: { + size, + offset, + }, + }); + + return lovedTracks.records; +} diff --git a/apps/api/src/metrics.ts b/apps/api/src/metrics.ts new file mode 100644 index 00000000..a55d1bf3 --- /dev/null +++ b/apps/api/src/metrics.ts @@ -0,0 +1,30 @@ +import { OTLPMetricExporter } from "@opentelemetry/exporter-metrics-otlp-http"; +import { + MeterProvider, + PeriodicExportingMetricReader, +} from "@opentelemetry/sdk-metrics"; + +const exporter = new OTLPMetricExporter({ + url: "http://localhost:4318/v1/metrics", +}); + +const reader = new PeriodicExportingMetricReader({ + exporter, + exportIntervalMillis: 10000, +}); + +const meterProvider = new MeterProvider({ + readers: [reader], +}); + +const meter = meterProvider.getMeter("rocksky-hono"); + +const requestCounter = meter.createCounter("http_requests_total", { + description: "Count of incoming requests", +}); + +const requestDuration = meter.createHistogram("http_request_duration_seconds", { + description: "Request duration in seconds", +}); + +export { meter, requestCounter, requestDuration }; diff --git a/apps/api/src/nowplaying/nowplaying.service.ts b/apps/api/src/nowplaying/nowplaying.service.ts new file mode 100644 index 00000000..7bf7451b --- /dev/null +++ b/apps/api/src/nowplaying/nowplaying.service.ts @@ -0,0 +1,644 @@ +import { Agent, BlobRef } from "@atproto/api"; +import { TID } from "@atproto/common"; +import { equals } from "@xata.io/client"; +import chalk from "chalk"; +import { Context } from "context"; +import { createHash } from "crypto"; +import dayjs from "dayjs"; +import * as Album from "lexicon/types/app/rocksky/album"; +import * as Artist from "lexicon/types/app/rocksky/artist"; +import * as Scrobble from "lexicon/types/app/rocksky/scrobble"; +import * as Song from "lexicon/types/app/rocksky/song"; +import downloadImage, { getContentType } from "lib/downloadImage"; +import { Track } from "types/track"; + +export async function putArtistRecord( + track: Track, + agent: Agent +): Promise { + const rkey = TID.nextStr(); + const record: { + $type: string; + name: string; + createdAt: string; + picture?: BlobRef; + } = { + $type: "app.rocksky.artist", + name: track.albumArtist, + createdAt: new Date().toISOString(), + }; + + if (track.artistPicture) { + const imageBuffer = await downloadImage(track.artistPicture); + const encoding = await getContentType(track.artistPicture); + const uploadResponse = await agent.uploadBlob(imageBuffer, { + encoding, + }); + record.picture = uploadResponse.data.blob; + } + + if (!Artist.validateRecord(record).success) { + console.log(Artist.validateRecord(record)); + throw new Error("Invalid record"); + } + + try { + const res = await agent.com.atproto.repo.putRecord({ + repo: agent.assertDid, + collection: "app.rocksky.artist", + rkey, + record, + validate: false, + }); + const uri = res.data.uri; + console.log(`Artist record created at ${uri}`); + return uri; + } catch (e) { + console.error("Error creating artist record", e); + return null; + } +} + +export async function putAlbumRecord( + track: Track, + agent: Agent +): Promise { + const rkey = TID.nextStr(); + let albumArt = undefined; + + if (track.albumArt) { + let options = undefined; + if (track.albumArt.endsWith(".jpeg") || track.albumArt.endsWith(".jpg")) { + options = { encoding: "image/jpeg" }; + } + + if (track.albumArt.endsWith(".png")) { + options = { encoding: "image/png" }; + } + + if (!options?.encoding) { + options = { encoding: await getContentType(track.albumArt) }; + } + + const imageBuffer = await downloadImage(track.albumArt); + const uploadResponse = await agent.uploadBlob(imageBuffer, options); + albumArt = uploadResponse.data.blob; + } + + const record = { + $type: "app.rocksky.album", + title: track.album, + artist: track.albumArtist, + year: track.year, + releaseDate: track.releaseDate + ? track.releaseDate.toISOString() + : undefined, + createdAt: new Date().toISOString(), + albumArt, + }; + + if (!Album.validateRecord(record).success) { + console.log(Album.validateRecord(record)); + throw new Error("Invalid record"); + } + + try { + const res = await agent.com.atproto.repo.putRecord({ + repo: agent.assertDid, + collection: "app.rocksky.album", + rkey, + record, + validate: false, + }); + const uri = res.data.uri; + console.log(`Album record created at ${uri}`); + return uri; + } catch (e) { + console.error("Error creating album record", e); + return null; + } +} + +export async function putSongRecord( + track: Track, + agent: Agent +): Promise { + const rkey = TID.nextStr(); + let albumArt = undefined; + + if (track.albumArt) { + let options = undefined; + if (track.albumArt.endsWith(".jpeg") || track.albumArt.endsWith(".jpg")) { + options = { encoding: "image/jpeg" }; + } + + if (track.albumArt.endsWith(".png")) { + options = { encoding: "image/png" }; + } + + const imageBuffer = await downloadImage(track.albumArt); + const uploadResponse = await agent.uploadBlob(imageBuffer, options); + albumArt = uploadResponse.data.blob; + } + + const record = { + $type: "app.rocksky.song", + title: track.title, + artist: track.artist, + album: track.album, + albumArtist: track.albumArtist, + duration: track.duration, + releaseDate: track.releaseDate + ? track.releaseDate.toISOString() + : undefined, + year: track.year, + albumArt, + composer: !!track.composer ? track.composer : undefined, + lyrics: !!track.lyrics ? track.lyrics : undefined, + trackNumber: track.trackNumber, + discNumber: track.discNumber === 0 ? 1 : track.discNumber, + copyrightMessage: !!track.copyrightMessage + ? track.copyrightMessage + : undefined, + createdAt: new Date().toISOString(), + spotifyLink: !!track.spotifyLink ? track.spotifyLink : undefined, + }; + + if (!Song.validateRecord(record).success) { + console.log(Song.validateRecord(record)); + throw new Error("Invalid record"); + } + + try { + const res = await agent.com.atproto.repo.putRecord({ + repo: agent.assertDid, + collection: "app.rocksky.song", + rkey, + record, + validate: false, + }); + const uri = res.data.uri; + console.log(`Song record created at ${uri}`); + return uri; + } catch (e) { + console.error("Error creating song record", e); + return null; + } +} + +async function putScrobbleRecord( + track: Track, + agent: Agent +): Promise { + const rkey = TID.nextStr(); + let albumArt = undefined; + + if (track.albumArt) { + let options = undefined; + if (track.albumArt.endsWith(".jpeg") || track.albumArt.endsWith(".jpg")) { + options = { encoding: "image/jpeg" }; + } + + if (track.albumArt.endsWith(".png")) { + options = { encoding: "image/png" }; + } + + const imageBuffer = await downloadImage(track.albumArt); + const uploadResponse = await agent.uploadBlob(imageBuffer, options); + albumArt = uploadResponse.data.blob; + } + + const record = { + $type: "app.rocksky.scrobble", + title: track.title, + albumArtist: track.albumArtist, + albumArt, + artist: track.artist, + album: track.album, + duration: track.duration, + trackNumber: track.trackNumber, + discNumber: track.discNumber === 0 ? 1 : track.discNumber, + releaseDate: track.releaseDate + ? track.releaseDate.toISOString() + : undefined, + year: track.year, + composer: !!track.composer ? track.composer : undefined, + lyrics: !!track.lyrics ? track.lyrics : undefined, + copyrightMessage: !!track.copyrightMessage + ? track.copyrightMessage + : undefined, + // if track.timestamp is not null, set it to the timestamp + createdAt: track.timestamp + ? dayjs.unix(track.timestamp).toISOString() + : new Date().toISOString(), + spotifyLink: !!track.spotifyLink ? track.spotifyLink : undefined, + }; + + if (!Scrobble.validateRecord(record).success) { + console.log(Scrobble.validateRecord(record)); + throw new Error("Invalid record"); + } + + try { + const res = await agent.com.atproto.repo.putRecord({ + repo: agent.assertDid, + collection: "app.rocksky.scrobble", + rkey, + record, + validate: false, + }); + const uri = res.data.uri; + console.log(`Scrobble record created at ${uri}`); + return uri; + } catch (e) { + console.error("Error creating scrobble record", e); + return null; + } +} + +export async function publishScrobble(ctx: Context, id: string) { + const scrobble = await ctx.client.db.scrobbles + .select(["*", "track_id.*", "album_id.*", "artist_id.*", "user_id.*"]) + .filter("xata_id", equals(id)) + .getFirst(); + + const [ + _user_album, + _user_artist, + _user_track, + album_track, + artist_track, + artist_album, + ] = await Promise.all([ + ctx.client.db.user_albums + .select(["*"]) + .filter("album_id.xata_id", equals(scrobble.album_id.xata_id)) + .getFirst(), + ctx.client.db.user_artists + .select(["*"]) + .filter("artist_id.xata_id", equals(scrobble.artist_id.xata_id)) + .getFirst(), + ctx.client.db.user_tracks + .select(["*"]) + .filter("track_id.xata_id", equals(scrobble.track_id.xata_id)) + .getFirst(), + ctx.client.db.album_tracks + .select(["*"]) + .filter("track_id.xata_id", equals(scrobble.track_id.xata_id)) + .getFirst(), + ctx.client.db.artist_tracks + .select(["*"]) + .filter("track_id.xata_id", equals(scrobble.track_id.xata_id)) + .getFirst(), + ctx.client.db.artist_albums + .select(["*"]) + .filter("album_id.xata_id", equals(scrobble.album_id.xata_id)) + .filter("artist_id.xata_id", equals(scrobble.artist_id.xata_id)) + .getFirst(), + ]); + + let user_artist = _user_artist; + if (!user_artist) { + await ctx.client.db.user_artists.create({ + user_id: scrobble.user_id.xata_id, + artist_id: scrobble.artist_id.xata_id, + uri: scrobble.artist_id.uri, + scrobbles: 1, + }); + user_artist = await ctx.client.db.user_artists + .select(["*"]) + .filter("artist_id.xata_id", equals(scrobble.artist_id.xata_id)) + .getFirst(); + } + + let user_album = _user_album; + if (!user_album) { + await ctx.client.db.user_albums.create({ + user_id: scrobble.user_id.xata_id, + album_id: scrobble.album_id.xata_id, + uri: scrobble.album_id.uri, + scrobbles: 1, + }); + user_album = await ctx.client.db.user_albums + .select(["*"]) + .filter("album_id.xata_id", equals(scrobble.album_id.xata_id)) + .getFirst(); + } + + let user_track = _user_track; + if (!user_track) { + await ctx.client.db.user_tracks.create({ + user_id: scrobble.user_id.xata_id, + track_id: scrobble.track_id.xata_id, + uri: scrobble.track_id.uri, + scrobbles: 1, + }); + user_track = await ctx.client.db.user_tracks + .select(["*"]) + .filter("track_id.xata_id", equals(scrobble.track_id.xata_id)) + .getFirst(); + } + + const message = JSON.stringify({ + scrobble, + user_album, + user_artist, + user_track, + album_track, + artist_track, + artist_album, + }); + + ctx.nc.publish("rocksky.scrobble", Buffer.from(message)); +} + +export async function scrobbleTrack( + ctx: Context, + track: Track, + agent: Agent, + userDid: string +): Promise { + let existingTrack = await ctx.client.db.tracks + .filter( + "sha256", + equals( + createHash("sha256") + .update( + `${track.title} - ${track.artist} - ${track.album}`.toLowerCase() + ) + .digest("hex") + ) + ) + .getFirst(); + + if (existingTrack && !existingTrack.album_uri) { + const album = await ctx.client.db.albums + .filter( + "sha256", + equals( + createHash("sha256") + .update(`${track.album} - ${track.albumArtist}`.toLowerCase()) + .digest("hex") + ) + ) + .getFirst(); + if (album) { + await ctx.client.db.tracks.update(existingTrack.xata_id, { + album_uri: album.uri, + }); + } + } + + if (existingTrack && !existingTrack.artist_uri) { + const artist = await ctx.client.db.artists + .filter( + "sha256", + equals( + createHash("sha256") + .update(track.albumArtist.toLowerCase()) + .digest("hex") + ) + ) + .getFirst(); + if (artist) { + await ctx.client.db.tracks.update(existingTrack.xata_id, { + artist_uri: artist.uri, + }); + } + } + + const userTrack = await ctx.client.db.user_tracks + .filter({ + "track_id.xata_id": existingTrack?.xata_id, + "user_id.did": userDid, + }) + .getFirst(); + + if (!existingTrack?.uri || !userTrack?.uri?.includes(userDid)) { + await putSongRecord(track, agent); + } + + const existingAlbum = await ctx.client.db.albums + .filter( + "sha256", + equals( + createHash("sha256") + .update(`${track.album} - ${track.albumArtist}`.toLowerCase()) + .digest("hex") + ) + ) + .getFirst(); + + let tries = 0; + while (!existingTrack && tries < 30) { + console.log(`Song not found, trying again: ${chalk.magenta(tries + 1)}`); + existingTrack = await ctx.client.db.tracks + .filter( + "sha256", + equals( + createHash("sha256") + .update( + `${track.title} - ${track.artist} - ${track.album}`.toLowerCase() + ) + .digest("hex") + ) + ) + .getFirst(); + await new Promise((resolve) => setTimeout(resolve, 1000)); + tries += 1; + } + + if (tries === 30 && !existingTrack) { + console.log(`Song not found after ${chalk.magenta("30 tries")}`); + } + + if (existingTrack) { + console.log( + `Song found: ${chalk.cyan(existingTrack.xata_id)} - ${track.title}, after ${chalk.magenta(tries)} tries` + ); + } + + const existingArtist = await ctx.client.db.artists + .filter({ + $any: [ + { + sha256: createHash("sha256") + .update(track.albumArtist.toLocaleLowerCase()) + .digest("hex"), + }, + { + sha256: createHash("sha256") + .update(track.artist.toLocaleLowerCase()) + .digest("hex"), + }, + ], + }) + .getFirst(); + + const userArtist = await ctx.client.db.user_artists + .filter({ + "artist_id.xata_id": existingArtist?.xata_id, + "user_id.did": userDid, + }) + .getFirst(); + + if (!existingArtist?.uri || !userArtist?.uri?.includes(userDid)) { + await putArtistRecord(track, agent); + } + + const userAlbum = await ctx.client.db.user_albums + .filter({ + "album_id.xata_id": existingAlbum?.xata_id, + "user_id.did": userDid, + }) + .getFirst(); + + if (!existingAlbum?.uri || !userAlbum?.uri?.includes(userDid)) { + await putAlbumRecord(track, agent); + } + + tries = 0; + existingTrack = await ctx.client.db.tracks + .filter( + "sha256", + equals( + createHash("sha256") + .update( + `${track.title} - ${track.artist} - ${track.album}`.toLowerCase() + ) + .digest("hex") + ) + ) + .getFirst(); + + while ( + !existingTrack?.artist_uri && + !existingTrack?.album_uri && + tries < 30 + ) { + console.log( + `Artist uri not ready, trying again: ${chalk.magenta(tries + 1)}` + ); + existingTrack = await ctx.client.db.tracks + .filter( + "sha256", + equals( + createHash("sha256") + .update( + `${track.title} - ${track.artist} - ${track.album}`.toLowerCase() + ) + .digest("hex") + ) + ) + .getFirst(); + + // start update artist uri if it is not set + if (existingTrack && !existingTrack.artist_uri) { + const artist = await ctx.client.db.artists + .filter( + "sha256", + equals( + createHash("sha256") + .update(track.albumArtist.toLowerCase()) + .digest("hex") + ) + ) + .getFirst(); + if (artist) { + await ctx.client.db.tracks.update(existingTrack.xata_id, { + artist_uri: artist.uri, + }); + } + } + // end update artist uri + + // start update album uri if it is not set + if (existingTrack && !existingTrack.album_uri) { + const album = await ctx.client.db.albums + .filter( + "sha256", + equals( + createHash("sha256") + .update(`${track.album} - ${track.albumArtist}`.toLowerCase()) + .digest("hex") + ) + ) + .getFirst(); + if (album) { + await ctx.client.db.tracks.update(existingTrack.xata_id, { + album_uri: album.uri, + }); + + if (!album.artist_uri && existingTrack?.artist_uri) { + await ctx.client.db.albums.update(album.xata_id, { + artist_uri: existingTrack.artist_uri, + }); + } + } + } + // end update album uri + + await new Promise((resolve) => setTimeout(resolve, 1000)); + tries += 1; + } + + if (tries === 30 && !existingTrack?.artist_uri) { + console.log(`Artist uri not ready after ${chalk.magenta("30 tries")}`); + } + + if (existingTrack?.artist_uri) { + console.log( + `Artist uri ready: ${chalk.cyan(existingTrack.xata_id)} - ${track.title}, after ${chalk.magenta(tries)} tries` + ); + } + + const scrobbleUri = await putScrobbleRecord(track, agent); + + // loop while scrobble is null, try 30 times, sleep 1 second between tries + tries = 0; + let scrobble = null; + while (!scrobble && tries < 30) { + scrobble = await ctx.client.db.scrobbles + .select(["*", "track_id.*", "album_id.*", "artist_id.*", "user_id.*"]) + .filter("uri", equals(scrobbleUri)) + .getFirst(); + + if ( + scrobble && + scrobble.album_id && + !scrobble.album_id.artist_uri && + scrobble.artist_id.uri + ) { + await ctx.client.db.albums.update(scrobble.album_id.xata_id, { + artist_uri: scrobble.artist_id.uri, + }); + } + + scrobble = await ctx.client.db.scrobbles + .select(["*", "track_id.*", "album_id.*", "artist_id.*", "user_id.*"]) + .filter("uri", equals(scrobbleUri)) + .getFirst(); + + if ( + scrobble && + scrobble.track_id && + scrobble.album_id && + scrobble.artist_id && + scrobble.album_id.artist_uri && + scrobble.track_id.artist_uri && + scrobble.track_id.album_uri + ) { + console.log("Scrobble found after ", chalk.magenta(tries + 1), " tries"); + await publishScrobble(ctx, scrobble.xata_id); + console.log("Scrobble published"); + break; + } + tries += 1; + console.log("Scrobble not found, trying again: ", chalk.magenta(tries)); + await new Promise((resolve) => setTimeout(resolve, 1000)); + } + + if (tries === 30 && !scrobble) { + console.log(`Scrobble not found after ${chalk.magenta("30 tries")}`); + } +} diff --git a/apps/api/src/profiling.ts b/apps/api/src/profiling.ts new file mode 100644 index 00000000..856b3adc --- /dev/null +++ b/apps/api/src/profiling.ts @@ -0,0 +1,13 @@ +import Pyroscope from "@pyroscope/nodejs"; + +Pyroscope.init({ + serverAddress: "http://localhost:4040", + appName: "rocksky-api", + // Enable CPU time collection for wall profiles + // This is required for CPU profiling functionality + // wall: { + // collectCpuTime: true + // } +}); + +Pyroscope.start(); diff --git a/apps/api/src/ratelimiter.ts b/apps/api/src/ratelimiter.ts new file mode 100644 index 00000000..5869a28b --- /dev/null +++ b/apps/api/src/ratelimiter.ts @@ -0,0 +1,39 @@ +import { ctx } from "context"; +import { Context, MiddlewareHandler } from "hono"; + +type RateLimitOptions = { + limit: number; // max requests + window: number; // window in seconds + keyPrefix?: string; +}; + +export const rateLimiter = (options: RateLimitOptions): MiddlewareHandler => { + const { limit, window, keyPrefix = "ratelimit" } = options; + + return async (c: Context, next) => { + const ip = + c.req.header("x-forwarded-for") || + c.req.raw.headers.get("x-real-ip") || + c.req.raw.headers.get("host"); + const key = `${keyPrefix}:${ip}`; + + const current = await ctx.redis.incr(key); + + if (current === 1) { + await ctx.redis.expire(key, window); + } + + const remaining = limit - current; + c.header("X-RateLimit-Limit", limit.toString()); + c.header("X-RateLimit-Remaining", Math.max(remaining, 0).toString()); + + if (current > limit) { + c.status(429); + const reset = await ctx.redis.ttl(key); + c.header("X-RateLimit-Reset", reset.toString()); + return c.text("Too Many Requests"); + } + + await next(); + }; +}; diff --git a/apps/api/src/schema/album-tracks.ts b/apps/api/src/schema/album-tracks.ts new file mode 100644 index 00000000..06c5c625 --- /dev/null +++ b/apps/api/src/schema/album-tracks.ts @@ -0,0 +1,22 @@ +import { InferInsertModel, InferSelectModel } from "drizzle-orm"; +import { integer, pgTable, text, timestamp } from "drizzle-orm/pg-core"; +import albums from "./albums"; +import tracks from "./tracks"; + +const albumTracks = pgTable("album_tracks", { + id: text("xata_id").primaryKey(), + albumId: text("album_id") + .notNull() + .references(() => albums.id), + trackId: text("track_id") + .notNull() + .references(() => tracks.id), + createdAt: timestamp("xata_createdat").defaultNow().notNull(), + updatedAt: timestamp("xata_updatedat").defaultNow().notNull(), + xataVersion: integer("xata_version").notNull(), +}); + +export type SelectAlbumTrack = InferSelectModel; +export type InsertAlbumTrack = InferInsertModel; + +export default albumTracks; diff --git a/apps/api/src/schema/albums.ts b/apps/api/src/schema/albums.ts new file mode 100644 index 00000000..874b92f5 --- /dev/null +++ b/apps/api/src/schema/albums.ts @@ -0,0 +1,26 @@ +import { InferInsertModel, InferSelectModel } from "drizzle-orm"; +import { integer, pgTable, text, timestamp } from "drizzle-orm/pg-core"; + +const albums = pgTable("albums", { + id: text("xata_id").primaryKey(), + title: text("title").notNull(), + artist: text("artist").notNull(), + releaseDate: text("release_date"), + year: integer("year"), + albumArt: text("album_art"), + uri: text("uri").unique(), + artistUri: text("artist_uri"), + appleMusicLink: text("apple_music_link").unique(), + spotifyLink: text("spotify_link").unique(), + tidalLink: text("tidal_link").unique(), + youtubeLink: text("youtube_link").unique(), + sha256: text("sha256").unique().notNull(), + createdAt: timestamp("xata_createdat").defaultNow().notNull(), + updatedAt: timestamp("xata_updatedat").defaultNow().notNull(), + xataVersion: integer("xata_version"), +}); + +export type SelectAlbum = InferSelectModel; +export type InsertAlbum = InferInsertModel; + +export default albums; diff --git a/apps/api/src/schema/api-keys.ts b/apps/api/src/schema/api-keys.ts new file mode 100644 index 00000000..e28cfe1a --- /dev/null +++ b/apps/api/src/schema/api-keys.ts @@ -0,0 +1,22 @@ +import { InferInsertModel, InferSelectModel } from "drizzle-orm"; +import { boolean, pgTable, text, timestamp } from "drizzle-orm/pg-core"; +import users from "./users"; + +const apiKeys = pgTable("api_keys", { + id: text("xata_id").primaryKey(), + name: text("name").notNull(), + apiKey: text("api_key").notNull(), + sharedSecret: text("shared_secret").notNull(), + description: text("description"), + enabled: boolean("enabled").default(true).notNull(), + userId: text("user_id") + .notNull() + .references(() => users.id), + createdAt: timestamp("xata_createdat").defaultNow().notNull(), + updatedAt: timestamp("xata_updatedat").defaultNow().notNull(), +}); + +export type SelectApiKey = InferSelectModel; +export type InsertApiKey = InferInsertModel; + +export default apiKeys; diff --git a/apps/api/src/schema/artist-albums.ts b/apps/api/src/schema/artist-albums.ts new file mode 100644 index 00000000..35bf0dbe --- /dev/null +++ b/apps/api/src/schema/artist-albums.ts @@ -0,0 +1,22 @@ +import { InferInsertModel, InferSelectModel } from "drizzle-orm"; +import { integer, pgTable, text, timestamp } from "drizzle-orm/pg-core"; +import albums from "./albums"; +import artists from "./artists"; + +const artistAlbums = pgTable("artist_albums", { + id: text("xata_id").primaryKey(), + artistId: text("artist_id") + .notNull() + .references(() => artists.id), + albumId: text("album_id") + .notNull() + .references(() => albums.id), + createdAt: timestamp("xata_createdat").defaultNow().notNull(), + updatedAt: timestamp("xata_updatedat").defaultNow().notNull(), + xataVersion: integer("xata_version").notNull(), +}); + +export type SelectArtistAlbum = InferSelectModel; +export type InsertArtistAlbum = InferInsertModel; + +export default artistAlbums; diff --git a/apps/api/src/schema/artist-tracks.ts b/apps/api/src/schema/artist-tracks.ts new file mode 100644 index 00000000..853cbc20 --- /dev/null +++ b/apps/api/src/schema/artist-tracks.ts @@ -0,0 +1,22 @@ +import { InferInsertModel, InferSelectModel } from "drizzle-orm"; +import { integer, pgTable, text, timestamp } from "drizzle-orm/pg-core"; +import artists from "./artists"; +import tracks from "./tracks"; + +const artistTracks = pgTable("artist_tracks", { + id: text("xata_id").primaryKey(), + artistId: text("artist_id") + .notNull() + .references(() => artists.id), + trackId: text("track_id") + .notNull() + .references(() => tracks.id), + createdAt: timestamp("xata_createdat").defaultNow().notNull(), + updatedAt: timestamp("xata_updatedat").defaultNow().notNull(), + xataVersion: integer("xata_version").notNull(), +}); + +export type SelectArtistTrack = InferSelectModel; +export type InsertArtistTrack = InferInsertModel; + +export default artistTracks; diff --git a/apps/api/src/schema/artists.ts b/apps/api/src/schema/artists.ts new file mode 100644 index 00000000..8d6c9a3a --- /dev/null +++ b/apps/api/src/schema/artists.ts @@ -0,0 +1,26 @@ +import { InferInsertModel, InferSelectModel } from "drizzle-orm"; +import { integer, pgTable, text, timestamp } from "drizzle-orm/pg-core"; + +const artists = pgTable("artists", { + id: text("xata_id").primaryKey(), + name: text("name").notNull(), + biography: text("biography"), + born: timestamp("born"), + bornIn: text("born_in"), + died: timestamp("died"), + picture: text("picture"), + sha256: text("sha256").unique().notNull(), + uri: text("uri").unique(), + appleMusicLink: text("apple_music_link"), + spotifyLink: text("spotify_link"), + tidalLink: text("tidal_link"), + youtubeLink: text("youtube_link"), + createdAt: timestamp("xata_createdat").defaultNow().notNull(), + updatedAt: timestamp("xata_updatedat").defaultNow().notNull(), + xataVersion: integer("xata_version"), +}); + +export type SelectArtist = InferSelectModel; +export type InsertArtist = InferInsertModel; + +export default artists; diff --git a/apps/api/src/schema/dropbox-tokens.ts b/apps/api/src/schema/dropbox-tokens.ts new file mode 100644 index 00000000..bcdffd35 --- /dev/null +++ b/apps/api/src/schema/dropbox-tokens.ts @@ -0,0 +1,14 @@ +import { InferInsertModel, InferSelectModel } from "drizzle-orm"; +import { pgTable, text, timestamp } from "drizzle-orm/pg-core"; + +const dropboxTokens = pgTable("dropbox_tokens", { + id: text("xata_id").primaryKey(), + refreshToken: text("refresh_token").notNull(), + createdAt: timestamp("xata_createdat").defaultNow().notNull(), + updatedAt: timestamp("xata_updatedat").defaultNow().notNull(), +}); + +export type SelectDropboxToken = InferSelectModel; +export type InsertDropboxToken = InferInsertModel; + +export default dropboxTokens; diff --git a/apps/api/src/schema/google-drive-tokens.ts b/apps/api/src/schema/google-drive-tokens.ts new file mode 100644 index 00000000..6789ffdd --- /dev/null +++ b/apps/api/src/schema/google-drive-tokens.ts @@ -0,0 +1,14 @@ +import { InferInsertModel, InferSelectModel } from "drizzle-orm"; +import { pgTable, text, timestamp } from "drizzle-orm/pg-core"; + +const googleDriveTokens = pgTable("google_drive_tokens", { + id: text("xata_id").primaryKey(), + refreshToken: text("refresh_token").notNull(), + createdAt: timestamp("xata_createdat").defaultNow().notNull(), + updatedAt: timestamp("xata_updatedat").defaultNow().notNull(), +}); + +export type SelectGoogleDriveToken = InferSelectModel; +export type InsertGoogleDriveToken = InferInsertModel; + +export default googleDriveTokens; diff --git a/apps/api/src/schema/index.ts b/apps/api/src/schema/index.ts new file mode 100644 index 00000000..94e3c0aa --- /dev/null +++ b/apps/api/src/schema/index.ts @@ -0,0 +1,49 @@ +import albumTracks from "./album-tracks"; +import albums from "./albums"; +import apiKeys from "./api-keys"; +import artistAlbums from "./artist-albums"; +import artistTracks from "./artist-tracks"; +import artists from "./artists"; +import lovedTracks from "./loved-tracks"; +import playlistTracks from "./playlist-tracks"; +import playlists from "./playlists"; +import profileShouts from "./profile-shouts"; +import scrobbles from "./scrobbles"; +import shoutLikes from "./shout-likes"; +import shoutReports from "./shout-reports"; +import shouts from "./shouts"; +import spotifyAccounts from "./spotify-accounts"; +import spotifyTokens from "./spotify-tokens"; +import tracks from "./tracks"; +import userAlbums from "./user-albums"; +import userArtists from "./user-artists"; +import userPlaylists from "./user-playlists"; +import userTracks from "./user-tracks"; +import users from "./users"; +import webscrobblers from "./webscrobblers"; + +export default { + profileShouts, + shoutLikes, + shouts, + users, + albums, + artists, + tracks, + scrobbles, + shoutReports, + playlists, + playlistTracks, + apiKeys, + webscrobblers, + userAlbums, + userArtists, + userTracks, + albumTracks, + userPlaylists, + lovedTracks, + spotifyAccounts, + spotifyTokens, + artistTracks, + artistAlbums, +}; diff --git a/apps/api/src/schema/loved-tracks.ts b/apps/api/src/schema/loved-tracks.ts new file mode 100644 index 00000000..7640ebbe --- /dev/null +++ b/apps/api/src/schema/loved-tracks.ts @@ -0,0 +1,21 @@ +import { InferInsertModel, InferSelectModel } from "drizzle-orm"; +import { pgTable, text, timestamp } from "drizzle-orm/pg-core"; +import tracks from "./tracks"; +import users from "./users"; + +const lovedTracks = pgTable("loved_tracks", { + id: text("xata_id").primaryKey(), + userId: text("user_id") + .notNull() + .references(() => users.id), + trackId: text("track_id") + .notNull() + .references(() => tracks.id), + uri: text("uri").unique(), + createdAt: timestamp("xata_createdat").defaultNow().notNull(), +}); + +export type SelectLovedTrack = InferSelectModel; +export type InsertLovedTrack = InferInsertModel; + +export default lovedTracks; diff --git a/apps/api/src/schema/playlist-tracks.ts b/apps/api/src/schema/playlist-tracks.ts new file mode 100644 index 00000000..72487e68 --- /dev/null +++ b/apps/api/src/schema/playlist-tracks.ts @@ -0,0 +1,20 @@ +import { InferInsertModel, InferSelectModel } from "drizzle-orm"; +import { pgTable, text, timestamp } from "drizzle-orm/pg-core"; +import playlists from "./playlists"; +import tracks from "./tracks"; + +const playlistTracks = pgTable("playlist_tracks", { + id: text("xata_id").primaryKey(), + playlistId: text("playlist_id") + .notNull() + .references(() => playlists.id), + trackId: text("track_id") + .notNull() + .references(() => tracks.id), + createdAt: timestamp("xata_createdat").defaultNow().notNull(), +}); + +export type SelectPlaylistTrack = InferSelectModel; +export type InsertPlaylistTrack = InferInsertModel; + +export default playlistTracks; diff --git a/apps/api/src/schema/playlists.ts b/apps/api/src/schema/playlists.ts new file mode 100644 index 00000000..a4668cae --- /dev/null +++ b/apps/api/src/schema/playlists.ts @@ -0,0 +1,24 @@ +import { InferInsertModel, InferSelectModel } from "drizzle-orm"; +import { pgTable, text, timestamp } from "drizzle-orm/pg-core"; +import users from "./users"; + +const playlists = pgTable("playlists", { + id: text("xata_id").primaryKey(), + name: text("name").notNull(), + picture: text("picture"), + description: text("description"), + uri: text("uri").unique(), + spotifyLink: text("spotify_link"), + tidalLink: text("tidal_link"), + appleMusicLink: text("apple_music_link"), + createdBy: text("created_by") + .notNull() + .references(() => users.id), + createdAt: timestamp("xata_createdat").defaultNow().notNull(), + updatedAt: timestamp("xata_updatedat").defaultNow().notNull(), +}); + +export type SelectPlaylist = InferSelectModel; +export type InsertPlaylist = InferInsertModel; + +export default playlists; diff --git a/apps/api/src/schema/profile-shouts.ts b/apps/api/src/schema/profile-shouts.ts new file mode 100644 index 00000000..047f99f5 --- /dev/null +++ b/apps/api/src/schema/profile-shouts.ts @@ -0,0 +1,20 @@ +import { InferInsertModel, InferSelectModel } from "drizzle-orm"; +import { pgTable, text, timestamp } from "drizzle-orm/pg-core"; +import shouts from "./shouts"; +import users from "./users"; + +const profileShouts = pgTable("profile_shouts", { + id: text("xata_id").primaryKey(), + userId: text("user_id") + .notNull() + .references(() => users.id), + shoutId: text("shout_id") + .notNull() + .references(() => shouts.id), + createdAt: timestamp("xata_createdat").defaultNow().notNull(), +}); + +export type SelectProfileShout = InferSelectModel; +export type InsertProfileShout = InferInsertModel; + +export default profileShouts; diff --git a/apps/api/src/schema/scrobbles.ts b/apps/api/src/schema/scrobbles.ts new file mode 100644 index 00000000..fc8b8de3 --- /dev/null +++ b/apps/api/src/schema/scrobbles.ts @@ -0,0 +1,25 @@ +import { integer, pgTable, text, timestamp } from "drizzle-orm/pg-core"; + +import { InferInsertModel, InferSelectModel } from "drizzle-orm"; +import albums from "./albums"; +import artists from "./artists"; +import tracks from "./tracks"; +import users from "./users"; + +const scrobbles = pgTable("scrobbles", { + id: text("xata_id").primaryKey(), + userId: text("user_id").references(() => users.id), + trackId: text("track_id").references(() => tracks.id), + albumId: text("album_id").references(() => albums.id), + artistId: text("artist_id").references(() => artists.id), + uri: text("uri").unique(), + createdAt: timestamp("xata_createdat").defaultNow().notNull(), + updatedAt: timestamp("xata_updatedat").defaultNow().notNull(), + xataVersion: integer("xata_version"), + timestamp: timestamp("timestamp").defaultNow().notNull(), +}); + +export type SelectScrobble = InferSelectModel; +export type InsertScrobble = InferInsertModel; + +export default scrobbles; diff --git a/apps/api/src/schema/shout-likes.ts b/apps/api/src/schema/shout-likes.ts new file mode 100644 index 00000000..424c0c5e --- /dev/null +++ b/apps/api/src/schema/shout-likes.ts @@ -0,0 +1,21 @@ +import { InferInsertModel, InferSelectModel } from "drizzle-orm"; +import { pgTable, text, timestamp } from "drizzle-orm/pg-core"; +import shouts from "./shouts"; +import users from "./users"; + +const shoutLikes = pgTable("shout_likes", { + id: text("xata_id").primaryKey(), + userId: text("user_id") + .notNull() + .references(() => users.id), + shoutId: text("shout_id") + .notNull() + .references(() => shouts.id), + createdAt: timestamp("xata_createdat").defaultNow().notNull(), + uri: text("uri").unique().notNull(), +}); + +export type SelectShoutLike = InferSelectModel; +export type InsertShoutLike = InferInsertModel; + +export default shoutLikes; diff --git a/apps/api/src/schema/shout-reports.ts b/apps/api/src/schema/shout-reports.ts new file mode 100644 index 00000000..4f208bc8 --- /dev/null +++ b/apps/api/src/schema/shout-reports.ts @@ -0,0 +1,20 @@ +import { InferInsertModel, InferSelectModel } from "drizzle-orm"; +import { pgTable, text, timestamp } from "drizzle-orm/pg-core"; +import shouts from "./shouts"; +import users from "./users"; + +const shoutReports = pgTable("shout_reports", { + id: text("xata_id").primaryKey(), + userId: text("user_id") + .notNull() + .references(() => users.id), + shoutId: text("shout_id") + .notNull() + .references(() => shouts.id), + createdAt: timestamp("xata_createdat").defaultNow().notNull(), +}); + +export type SelectShoutReport = InferSelectModel; +export type InsertShoutReport = InferInsertModel; + +export default shoutReports; diff --git a/apps/api/src/schema/shouts.ts b/apps/api/src/schema/shouts.ts new file mode 100644 index 00000000..37f3c272 --- /dev/null +++ b/apps/api/src/schema/shouts.ts @@ -0,0 +1,27 @@ +import { InferInsertModel, InferSelectModel } from "drizzle-orm"; +import { pgTable, text, timestamp } from "drizzle-orm/pg-core"; +import albums from "./albums"; +import scrobbles from "./scrobbles"; +import tracks from "./tracks"; +import users from "./users"; + +const shouts = pgTable("shouts", { + id: text("xata_id").primaryKey(), + content: text("content").notNull(), + trackId: text("track_id").references(() => tracks.id), + artistId: text("artist_id").references(() => users.id), + albumId: text("album_id").references(() => albums.id), + scrobbleId: text("scrobble_id").references(() => scrobbles.id), + uri: text("uri").unique().notNull(), + authorId: text("author_id") + .references(() => users.id) + .notNull(), + parentId: text("parent_id").references(() => shouts.id), + createdAt: timestamp("xata_createdat").defaultNow().notNull(), + updatedAt: timestamp("xata_updatedat").defaultNow().notNull(), +}); + +export type SelectShout = InferSelectModel; +export type InsertShout = InferInsertModel; + +export default shouts; diff --git a/apps/api/src/schema/spotify-accounts.ts b/apps/api/src/schema/spotify-accounts.ts new file mode 100644 index 00000000..96853486 --- /dev/null +++ b/apps/api/src/schema/spotify-accounts.ts @@ -0,0 +1,26 @@ +import { InferInsertModel, InferSelectModel } from "drizzle-orm"; +import { + boolean, + integer, + pgTable, + text, + timestamp, +} from "drizzle-orm/pg-core"; +import users from "./users"; + +const spotifyAccounts = pgTable("spotify_accounts", { + id: text("xata_id").primaryKey(), + xataVersion: integer("xata_version").notNull(), + email: text("email").notNull(), + userId: text("user_id") + .notNull() + .references(() => users.id), + isBetaUser: boolean("is_beta_user").default(false).notNull(), + createdAt: timestamp("xata_createdat").defaultNow().notNull(), + updatedAt: timestamp("xata_updatedat").defaultNow().notNull(), +}); + +export type SelectSpotifyAccount = InferSelectModel; +export type InsertSpotifyAccount = InferInsertModel; + +export default spotifyAccounts; diff --git a/apps/api/src/schema/spotify-tokens.ts b/apps/api/src/schema/spotify-tokens.ts new file mode 100644 index 00000000..89c30a87 --- /dev/null +++ b/apps/api/src/schema/spotify-tokens.ts @@ -0,0 +1,20 @@ +import { InferInsertModel, InferSelectModel } from "drizzle-orm"; +import { integer, pgTable, text, timestamp } from "drizzle-orm/pg-core"; +import users from "./users"; + +const spotifyTokens = pgTable("spotify_tokens", { + id: text("xata_id").primaryKey(), + xataVersion: integer("xata_version").notNull(), + accessToken: text("access_token").notNull(), + refreshToken: text("refresh_token").notNull(), + userId: text("user_id") + .notNull() + .references(() => users.id), + createdAt: timestamp("xata_createdat").defaultNow().notNull(), + updatedAt: timestamp("xata_updatedat").defaultNow().notNull(), +}); + +export type SelectSpotifyToken = InferSelectModel; +export type InsertSpotifyToken = InferInsertModel; + +export default spotifyTokens; diff --git a/apps/api/src/schema/tracks.ts b/apps/api/src/schema/tracks.ts new file mode 100644 index 00000000..213952c0 --- /dev/null +++ b/apps/api/src/schema/tracks.ts @@ -0,0 +1,36 @@ +import { InferInsertModel, InferSelectModel } from "drizzle-orm"; +import { integer, pgTable, text, timestamp } from "drizzle-orm/pg-core"; + +const tracks = pgTable("tracks", { + id: text("xata_id").primaryKey(), + title: text("title").notNull(), + artist: text("artist").notNull(), + albumArtist: text("album_artist").notNull(), + albumArt: text("album_art"), + album: text("album").notNull(), + trackNumber: integer("track_number"), + duration: integer("duration").notNull(), + mbId: text("mb_id").unique(), + youtubeLink: text("youtube_link").unique(), + spotifyLink: text("spotify_link").unique(), + appleMusicLink: text("apple_music_link").unique(), + tidalLink: text("tidal_link").unique(), + sha256: text("sha256").unique().notNull(), + discNumber: integer("disc_number"), + lyrics: text("lyrics"), + composer: text("composer"), + genre: text("genre"), + label: text("label"), + copyrightMessage: text("copyright_message"), + uri: text("uri").unique(), + albumUri: text("album_uri").unique(), + artistUri: text("artist_uri").unique(), + createdAt: timestamp("xata_createdat").defaultNow().notNull(), + updatedAt: timestamp("xata_updatedat").defaultNow().notNull(), + xataVersion: integer("xata_version"), +}); + +export type SelectTrack = InferSelectModel; +export type InsertTrack = InferInsertModel; + +export default tracks; diff --git a/apps/api/src/schema/user-albums.ts b/apps/api/src/schema/user-albums.ts new file mode 100644 index 00000000..730c20e3 --- /dev/null +++ b/apps/api/src/schema/user-albums.ts @@ -0,0 +1,24 @@ +import { InferInsertModel, InferSelectModel } from "drizzle-orm"; +import { integer, pgTable, text, timestamp } from "drizzle-orm/pg-core"; +import albums from "./albums"; +import users from "./users"; + +const userAlbums = pgTable("user_albums", { + id: text("xata_id").primaryKey(), + userId: text("user_id") + .notNull() + .references(() => users.id), + albumId: text("album_id") + .notNull() + .references(() => albums.id), + createdAt: timestamp("xata_createdat").defaultNow().notNull(), + updatedAt: timestamp("xata_updatedat").defaultNow().notNull(), + xataVersion: integer("xata_version").notNull(), + scrobbles: integer("scrobbles"), + uri: text("uri").unique().notNull(), +}); + +export type SelectUserAlbum = InferSelectModel; +export type InsertUserAlbum = InferInsertModel; + +export default userAlbums; diff --git a/apps/api/src/schema/user-artists.ts b/apps/api/src/schema/user-artists.ts new file mode 100644 index 00000000..7ff69e1e --- /dev/null +++ b/apps/api/src/schema/user-artists.ts @@ -0,0 +1,24 @@ +import { InferInsertModel, InferSelectModel } from "drizzle-orm"; +import { integer, pgTable, text, timestamp } from "drizzle-orm/pg-core"; +import artists from "./artists"; +import users from "./users"; + +const userArtists = pgTable("user_artists", { + id: text("xata_id").primaryKey(), + userId: text("user_id") + .notNull() + .references(() => users.id), + artistId: text("artist_id") + .notNull() + .references(() => artists.id), + createdAt: timestamp("xata_createdat").defaultNow().notNull(), + updatedAt: timestamp("xata_updatedat").defaultNow().notNull(), + xataVersion: integer("xata_version").notNull(), + scrobbles: integer("scrobbles"), + uri: text("uri").unique().notNull(), +}); + +export type SelectUserArtist = InferSelectModel; +export type InsertUserArtist = InferInsertModel; + +export default userArtists; diff --git a/apps/api/src/schema/user-playlists.ts b/apps/api/src/schema/user-playlists.ts new file mode 100644 index 00000000..bc2ab261 --- /dev/null +++ b/apps/api/src/schema/user-playlists.ts @@ -0,0 +1,21 @@ +import { InferInsertModel, InferSelectModel } from "drizzle-orm"; +import { pgTable, text, timestamp } from "drizzle-orm/pg-core"; +import tracks from "./tracks"; +import users from "./users"; + +const userPlaylists = pgTable("user_playlists", { + id: text("xata_id").primaryKey(), + userId: text("user_id") + .notNull() + .references(() => users.id), + playlistId: text("playlist_id") + .notNull() + .references(() => tracks.id), + createdAt: timestamp("xata_createdat").defaultNow().notNull(), + uri: text("uri").unique().notNull(), +}); + +export type SelectUserPlaylist = InferSelectModel; +export type InsertUserPlaylist = InferInsertModel; + +export default userPlaylists; diff --git a/apps/api/src/schema/user-tracks.ts b/apps/api/src/schema/user-tracks.ts new file mode 100644 index 00000000..42bfc279 --- /dev/null +++ b/apps/api/src/schema/user-tracks.ts @@ -0,0 +1,24 @@ +import { InferInsertModel, InferSelectModel } from "drizzle-orm"; +import { integer, pgTable, text, timestamp } from "drizzle-orm/pg-core"; +import tracks from "./tracks"; +import users from "./users"; + +const userTracks = pgTable("user_tracks", { + id: text("xata_id").primaryKey(), + userId: text("user_id") + .notNull() + .references(() => users.id), + trackId: text("track_id") + .notNull() + .references(() => tracks.id), + createdAt: timestamp("xata_createdat").defaultNow().notNull(), + updatedAt: timestamp("xata_updatedat").defaultNow().notNull(), + xataVersion: integer("xata_version").notNull(), + uri: text("uri").unique().notNull(), + scrobbles: integer("scrobbles"), +}); + +export type SelectUserTrack = InferSelectModel; +export type InsertUserTrack = InferInsertModel; + +export default userTracks; diff --git a/apps/api/src/schema/users.ts b/apps/api/src/schema/users.ts new file mode 100644 index 00000000..5aadfead --- /dev/null +++ b/apps/api/src/schema/users.ts @@ -0,0 +1,18 @@ +import { InferSelectModel } from "drizzle-orm"; +import { integer, pgTable, text, timestamp } from "drizzle-orm/pg-core"; + +const users = pgTable("users", { + id: text("xata_id").primaryKey(), + did: text("did").unique().notNull(), + displayName: text("display_name").notNull(), + handle: text("handle").unique().notNull(), + avatar: text("avatar").notNull(), + createdAt: timestamp("xata_createdat").defaultNow().notNull(), + updatedAt: timestamp("xata_updatedat").defaultNow().notNull(), + xataVersion: integer("xata_version"), +}); + +export type SelectUser = InferSelectModel; +export type InsertUser = InferSelectModel; + +export default users; diff --git a/apps/api/src/schema/webscrobblers.ts b/apps/api/src/schema/webscrobblers.ts new file mode 100644 index 00000000..54e37f17 --- /dev/null +++ b/apps/api/src/schema/webscrobblers.ts @@ -0,0 +1,21 @@ +import { InferSelectModel } from "drizzle-orm"; +import { boolean, pgTable, text, timestamp } from "drizzle-orm/pg-core"; +import users from "./users"; + +const webscrobblers = pgTable("webscrobblers", { + id: text("xata_id").primaryKey(), + name: text("name").notNull(), + uuid: text("uuid").notNull(), + description: text("description"), + enabled: boolean("enabled").default(true).notNull(), + userId: text("user_id") + .notNull() + .references(() => users.id), + createdAt: timestamp("xata_createdat").defaultNow().notNull(), + updatedAt: timestamp("xata_updatedat").defaultNow().notNull(), +}); + +export type SelectWebscrobblers = InferSelectModel; +export type InsertWebscrobblers = InferSelectModel; + +export default webscrobblers; diff --git a/apps/api/src/scripts/avatar.ts b/apps/api/src/scripts/avatar.ts new file mode 100644 index 00000000..f0a47e55 --- /dev/null +++ b/apps/api/src/scripts/avatar.ts @@ -0,0 +1,56 @@ +import { equals } from "@xata.io/client"; +import { ctx } from "context"; +import { eq } from "drizzle-orm"; +import _ from "lodash"; +import users from "schema/users"; + +const args = process.argv.slice(2); + +for (const did of args) { + const user = await ctx.client.db.users + .filter({ + $any: [{ did }, { handle: did }], + }) + .getFirst(); + if (!user) { + console.log(`User ${did} not found`); + continue; + } + + const plc = await fetch(`https://plc.directory/${user.did}`).then((res) => + res.json() + ); + + const serviceEndpoint = _.get(plc, "service.0.serviceEndpoint"); + if (!serviceEndpoint) { + console.log(`Service endpoint not found for ${did}`); + continue; + } + + const profile = await fetch( + `${serviceEndpoint}/xrpc/com.atproto.repo.getRecord?repo=${user.did}&collection=app.bsky.actor.profile&rkey=self` + ).then((res) => res.json()); + const ref = _.get(profile, "value.avatar.ref.$link"); + const type = _.get(profile, "value.avatar.mimeType").split("/")[1]; + await ctx.db + .update(users) + .set({ + displayName: _.get(profile, "value.displayName"), + avatar: `https://cdn.bsky.app/img/avatar/plain/${user.did}/${ref}@${type}`, + }) + .where(eq(users.did, user.did)) + .execute(); + + const u = await ctx.client.db.users + .select(["*"]) + .filter("did", equals(user.did)) + .getFirst(); + + console.log(u); + + ctx.nc.publish("rocksky.user", Buffer.from(JSON.stringify(u))); +} + +console.log("Done"); + +process.exit(0); diff --git a/apps/api/src/scripts/meili.ts b/apps/api/src/scripts/meili.ts new file mode 100644 index 00000000..599221ef --- /dev/null +++ b/apps/api/src/scripts/meili.ts @@ -0,0 +1,116 @@ +import chalk from "chalk"; +import { ctx } from "context"; +import { count } from "drizzle-orm"; +import tables from "schema"; + +async function main() { + console.log(chalk.cyan("Starting Meilisearch sync...")); + + try { + await Promise.all([ + createAlbums(), + createArtists(), + createTracks(), + createUsers(), + ]); + console.log(chalk.green("Meilisearch sync completed successfully.")); + } catch (error) { + console.error(chalk.red("Error during Meilisearch sync:"), error); + } +} + +await main(); + +async function createAlbums() { + const { meilisearch } = ctx; + let skip = 0; + let size = 100; + const total = await ctx.db + .select({ value: count() }) + .from(tables.albums) + .execute() + .then(([row]) => row.value); + const results = await ctx.db + .select() + .from(tables.albums) + .limit(size) + .offset(skip) + .execute(); + + await meilisearch.post(`indexes/albums/documents?primaryKey=id`, results); +} + +async function createArtists() { + const { meilisearch } = ctx; + let size = 100; + const total = await ctx.db + .select({ value: count() }) + .from(tables.artists) + .execute() + .then(([row]) => row.value); + for (let i = 0; i < total; i += size) { + const skip = i; + console.log( + `Processing ${chalk.magentaBright("artists")}: ${chalk.magentaBright(skip)} to ${chalk.magentaBright(skip + size)}` + ); + const results = await ctx.db + .select() + .from(tables.artists) + .limit(size) + .offset(skip) + .execute(); + + await meilisearch.post(`indexes/artists/documents?primaryKey=id`, results); + } +} + +async function createTracks() { + const { meilisearch } = ctx; + let size = 100; + const total = await ctx.db + .select({ value: count() }) + .from(tables.tracks) + .execute() + .then(([row]) => row.value); + for (let i = 0; i < total; i += size) { + const skip = i; + console.log( + `Processing ${chalk.magentaBright("tracks")}: ${chalk.magentaBright(skip)} to ${chalk.magentaBright(skip + size)}` + ); + const results = await ctx.db + .select() + .from(tables.tracks) + .limit(size) + .offset(skip) + .execute(); + + await meilisearch.post(`/indexes/tracks/documents?primaryKey=id`, results); + } +} + +async function createUsers() { + const { meilisearch } = ctx; + let size = 100; + const total = await ctx.db + .select({ value: count() }) + .from(tables.users) + .execute() + .then(([row]) => row.value); + + for (let i = 0; i < total; i += size) { + const skip = i; + console.log( + `Processing ${chalk.magentaBright("users")}: ${chalk.magentaBright(skip)} to ${chalk.magentaBright(skip + size)}` + ); + const results = await ctx.db + .select() + .from(tables.users) + .limit(size) + .offset(skip) + .execute(); + + await meilisearch.post(`/indexes/users/documents?primaryKey=id`, results); + } +} + +process.exit(0); diff --git a/apps/api/src/scripts/sync.ts b/apps/api/src/scripts/sync.ts new file mode 100644 index 00000000..e49ae259 --- /dev/null +++ b/apps/api/src/scripts/sync.ts @@ -0,0 +1,126 @@ +import { equals } from "@xata.io/client"; +import chalk from "chalk"; +import { ctx } from "context"; +import { createHash } from "crypto"; +import { publishScrobble } from "nowplaying/nowplaying.service"; + +const args = process.argv.slice(2); + +async function updateUris(did: string) { + const { records } = await ctx.client.db.scrobbles + .select(["track_id.*", "user_id.*"]) + .filter({ + $any: [{ "user_id.did": did }, { "user_id.handle": did }], + }) + .getPaginated({ + pagination: { + size: process.env.SYNC_SIZE ? parseInt(process.env.SYNC_SIZE) : 20, + }, + sort: [{ xata_createdat: "desc" }], + }); + for (const { track_id: track } of records) { + const existingTrack = await ctx.client.db.tracks + .filter( + "sha256", + equals( + createHash("sha256") + .update( + `${track.title} - ${track.artist} - ${track.album}`.toLowerCase() + ) + .digest("hex") + ) + ) + .getFirst(); + + if (existingTrack && !existingTrack.album_uri) { + console.log(`Updating album uri for ${chalk.cyan(track.xata_id)} ...`); + const album = await ctx.client.db.albums + .filter( + "sha256", + equals( + createHash("sha256") + .update(`${track.album} - ${track.album_artist}`.toLowerCase()) + .digest("hex") + ) + ) + .getFirst(); + if (album) { + await ctx.client.db.tracks.update(existingTrack.xata_id, { + album_uri: album.uri, + }); + } + } + + if (existingTrack && !existingTrack.artist_uri) { + console.log(`Updating artist uri for ${chalk.cyan(track.xata_id)} ...`); + const artist = await ctx.client.db.artists + .filter( + "sha256", + equals( + createHash("sha256") + .update(track.album_artist.toLowerCase()) + .digest("hex") + ) + ) + .getFirst(); + if (artist) { + await ctx.client.db.tracks.update(existingTrack.xata_id, { + artist_uri: artist.uri, + }); + } + } + + const album = await ctx.client.db.albums + .filter( + "sha256", + equals( + createHash("sha256") + .update(`${track.album} - ${track.album_artist}`.toLowerCase()) + .digest("hex") + ) + ) + .getFirst(); + + if (existingTrack && !album.artist_uri) { + console.log(`Updating artist uri for ${chalk.cyan(album.xata_id)} ...`); + const artist = await ctx.client.db.artists + .filter( + "sha256", + equals( + createHash("sha256") + .update(track.album_artist.toLowerCase()) + .digest("hex") + ) + ) + .getFirst(); + if (artist) { + await ctx.client.db.albums.update(album.xata_id, { + artist_uri: artist.uri, + }); + } + } + } +} + +for (const arg of args) { + console.log(`Syncing scrobbles ${chalk.magenta(arg)} ...`); + await updateUris(arg); + + const { records } = await ctx.client.db.scrobbles + .filter({ + $any: [{ "user_id.did": arg }, { "user_id.handle": arg }], + }) + .getPaginated({ + pagination: { + size: process.env.SYNC_SIZE ? parseInt(process.env.SYNC_SIZE) : 20, + }, + sort: [{ xata_createdat: "desc" }], + }); + for (const scrobble of records) { + console.log(`Syncing scrobble ${chalk.cyan(scrobble.xata_id)} ...`); + await publishScrobble(ctx, scrobble.xata_id); + } + console.log(`Synced ${chalk.greenBright(records.length)} scrobbles`); +} + +process.exit(0); diff --git a/apps/api/src/search/app.ts b/apps/api/src/search/app.ts new file mode 100644 index 00000000..798b3e28 --- /dev/null +++ b/apps/api/src/search/app.ts @@ -0,0 +1,50 @@ +import { ctx } from "context"; +import { Hono } from "hono"; +import { requestCounter } from "metrics"; + +const app = new Hono(); + +app.get("/", async (c) => { + requestCounter.add(1, { method: "GET", route: "/search" }); + const query = c.req.query("q"); + const size = +c.req.query("size") || 10; + const offset = +c.req.query("offset") || 0; + + if (!query) { + return c.json([]); + } + + const results = await ctx.client.search.all(query, { + tables: [ + { + table: "users", + target: ["handle"], + }, + { + table: "albums", + target: ["title"], + }, + { + table: "artists", + target: ["name"], + }, + { + table: "tracks", + target: ["title", "composer", "copyright_message"], + }, + { + table: "playlists", + target: ["name"], + }, + ], + fuzziness: 1, + prefix: "phrase", + page: { + size, + offset, + }, + }); + return c.json(results); +}); + +export default app; diff --git a/apps/api/src/server.ts b/apps/api/src/server.ts new file mode 100644 index 00000000..a1d3bd9d --- /dev/null +++ b/apps/api/src/server.ts @@ -0,0 +1,24 @@ +import { ctx } from "context"; +import express from "express"; +import { createServer } from "lexicon"; +import API from "./xrpc"; + +let server = createServer({ + validateResponse: false, + payload: { + jsonLimit: 100 * 1024, // 100kb + textLimit: 100 * 1024, // 100kb + blobLimit: 5 * 1024 * 1024, // 5mb + }, +}); + +server = API(server, ctx); + +const app = express(); +app.use(server.xrpc.router); + +app.listen(process.env.ROCKSKY_XPRC_PORT || 3004, () => { + console.log( + `Rocksky XRPC API is running on port ${process.env.ROCKSKY_XRPC_PORT || 3004}` + ); +}); diff --git a/apps/api/src/shouts/shouts.service.ts b/apps/api/src/shouts/shouts.service.ts new file mode 100644 index 00000000..0f57dc99 --- /dev/null +++ b/apps/api/src/shouts/shouts.service.ts @@ -0,0 +1,359 @@ +import { Agent, AtpAgent } from "@atproto/api"; +import { TID } from "@atproto/common"; +import { Context } from "context"; +import * as LikeLexicon from "lexicon/types/app/rocksky/like"; +import * as ShoutLexicon from "lexicon/types/app/rocksky/shout"; +import { validateMain } from "lexicon/types/com/atproto/repo/strongRef"; +import _ from "lodash"; +import { Shout } from "types/shout"; + +export async function createShout( + ctx: Context, + shout: Shout, + uri: string, + user, + agent: Agent +) { + let album, artist, track, scrobble, profile, collection; + if (uri.includes("app.rocksky.song")) { + track = await ctx.client.db.tracks.filter("uri", uri).getFirst(); + collection = "app.rocksky.song"; + } else if (uri.includes("app.rocksky.album")) { + album = await ctx.client.db.albums.filter("uri", uri).getFirst(); + collection = "app.rocksky.album"; + } else if (uri.includes("app.rocksky.artist")) { + artist = await ctx.client.db.artists.filter("uri", uri).getFirst(); + collection = "app.rocksky.artist"; + } else if (uri.includes("app.rocksky.scrobble")) { + scrobble = await ctx.client.db.scrobbles + .select(["track_id.*", "album_id.*", "artist_id.*", "uri"]) + .filter("uri", uri) + .getFirst(); + collection = "app.rocksky.scrobble"; + } else { + profile = await ctx.client.db.users + .filter("did", uri.split("at://").pop()) + .getFirst(); + collection = "app.bsky.actor.profile"; + } + + const subjectUri = + album?.uri || track?.uri || artist?.uri || scrobble?.uri || "self"; + const subjectRecord = await agent.com.atproto.repo.getRecord({ + repo: agent.assertDid, + collection, + rkey: subjectUri !== "self" ? subjectUri.split("/").pop() : "self", + }); + + const subjectRef = validateMain({ + uri: subjectRecord.data.uri, + cid: subjectRecord.data.cid, + }); + if (!subjectRef.success) { + console.log(subjectRef); + throw new Error("Invalid ref"); + } + + const rkey = TID.nextStr(); + const record = { + $type: "app.rocksky.shout", + subject: subjectRef.value, + message: shout.message, + createdAt: new Date().toISOString(), + }; + + if (!ShoutLexicon.validateRecord(record).success) { + console.log(ShoutLexicon.validateRecord(record)); + throw new Error("[shout] invalid record"); + } + + try { + const res = await agent.com.atproto.repo.createRecord({ + repo: agent.assertDid, + collection: "app.rocksky.shout", + rkey, + record, + validate: false, + }); + const uri = res.data.uri; + + console.log(`Shout record created at: ${uri}`); + + const createdShout = await ctx.client.db.shouts.create({ + content: shout.message, + uri, + author_id: user.xata_id, + album_id: album?.xata_id, + artist_id: artist?.xata_id, + track_id: track?.xata_id, + scrobble_id: scrobble?.xata_id, + }); + + if (profile) { + await ctx.client.db.profile_shouts.create({ + shout_id: createdShout.xata_id, + user_id: profile.xata_id, + }); + } + } catch (e) { + console.error(`Error creating shout record: ${e.message}`); + } +} + +export async function replyShout( + ctx: Context, + reply: Shout, + shoutUri: string, + user, + agent: Agent +) { + const shout = await ctx.client.db.shouts + .select(["track_id.*", "album_id.*", "artist_id.*", "scrobble_id.*", "uri"]) + .filter("uri", shoutUri) + .getFirst(); + if (!shout) { + throw new Error("Shout not found"); + } + + const { data: profileRecord } = await agent.com.atproto.repo.getRecord({ + repo: agent.assertDid, + collection: "app.bsky.actor.profile", + rkey: "self", + }); + + let collection = "app.bsky.actor.profile"; + + if (shout.track_id) { + collection = "app.rocksky.song"; + } + + if (shout.album_id) { + collection = "app.rocksky.album"; + } + + if (shout.artist_id) { + collection = "app.rocksky.artist"; + } + + if (shout.scrobble_id) { + collection = "app.rocksky.scrobble"; + } + + const subjectUri = + shout.track_id?.uri || + shout.album_id?.uri || + shout.artist_id?.uri || + shout.scrobble_id?.uri || + profileRecord.uri; + + let service = await fetch( + `https://plc.directory/${subjectUri.split("/").slice(0, 3).join("/").split("at://")[1]}` + ) + .then((res) => res.json()) + .then((data) => data.service); + + let atpAgent = new AtpAgent({ + service: _.get(service, "0.serviceEndpoint"), + }); + + const subjectRecord = await atpAgent.com.atproto.repo.getRecord({ + repo: subjectUri.split("/").slice(0, 3).join("/").split("at://")[1], + collection, + rkey: subjectUri.split("/").pop(), + }); + + const subjectRef = validateMain({ + uri: subjectUri, + cid: subjectRecord.data.cid, + }); + if (!subjectRef.success) { + throw new Error("[reply] invalid ref"); + } + + service = await fetch( + `https://plc.directory/${shoutUri.split("/").slice(0, 3).join("/").split("at://")[1]}` + ) + .then((res) => res.json()) + .then((data) => data.service); + + atpAgent = new AtpAgent({ + service: _.get(service, "0.serviceEndpoint"), + }); + + const parentRecord = await atpAgent.com.atproto.repo.getRecord({ + repo: shoutUri.split("/").slice(0, 3).join("/").split("at://")[1], + collection: "app.rocksky.shout", + rkey: shoutUri.split("/").pop(), + }); + + const parentRef = validateMain({ + uri: shout.uri, + cid: parentRecord.data.cid, + }); + if (!parentRef.success) { + throw new Error("[reply] invalid ref"); + } + + const rkey = TID.nextStr(); + const record = { + $type: "app.rocksky.shout", + subject: subjectRef.value, + parent: parentRef.value, + message: reply.message, + createdAt: new Date().toISOString(), + }; + + if (!ShoutLexicon.validateRecord(record).success) { + console.log(ShoutLexicon.validateRecord(record)); + throw new Error("Invalid record"); + } + + try { + const res = await agent.com.atproto.repo.createRecord({ + repo: agent.assertDid, + collection: "app.rocksky.shout", + rkey, + record, + validate: false, + }); + const uri = res.data.uri; + + console.log(`Reply record created at: ${uri}`); + + const createdShout = await ctx.client.db.shouts.create({ + content: reply.message, + uri, + parent_id: shout.xata_id, + author_id: user.xata_id, + track_id: shout.track_id?.xata_id, + album_id: shout.album_id?.xata_id, + artist_id: shout.artist_id?.xata_id, + scrobble_id: shout.scrobble_id?.xata_id, + }); + + if ( + !shout.track_id && + !shout.album_id && + !shout.artist_id && + !shout.scrobble_id + ) { + const profileShout = await ctx.client.db.profile_shouts + .filter("shout_id", shout.xata_id) + .getFirst(); + await ctx.client.db.profile_shouts.create({ + shout_id: createdShout.xata_id, + user_id: profileShout.user_id, + }); + } + } catch (e) { + console.error(`Error creating reply record: ${e.message}`); + } +} + +export async function likeShout( + ctx: Context, + shoutUri: string, + user, + agent: Agent +) { + const rkey = TID.nextStr(); + const likes = await ctx.client.db.shout_likes + .filter({ + "shout_id.uri": shoutUri, + "user_id.xata_id": user.xata_id, + }) + .getFirst(); + + if (likes) { + return; + } + + const { service } = await fetch( + `https://plc.directory/${shoutUri.split("/").slice(0, 3).join("/").split("at://")[1]}` + ).then((res) => res.json()); + + const atpAgent = new AtpAgent({ + service: _.get(service, "0.serviceEndpoint"), + }); + + const subjectRecord = await atpAgent.com.atproto.repo.getRecord({ + repo: shoutUri.split("/").slice(0, 3).join("/").split("at://")[1], + collection: "app.rocksky.shout", + rkey: shoutUri.split("/").pop(), + }); + + const subjectRef = validateMain({ + uri: shoutUri, + cid: subjectRecord.data.cid, + }); + if (!subjectRef.success) { + throw new Error("[like] invalid ref"); + } + + const record = { + $type: "app.rocksky.like", + subject: subjectRef.value, + createdAt: new Date().toISOString(), + }; + + if (!LikeLexicon.validateRecord(record).success) { + console.log(LikeLexicon.validateRecord(record)); + throw new Error("Invalid record"); + } + + try { + const res = await agent.com.atproto.repo.createRecord({ + repo: agent.assertDid, + collection: "app.rocksky.like", + rkey, + record, + validate: false, + }); + const uri = res.data.uri; + console.log(`Like record created at: ${uri}`); + const shout = await ctx.client.db.shouts + .select(["xata_id", "uri"]) + .filter("uri", shoutUri) + .getFirst(); + if (!shout) { + throw new Error("Shout not found"); + } + + await ctx.client.db.shout_likes.create({ + shout_id: shout.xata_id, + user_id: user.xata_id, + uri, + }); + } catch (e) { + console.error(`Error creating like record: ${e.message}`); + } +} + +export async function unlikeShout( + ctx: Context, + shoutUri: string, + user, + agent: Agent +) { + const likes = await ctx.client.db.shout_likes + .filter({ + "shout_id.uri": shoutUri, + "user_id.xata_id": user.xata_id, + }) + .getFirst(); + + if (!likes) { + return; + } + + const rkey = likes.uri.split("/").pop(); + + await Promise.all([ + agent.com.atproto.repo.deleteRecord({ + repo: agent.assertDid, + collection: "app.rocksky.like", + rkey, + }), + ctx.client.db.shout_likes.delete(likes.xata_id), + ]); +} diff --git a/apps/api/src/spotify/app.ts b/apps/api/src/spotify/app.ts new file mode 100644 index 00000000..f8f65667 --- /dev/null +++ b/apps/api/src/spotify/app.ts @@ -0,0 +1,572 @@ +import { equals } from "@xata.io/client"; +import { ctx } from "context"; +import crypto, { createHash } from "crypto"; +import { Hono } from "hono"; +import jwt from "jsonwebtoken"; +import { decrypt, encrypt } from "lib/crypto"; +import { env } from "lib/env"; +import { requestCounter } from "metrics"; +import { rateLimiter } from "ratelimiter"; +import { emailSchema } from "types/email"; + +const app = new Hono(); + +app.use( + "/currently-playing", + rateLimiter({ + limit: 10, // max Spotify API calls + window: 15, // per 10 seconds + keyPrefix: "spotify-ratelimit", + }) +); + +app.get("/login", async (c) => { + requestCounter.add(1, { method: "GET", route: "/spotify/login" }); + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + if (!bearer || bearer === "null") { + c.status(401); + return c.text("Unauthorized"); + } + + const { did } = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + + const user = await ctx.client.db.users.filter("did", equals(did)).getFirst(); + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const state = crypto.randomBytes(16).toString("hex"); + ctx.kv.set(state, did); + const redirectUrl = `https://accounts.spotify.com/en/authorize?client_id=${env.SPOTIFY_CLIENT_ID}&response_type=code&redirect_uri=${env.SPOTIFY_REDIRECT_URI}&scope=user-read-private%20user-read-email%20user-read-playback-state%20user-read-currently-playing%20user-modify-playback-state%20playlist-modify-public%20playlist-modify-private%20playlist-read-private%20playlist-read-collaborative&state=${state}`; + c.header( + "Set-Cookie", + `session-id=${state}; Path=/; HttpOnly; SameSite=Strict; Secure` + ); + return c.json({ redirectUrl }); +}); + +app.get("/callback", async (c) => { + requestCounter.add(1, { method: "GET", route: "/spotify/callback" }); + const params = new URLSearchParams(c.req.url.split("?")[1]); + const { code, state } = Object.fromEntries(params.entries()); + + const response = await fetch("https://accounts.spotify.com/api/token", { + method: "POST", + headers: { + "Content-Type": "application/x-www-form-urlencoded", + }, + body: new URLSearchParams({ + grant_type: "authorization_code", + code, + redirect_uri: env.SPOTIFY_REDIRECT_URI, + client_id: env.SPOTIFY_CLIENT_ID, + client_secret: env.SPOTIFY_CLIENT_SECRET, + }), + }); + const { access_token, refresh_token } = await response.json(); + + if (!state) { + return c.redirect(env.FRONTEND_URL); + } + + const did = ctx.kv.get(state); + if (!did) { + return c.redirect(env.FRONTEND_URL); + } + + ctx.kv.delete(state); + const user = await ctx.client.db.users.filter("did", equals(did)).getFirst(); + + if (!user) { + return c.redirect(env.FRONTEND_URL); + } + + const spotifyToken = await ctx.client.db.spotify_tokens + .filter("user_id", equals(user.xata_id)) + .getFirst(); + + await ctx.client.db.spotify_tokens.createOrUpdate(spotifyToken?.xata_id, { + user_id: user.xata_id, + access_token: encrypt(access_token, env.SPOTIFY_ENCRYPTION_KEY), + refresh_token: encrypt(refresh_token, env.SPOTIFY_ENCRYPTION_KEY), + }); + + const spotifyUser = await ctx.client.db.spotify_accounts + .filter("user_id", equals(user.xata_id)) + .filter("is_beta_user", equals(true)) + .getFirst(); + + if (spotifyUser?.email) { + ctx.nc.publish("rocksky.spotify.user", Buffer.from(spotifyUser.email)); + } + + return c.redirect(env.FRONTEND_URL); +}); + +app.post("/join", async (c) => { + requestCounter.add(1, { method: "POST", route: "/spotify/join" }); + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + if (!bearer || bearer === "null") { + c.status(401); + return c.text("Unauthorized"); + } + + const { did } = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + + const user = await ctx.client.db.users.filter("did", equals(did)).getFirst(); + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const body = await c.req.json(); + const parsed = emailSchema.safeParse(body); + + if (parsed.error) { + c.status(400); + return c.text("Invalid email: " + parsed.error.message); + } + + const { email } = parsed.data; + + try { + await ctx.client.db.spotify_accounts.create({ + user_id: user.xata_id, + email, + is_beta_user: false, + }); + } catch (e) { + if ( + !e.message.includes("invalid record: column [user_id]: is not unique") + ) { + console.error(e.message); + } else { + throw e; + } + } + + await fetch("https://beta.rocksky.app", { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${env.ROCKSKY_BETA_TOKEN}`, + }, + body: JSON.stringify({ email }), + }); + + return c.json({ status: "ok" }); +}); + +app.get("/currently-playing", async (c) => { + requestCounter.add(1, { method: "GET", route: "/spotify/currently-playing" }); + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + const payload = + bearer && bearer !== "null" + ? jwt.verify(bearer, env.JWT_SECRET, { ignoreExpiration: true }) + : {}; + const did = c.req.query("did") || payload.did; + + if (!did) { + c.status(401); + return c.text("Unauthorized"); + } + + const user = await ctx.client.db.users + .filter({ + $any: [{ did }, { handle: did }], + }) + .getFirst(); + + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const spotifyAccount = await ctx.client.db.spotify_accounts + .filter({ + $any: [{ "user_id.did": did }, { "user_id.handle": did }], + }) + .getFirst(); + + if (!spotifyAccount) { + c.status(401); + return c.text("Unauthorized"); + } + + const cached = await ctx.redis.get(`${spotifyAccount.email}:current`); + if (!cached) { + return c.json({}); + } + + const track = JSON.parse(cached); + + const sha256 = createHash("sha256") + .update( + `${track.item.name} - ${track.item.artists.map((x) => x.name).join(", ")} - ${track.item.album.name}`.toLowerCase() + ) + .digest("hex"); + + const [result, liked] = await Promise.all([ + ctx.client.db.tracks.filter("sha256", equals(sha256)).getFirst(), + ctx.client.db.loved_tracks + .filter("user_id", equals(user.xata_id)) + .filter("track_id.sha256", equals(sha256)) + .getFirst(), + ]); + + return c.json({ + ...track, + songUri: result?.uri, + artistUri: result?.artist_uri, + albumUri: result?.album_uri, + liked: !!liked, + sha256, + }); +}); + +app.put("/pause", async (c) => { + requestCounter.add(1, { method: "PUT", route: "/spotify/pause" }); + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + const { did } = + bearer && bearer !== "null" + ? jwt.verify(bearer, env.JWT_SECRET, { ignoreExpiration: true }) + : {}; + + if (!did) { + c.status(401); + return c.text("Unauthorized"); + } + + const user = await ctx.client.db.users.filter("did", equals(did)).getFirst(); + + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const spotifyToken = await ctx.client.db.spotify_tokens + .filter("user_id", equals(user.xata_id)) + .getFirst(); + + if (!spotifyToken) { + c.status(401); + return c.text("Unauthorized"); + } + + const refreshToken = decrypt( + spotifyToken.refresh_token, + env.SPOTIFY_ENCRYPTION_KEY + ); + + // get new access token + const newAccessToken = await fetch("https://accounts.spotify.com/api/token", { + method: "POST", + headers: { + "Content-Type": "application/x-www-form-urlencoded", + }, + body: new URLSearchParams({ + grant_type: "refresh_token", + refresh_token: refreshToken, + client_id: env.SPOTIFY_CLIENT_ID, + client_secret: env.SPOTIFY_CLIENT_SECRET, + }), + }); + + const { access_token } = await newAccessToken.json(); + + const response = await fetch("https://api.spotify.com/v1/me/player/pause", { + method: "PUT", + headers: { + Authorization: `Bearer ${access_token}`, + }, + }); + + if (response.status === 403) { + c.status(403); + return c.text(await response.text()); + } + + return c.json(await response.json()); +}); + +app.put("/play", async (c) => { + requestCounter.add(1, { method: "PUT", route: "/spotify/play" }); + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + const { did } = + bearer && bearer !== "null" + ? jwt.verify(bearer, env.JWT_SECRET, { ignoreExpiration: true }) + : {}; + + if (!did) { + c.status(401); + return c.text("Unauthorized"); + } + + const user = await ctx.client.db.users.filter("did", equals(did)).getFirst(); + + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const spotifyToken = await ctx.client.db.spotify_tokens + .filter("user_id", equals(user.xata_id)) + .getFirst(); + + if (!spotifyToken) { + c.status(401); + return c.text("Unauthorized"); + } + + const refreshToken = decrypt( + spotifyToken.refresh_token, + env.SPOTIFY_ENCRYPTION_KEY + ); + + // get new access token + const newAccessToken = await fetch("https://accounts.spotify.com/api/token", { + method: "POST", + headers: { + "Content-Type": "application/x-www-form-urlencoded", + }, + body: new URLSearchParams({ + grant_type: "refresh_token", + refresh_token: refreshToken, + client_id: env.SPOTIFY_CLIENT_ID, + client_secret: env.SPOTIFY_CLIENT_SECRET, + }), + }); + + const { access_token } = await newAccessToken.json(); + + const response = await fetch("https://api.spotify.com/v1/me/player/play", { + method: "PUT", + headers: { + Authorization: `Bearer ${access_token}`, + }, + }); + + if (response.status === 403) { + c.status(403); + return c.text(await response.text()); + } + + return c.json(await response.json()); +}); + +app.post("/next", async (c) => { + requestCounter.add(1, { method: "POST", route: "/spotify/next" }); + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + const { did } = + bearer && bearer !== "null" + ? jwt.verify(bearer, env.JWT_SECRET, { ignoreExpiration: true }) + : {}; + + if (!did) { + c.status(401); + return c.text("Unauthorized"); + } + + const user = await ctx.client.db.users.filter("did", equals(did)).getFirst(); + + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const spotifyToken = await ctx.client.db.spotify_tokens + .filter("user_id", equals(user.xata_id)) + .getFirst(); + + if (!spotifyToken) { + c.status(401); + return c.text("Unauthorized"); + } + + const refreshToken = decrypt( + spotifyToken.refresh_token, + env.SPOTIFY_ENCRYPTION_KEY + ); + + // get new access token + const newAccessToken = await fetch("https://accounts.spotify.com/api/token", { + method: "POST", + headers: { + "Content-Type": "application/x-www-form-urlencoded", + }, + body: new URLSearchParams({ + grant_type: "refresh_token", + refresh_token: refreshToken, + client_id: env.SPOTIFY_CLIENT_ID, + client_secret: env.SPOTIFY_CLIENT_SECRET, + }), + }); + + const { access_token } = await newAccessToken.json(); + + const response = await fetch("https://api.spotify.com/v1/me/player/next", { + method: "POST", + headers: { + Authorization: `Bearer ${access_token}`, + }, + }); + + if (response.status === 403) { + c.status(403); + return c.text(await response.text()); + } + + return c.json(await response.json()); +}); + +app.post("/previous", async (c) => { + requestCounter.add(1, { method: "POST", route: "/spotify/previous" }); + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + const { did } = + bearer && bearer !== "null" + ? jwt.verify(bearer, env.JWT_SECRET, { ignoreExpiration: true }) + : {}; + + if (!did) { + c.status(401); + return c.text("Unauthorized"); + } + + const user = await ctx.client.db.users.filter("did", equals(did)).getFirst(); + + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const spotifyToken = await ctx.client.db.spotify_tokens + .filter("user_id", equals(user.xata_id)) + .getFirst(); + + if (!spotifyToken) { + c.status(401); + return c.text("Unauthorized"); + } + + const refreshToken = decrypt( + spotifyToken.refresh_token, + env.SPOTIFY_ENCRYPTION_KEY + ); + + // get new access token + const newAccessToken = await fetch("https://accounts.spotify.com/api/token", { + method: "POST", + headers: { + "Content-Type": "application/x-www-form-urlencoded", + }, + body: new URLSearchParams({ + grant_type: "refresh_token", + refresh_token: refreshToken, + client_id: env.SPOTIFY_CLIENT_ID, + client_secret: env.SPOTIFY_CLIENT_SECRET, + }), + }); + + const { access_token } = await newAccessToken.json(); + + const response = await fetch( + "https://api.spotify.com/v1/me/player/previous", + { + method: "POST", + headers: { + Authorization: `Bearer ${access_token}`, + }, + } + ); + + if (response.status === 403) { + c.status(403); + return c.text(await response.text()); + } + + return c.json(await response.json()); +}); + +app.put("/seek", async (c) => { + requestCounter.add(1, { method: "PUT", route: "/spotify/seek" }); + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + const { did } = + bearer && bearer !== "null" + ? jwt.verify(bearer, env.JWT_SECRET, { ignoreExpiration: true }) + : {}; + + if (!did) { + c.status(401); + return c.text("Unauthorized"); + } + + const user = await ctx.client.db.users.filter("did", equals(did)).getFirst(); + + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const spotifyToken = await ctx.client.db.spotify_tokens + .filter("user_id", equals(user.xata_id)) + .getFirst(); + + if (!spotifyToken) { + c.status(401); + return c.text("Unauthorized"); + } + + const refreshToken = decrypt( + spotifyToken.refresh_token, + env.SPOTIFY_ENCRYPTION_KEY + ); + + // get new access token + const newAccessToken = await fetch("https://accounts.spotify.com/api/token", { + method: "POST", + headers: { + "Content-Type": "application/x-www-form-urlencoded", + }, + body: new URLSearchParams({ + grant_type: "refresh_token", + refresh_token: refreshToken, + client_id: env.SPOTIFY_CLIENT_ID, + client_secret: env.SPOTIFY_CLIENT_SECRET, + }), + }); + + const { access_token } = await newAccessToken.json(); + + const position = c.req.query("position_ms"); + const response = await fetch( + `https://api.spotify.com/v1/me/player/seek?position_ms=${position}`, + { + method: "PUT", + headers: { + Authorization: `Bearer ${access_token}`, + }, + } + ); + + if (response.status === 403) { + c.status(403); + return c.text(await response.text()); + } + + return c.json(await response.json()); +}); + +export default app; diff --git a/apps/api/src/sqliteKv.ts b/apps/api/src/sqliteKv.ts new file mode 100644 index 00000000..487f3ccc --- /dev/null +++ b/apps/api/src/sqliteKv.ts @@ -0,0 +1,173 @@ +import Database from "better-sqlite3"; +import { Kysely, SqliteDialect } from "kysely"; +import { defineDriver } from "unstorage"; + +interface TableSchema { + [k: string]: { + id: string; + value: string; + created_at: string; + updated_at: string; + }; +} + +export type KvDb = Kysely; + +const DRIVER_NAME = "sqlite"; + +export default defineDriver< + { + location?: string; + table: string; + getDb?: () => KvDb; + }, + KvDb +>( + ({ + location, + table = "kv", + getDb = (): KvDb => { + let _db: KvDb | null = null; + + return (() => { + if (_db) { + return _db; + } + + if (!location) { + throw new Error("SQLite location is required"); + } + + const sqlite = new Database(location, { fileMustExist: false }); + + // Enable WAL mode + sqlite.pragma("journal_mode = WAL"); + + _db = new Kysely({ + dialect: new SqliteDialect({ + database: sqlite, + }), + }); + + // Create table if not exists + _db.schema + .createTable(table) + .ifNotExists() + .addColumn("id", "text", (col) => col.primaryKey()) + .addColumn("value", "text", (col) => col.notNull()) + .addColumn("created_at", "text", (col) => col.notNull()) + .addColumn("updated_at", "text", (col) => col.notNull()) + .execute(); + + return _db; + })(); + }, + }) => { + return { + name: DRIVER_NAME, + options: { location, table }, + getInstance: getDb, + + async hasItem(key) { + const result = await getDb() + .selectFrom(table) + .select(["id"]) + .where("id", "=", key) + .executeTakeFirst(); + return !!result; + }, + + async getItem(key) { + const result = await getDb() + .selectFrom(table) + .select(["value"]) + .where("id", "=", key) + .executeTakeFirst(); + return result?.value ?? null; + }, + + async setItem(key: string, value: string) { + const now = new Date().toISOString(); + await getDb() + .insertInto(table) + .values({ + id: key, + value, + created_at: now, + updated_at: now, + }) + .onConflict((oc) => + oc.column("id").doUpdateSet({ + value, + updated_at: now, + }) + ) + .execute(); + }, + + async setItems(items) { + const now = new Date().toISOString(); + + await getDb() + .transaction() + .execute(async (trx) => { + await Promise.all( + items.map(({ key, value }) => { + return trx + .insertInto(table) + .values({ + id: key, + value, + created_at: now, + updated_at: now, + }) + .onConflict((oc) => + oc.column("id").doUpdateSet({ + value, + updated_at: now, + }) + ) + .execute(); + }) + ); + }); + }, + + async removeItem(key: string) { + await getDb().deleteFrom(table).where("id", "=", key).execute(); + }, + + async getMeta(key: string) { + const result = await getDb() + .selectFrom(table) + .select(["created_at", "updated_at"]) + .where("id", "=", key) + .executeTakeFirst(); + if (!result) { + return null; + } + return { + birthtime: new Date(result.created_at), + mtime: new Date(result.updated_at), + }; + }, + + async getKeys(base = "") { + const results = await getDb() + .selectFrom(table) + .select(["id"]) + .where("id", "like", `${base}%`) + .execute(); + return results.map((r) => r.id); + }, + + async clear() { + await getDb().deleteFrom(table).execute(); + }, + + async dispose() { + await getDb().destroy(); + }, + }; + } +); diff --git a/apps/api/src/subscribers/index.ts b/apps/api/src/subscribers/index.ts new file mode 100644 index 00000000..8410f27c --- /dev/null +++ b/apps/api/src/subscribers/index.ts @@ -0,0 +1,6 @@ +import { Context } from "context"; +import { onNewPlaylist } from "./playlist"; + +export default function subscribe(ctx: Context) { + onNewPlaylist(ctx); +} diff --git a/apps/api/src/subscribers/playlist.ts b/apps/api/src/subscribers/playlist.ts new file mode 100644 index 00000000..d1d5a22a --- /dev/null +++ b/apps/api/src/subscribers/playlist.ts @@ -0,0 +1,96 @@ +import { TID } from "@atproto/common"; +import { BlobRef } from "@atproto/lexicon"; +import chalk from "chalk"; +import { Context } from "context"; +import * as Playlist from "lexicon/types/app/rocksky/playlist"; +import { createAgent } from "lib/agent"; +import downloadImage, { getContentType } from "lib/downloadImage"; +import { StringCodec } from "nats"; + +export function onNewPlaylist(ctx: Context) { + const sc = StringCodec(); + const sub = ctx.nc.subscribe("rocksky.playlist"); + (async () => { + for await (const m of sub) { + const payload: { + id: string; + did: string; + } = JSON.parse(sc.decode(m.data)); + console.log( + `New playlist: ${chalk.cyan(payload.did)} - ${chalk.greenBright(payload.id)}` + ); + await putPlaylistRecord(ctx, payload); + } + })(); +} + +async function putPlaylistRecord( + ctx: Context, + payload: { id: string; did: string } +) { + const agent = await createAgent(ctx.oauthClient, payload.did); + + if (!agent) { + console.error( + `Failed to create agent, skipping playlist: ${chalk.cyan(payload.id)} for ${chalk.greenBright(payload.did)}` + ); + return; + } + + const playlist = await ctx.client.db.playlists + .filter("xata_id", payload.id) + .getFirst(); + + let rkey = TID.nextStr(); + + if (playlist.uri) { + rkey = playlist.uri.split("/").pop(); + } + + const record: { + $type: string; + name: string; + description?: string; + createdAt: string; + picture?: BlobRef; + spotifyLink?: string; + tidalLink?: string; + appleMusicLink?: string; + youtubeLink?: string; + } = { + $type: "app.rocksky.playlist", + name: playlist.name, + description: playlist.description, + createdAt: new Date().toISOString(), + spotifyLink: playlist.spotify_link, + }; + + if (playlist.picture) { + const imageBuffer = await downloadImage(playlist.picture); + const encoding = await getContentType(playlist.picture); + const uploadResponse = await agent.uploadBlob(imageBuffer, { + encoding, + }); + record.picture = uploadResponse.data.blob; + } + + if (!Playlist.validateRecord(record)) { + console.error(`Invalid record: ${chalk.redBright(JSON.stringify(record))}`); + return; + } + + try { + const res = await agent.com.atproto.repo.putRecord({ + repo: agent.assertDid, + collection: "app.rocksky.playlist", + rkey, + record, + validate: false, + }); + const uri = res.data.uri; + console.log(`Playlist record created: ${chalk.greenBright(uri)}`); + await ctx.client.db.playlists.update(payload.id, { uri }); + } catch (e) { + console.error(`Failed to put record: ${chalk.redBright(e.message)}`); + } +} diff --git a/apps/api/src/tracing.ts b/apps/api/src/tracing.ts new file mode 100644 index 00000000..74050609 --- /dev/null +++ b/apps/api/src/tracing.ts @@ -0,0 +1,12 @@ +import { getNodeAutoInstrumentations } from "@opentelemetry/auto-instrumentations-node"; +import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http"; +import { NodeSDK } from "@opentelemetry/sdk-node"; + +const sdk = new NodeSDK({ + traceExporter: new OTLPTraceExporter({ + url: "http://localhost:4319/v1/traces", + }), + instrumentations: [getNodeAutoInstrumentations()], +}); + +sdk.start(); diff --git a/apps/api/src/tracks/tracks.service.ts b/apps/api/src/tracks/tracks.service.ts new file mode 100644 index 00000000..63373f27 --- /dev/null +++ b/apps/api/src/tracks/tracks.service.ts @@ -0,0 +1,208 @@ +import { Agent } from "@atproto/api"; +import { equals } from "@xata.io/client"; +import { Context } from "context"; +import { createHash } from "crypto"; +import { + putAlbumRecord, + putArtistRecord, + putSongRecord, +} from "nowplaying/nowplaying.service"; +import { Track } from "types/track"; + +export async function saveTrack(ctx: Context, track: Track, agent: Agent) { + const existingTrack = await ctx.client.db.tracks + .filter( + "sha256", + equals( + createHash("sha256") + .update( + `${track.title} - ${track.artist} - ${track.album}`.toLowerCase() + ) + .digest("hex") + ) + ) + .getFirst(); + + let trackUri = existingTrack?.uri; + if (!existingTrack?.uri) { + trackUri = await putSongRecord(track, agent); + } + + // start update existing track with album and artist uri + if (existingTrack && !existingTrack.album_uri) { + const album = await ctx.client.db.albums + .filter( + "sha256", + equals( + createHash("sha256") + .update(`${track.album} - ${track.albumArtist}`.toLowerCase()) + .digest("hex") + ) + ) + .getFirst(); + if (album) { + await ctx.client.db.tracks.update(existingTrack.xata_id, { + album_uri: album.uri, + }); + } + } + + if (existingTrack && !existingTrack.artist_uri) { + const artist = await ctx.client.db.artists + .filter( + "sha256", + equals( + createHash("sha256") + .update(track.albumArtist.toLowerCase()) + .digest("hex") + ) + ) + .getFirst(); + if (artist) { + await ctx.client.db.tracks.update(existingTrack.xata_id, { + artist_uri: artist.uri, + }); + } + } + // end + + const existingArtist = await ctx.client.db.artists + .filter( + "sha256", + equals( + createHash("sha256") + .update(track.albumArtist.toLocaleLowerCase()) + .digest("hex") + ) + ) + .getFirst(); + + let artistUri = existingArtist?.uri; + if (!existingArtist?.uri) { + artistUri = await putArtistRecord(track, agent); + } + + const existingAlbum = await ctx.client.db.albums + .filter( + "sha256", + equals( + createHash("sha256") + .update(`${track.album} - ${track.albumArtist}`.toLowerCase()) + .digest("hex") + ) + ) + .getFirst(); + + let albumUri = existingAlbum?.uri; + if (!existingAlbum?.uri) { + albumUri = await putAlbumRecord(track, agent); + } + + let tries = 0; + + while (tries < 15) { + const track_id = await ctx.client.db.tracks + .filter("uri", equals(trackUri)) + .getFirst(); + + const album_id = await ctx.client.db.albums + .filter("uri", equals(albumUri)) + .getFirst(); + + const artist_id = await ctx.client.db.artists + .filter("uri", equals(artistUri)) + .getFirst(); + + if (!track_id || !album_id || !artist_id) { + console.log( + "Track not yet saved (uri not saved), retrying...", + tries + 1 + ); + await new Promise((resolve) => setTimeout(resolve, 1000)); + tries += 1; + continue; + } + + const album_track = await ctx.client.db.album_tracks + .filter("album_id", equals(album_id.xata_id)) + .filter("track_id", equals(track_id.xata_id)) + .getFirst(); + + const artist_track = await ctx.client.db.artist_tracks + .filter("artist_id", equals(artist_id.xata_id)) + .filter("track_id", equals(track_id.xata_id)) + .getFirst(); + + const artist_album = await ctx.client.db.artist_albums + .filter("artist_id", equals(artist_id.xata_id)) + .filter("album_id", equals(album_id.xata_id)) + .getFirst(); + + if (!album_track) { + await ctx.client.db.album_tracks.create({ + album_id: album_id.xata_id, + track_id: track_id.xata_id, + }); + } + + if (!artist_track) { + await ctx.client.db.artist_tracks.create({ + artist_id: artist_id.xata_id, + track_id: track_id.xata_id, + }); + } + + if (track_id && !track_id.album_uri) { + await ctx.client.db.tracks.update(track_id.xata_id, { + album_uri: album_id.uri, + }); + } + + if (track_id && !track_id.artist_uri) { + await ctx.client.db.tracks.update(track_id.xata_id, { + artist_uri: artist_id.uri, + }); + } + + if ( + album_track && + artist_track && + artist_album && + track_id && + track_id.album_uri && + track_id.artist_uri + ) { + console.log("Track saved successfully after", tries + 1, "tries"); + + const message = JSON.stringify({ + track: track_id, + album_track, + artist_track, + artist_album, + }); + + ctx.nc.publish("rocksky.track", Buffer.from(message)); + break; + } + + tries += 1; + console.log("Track not yet saved, retrying...", tries + 1); + if (tries == 15) { + console.log(">>>"); + console.log(album_track); + console.log(artist_track); + console.log(artist_album); + console.log(artist_id); + console.log(album_id); + console.log(track_id); + console.log(track_id.album_uri); + console.log(track_id.artist_uri); + console.log("<<<"); + } + await new Promise((resolve) => setTimeout(resolve, 1000)); + } + + if (tries == 15) { + console.log("Failed to save track after 15 tries"); + } +} diff --git a/apps/api/src/types/apikey.ts b/apps/api/src/types/apikey.ts new file mode 100644 index 00000000..f5c53f0e --- /dev/null +++ b/apps/api/src/types/apikey.ts @@ -0,0 +1,9 @@ +import z from "zod"; + +export const apiKeySchema = z.object({ + name: z.string().nonempty(), + description: z.string().optional().nullable(), + enabled: z.boolean().optional(), +}); + +export type ApiKey = z.infer; diff --git a/apps/api/src/types/email.ts b/apps/api/src/types/email.ts new file mode 100644 index 00000000..95c56cf3 --- /dev/null +++ b/apps/api/src/types/email.ts @@ -0,0 +1,7 @@ +import z from "zod"; + +export const emailSchema = z.object({ + email: z.string().nonempty().email(), +}); + +export type Email = z.infer; diff --git a/apps/api/src/types/shout.ts b/apps/api/src/types/shout.ts new file mode 100644 index 00000000..bc21ff21 --- /dev/null +++ b/apps/api/src/types/shout.ts @@ -0,0 +1,7 @@ +import z from "zod"; + +export const shoutSchema = z.object({ + message: z.string().nonempty(), +}); + +export type Shout = z.infer; diff --git a/apps/api/src/types/track.ts b/apps/api/src/types/track.ts new file mode 100644 index 00000000..678d7b9e --- /dev/null +++ b/apps/api/src/types/track.ts @@ -0,0 +1,35 @@ +import z from "zod"; + +export const trackSchema = z.object({ + title: z.string().nonempty().trim(), + artist: z.string().nonempty().trim(), + album: z.string().nonempty().trim(), + albumArtist: z.string().nonempty().trim(), + duration: z.number(), + mbId: z.string().optional().nullable(), + albumArt: z.string().optional().nullable(), + trackNumber: z.number().optional().nullable(), + releaseDate: z + .string() + .regex(/^\d{4}-\d{2}-\d{2}$/, "Invalid date format. Use YYYY-MM-DD.") + .transform((v) => new Date(v)) + .optional() + .nullable(), + + year: z.number().optional().nullable(), + discNumber: z.number().optional().nullable(), + lyrics: z.string().optional().nullable(), + composer: z.string().optional().nullable(), + copyrightMessage: z.string().optional().nullable(), + label: z.string().optional().nullable(), + artistPicture: z.string().optional().nullable(), + spotifyLink: z.string().optional().nullable(), + lastfmLink: z.string().optional().nullable(), + youtubeLink: z.string().optional().nullable(), + tidalLink: z.string().optional().nullable(), + appleMusicLink: z.string().optional().nullable(), + deezerLink: z.string().optional().nullable(), + timestamp: z.number().optional().nullable(), +}); + +export type Track = z.infer; diff --git a/apps/api/src/users/app.ts b/apps/api/src/users/app.ts new file mode 100644 index 00000000..eec444c6 --- /dev/null +++ b/apps/api/src/users/app.ts @@ -0,0 +1,1743 @@ +import { BlobRef } from "@atproto/lexicon"; +import { equals } from "@xata.io/client"; +import { ctx } from "context"; +import { + aliasedTable, + asc, + count, + desc, + eq, + inArray, + or, + sql, +} from "drizzle-orm"; +import { Hono } from "hono"; +import jwt from "jsonwebtoken"; +import * as Profile from "lexicon/types/app/bsky/actor/profile"; +import { createAgent } from "lib/agent"; +import { env } from "lib/env"; +import _ from "lodash"; +import { likeTrack, unLikeTrack } from "lovedtracks/lovedtracks.service"; +import { requestCounter } from "metrics"; +import * as R from "ramda"; +import tables from "schema"; +import { + createShout, + likeShout, + replyShout, + unlikeShout, +} from "shouts/shouts.service"; +import { shoutSchema } from "types/shout"; +import { Track } from "types/track"; +import { dedupeTracksKeepLyrics } from "./utils"; + +const app = new Hono(); + +app.get("/:did/likes", async (c) => { + requestCounter.add(1, { method: "GET", route: "/users/:did/likes" }); + const did = c.req.param("did"); + const size = +c.req.query("size") || 10; + const offset = +c.req.query("offset") || 0; + + const lovedTracks = await ctx.client.db.loved_tracks + .select(["track_id.*", "user_id.*"]) + .filter({ + $any: [ + { + "user_id.did": did, + }, + { + "user_id.handle": did, + }, + ], + }) + .sort("xata_createdat", "desc") + .getPaginated({ + pagination: { + size, + offset, + }, + }); + return c.json(lovedTracks); +}); + +app.get("/:handle/scrobbles", async (c) => { + requestCounter.add(1, { method: "GET", route: "/users/:handle/scrobbles" }); + const handle = c.req.param("handle"); + + const size = +c.req.query("size") || 10; + const offset = +c.req.query("offset") || 0; + + const { data } = await ctx.analytics.post("library.getScrobbles", { + user_did: handle, + pagination: { + skip: offset, + take: size, + }, + }); + + return c.json(data); +}); + +app.get("/:did/albums", async (c) => { + requestCounter.add(1, { method: "GET", route: "/users/:did/albums" }); + const did = c.req.param("did"); + const size = +c.req.query("size") || 10; + const offset = +c.req.query("offset") || 0; + + const { data } = await ctx.analytics.post("library.getTopAlbums", { + user_did: did, + pagination: { + skip: offset, + take: size, + }, + }); + + return c.json(data.map((item) => ({ ...item, tags: [] }))); +}); + +app.get("/:did/artists", async (c) => { + requestCounter.add(1, { method: "GET", route: "/users/:did/artists" }); + const did = c.req.param("did"); + const size = +c.req.query("size") || 10; + const offset = +c.req.query("offset") || 0; + + const { data } = await ctx.analytics.post("library.getTopArtists", { + user_did: did, + pagination: { + skip: offset, + take: size, + }, + }); + + return c.json(data.map((item) => ({ ...item, tags: [] }))); +}); + +app.get("/:did/tracks", async (c) => { + requestCounter.add(1, { method: "GET", route: "/users/:did/tracks" }); + const did = c.req.param("did"); + const size = +c.req.query("size") || 10; + const offset = +c.req.query("offset") || 0; + + const { data } = await ctx.analytics.post("library.getTopTracks", { + user_did: did, + pagination: { + skip: offset, + take: size, + }, + }); + + return c.json( + data.map((item) => ({ + ...item, + tags: [], + })) + ); +}); + +app.get("/:did/playlists", async (c) => { + requestCounter.add(1, { method: "GET", route: "/users/:did/playlists" }); + const did = c.req.param("did"); + const size = +c.req.query("size") || 10; + const offset = +c.req.query("offset") || 0; + + const results = await ctx.db + .select({ + playlists: tables.playlists, + trackCount: sql` + (SELECT COUNT(*) + FROM ${tables.playlistTracks} + WHERE ${tables.playlistTracks.playlistId} = ${tables.playlists.id} + )`.as("trackCount"), + }) + .from(tables.playlists) + .leftJoin(tables.users, eq(tables.playlists.createdBy, tables.users.id)) + .where(or(eq(tables.users.did, did), eq(tables.users.handle, did))) + .offset(offset) + .limit(size) + .execute(); + + return c.json( + results.map((x) => ({ + ...x.playlists, + trackCount: +x.trackCount, + })) + ); +}); + +app.get("/:did/app.rocksky.scrobble/:rkey", async (c) => { + requestCounter.add(1, { + method: "GET", + route: "/users/:did/app.rocksky.scrobble/:rkey", + }); + const did = c.req.param("did"); + const rkey = c.req.param("rkey"); + const uri = `at://${did}/app.rocksky.scrobble/${rkey}`; + + const scrobble = await ctx.client.db.scrobbles + .select(["track_id.*", "user_id.*", "xata_createdat", "uri"]) + .filter("uri", equals(uri)) + .getFirst(); + + if (!scrobble) { + c.status(404); + return c.text("Scrobble not found"); + } + + const [listeners, scrobbles] = await Promise.all([ + ctx.client.db.user_tracks.select(["track_id.*"]).summarize({ + filter: { + "track_id.xata_id": scrobble.track_id.xata_id, + }, + columns: ["track_id.*"], + summaries: { + total: { + count: "*", + }, + }, + }), + ctx.client.db.scrobbles.select(["track_id.*", "xata_createdat"]).summarize({ + filter: { + "track_id.xata_id": scrobble.track_id.xata_id, + }, + columns: ["track_id.*"], + summaries: { + total: { + count: "*", + }, + }, + }), + ]); + + return c.json({ + ...R.omit(["xata_id"], scrobble), + id: scrobble.xata_id, + listeners: _.get(listeners.summaries, "0.total", 1), + scrobbles: _.get(scrobbles.summaries, "0.total", 1), + tags: [], + }); +}); + +app.get("/:did/app.rocksky.artist/:rkey", async (c) => { + requestCounter.add(1, { + method: "GET", + route: "/users/:did/app.rocksky.artist/:rkey", + }); + const did = c.req.param("did"); + const rkey = c.req.param("rkey"); + const uri = `at://${did}/app.rocksky.artist/${rkey}`; + + const artist = await ctx.client.db.user_artists + .select(["artist_id.*"]) + .filter({ + $any: [{ uri }, { "artist_id.uri": uri }], + }) + .getFirst(); + + if (!artist) { + c.status(404); + return c.text("Artist not found"); + } + + const [listeners, scrobbles] = await Promise.all([ + ctx.client.db.user_artists.select(["artist_id.*"]).summarize({ + filter: { + "artist_id.xata_id": equals(artist.artist_id.xata_id), + }, + columns: ["artist_id.*"], + summaries: { + total: { + count: "*", + }, + }, + }), + ctx.client.db.scrobbles + .select(["artist_id.*", "xata_createdat"]) + .summarize({ + filter: { + "artist_id.xata_id": artist.artist_id.xata_id, + }, + columns: ["artist_id.*"], + summaries: { + total: { + count: "*", + }, + }, + }), + ]); + + return c.json({ + ...R.omit(["xata_id"], artist.artist_id), + id: artist.artist_id.xata_id, + listeners: _.get(listeners.summaries, "0.total", 1), + scrobbles: _.get(scrobbles.summaries, "0.total", 1), + tags: [], + }); +}); + +app.get("/:did/app.rocksky.album/:rkey", async (c) => { + requestCounter.add(1, { + method: "GET", + route: "/users/:did/app.rocksky.album/:rkey", + }); + + const did = c.req.param("did"); + const rkey = c.req.param("rkey"); + const uri = `at://${did}/app.rocksky.album/${rkey}`; + + const album = await ctx.client.db.user_albums + .select(["album_id.*"]) + .filter({ + $any: [{ uri }, { "album_id.uri": uri }], + }) + .getFirst(); + + if (!album) { + c.status(404); + return c.text("Album not found"); + } + + const tracks = await ctx.client.db.album_tracks + .select(["track_id.*"]) + .filter("album_id.xata_id", equals(album.album_id.xata_id)) + .sort("track_id.track_number", "asc") + .getAll(); + + const [listeners, scrobbles] = await Promise.all([ + ctx.client.db.user_albums.select(["album_id.*"]).summarize({ + filter: { + "album_id.xata_id": equals(album.album_id.xata_id), + }, + columns: ["album_id.*"], + summaries: { + total: { + count: "*", + }, + }, + }), + ctx.client.db.scrobbles.select(["album_id.*", "xata_createdat"]).summarize({ + filter: { + "album_id.xata_id": album.album_id.xata_id, + }, + columns: ["album_id.*"], + summaries: { + total: { + count: "*", + }, + }, + }), + ]); + + return c.json({ + ...R.omit(["xata_id"], album.album_id), + id: album.album_id.xata_id, + listeners: _.get(listeners.summaries, "0.total", 1), + scrobbles: _.get(scrobbles.summaries, "0.total", 1), + label: _.get(tracks, "0.track_id.label", ""), + tracks: dedupeTracksKeepLyrics(tracks.map((track) => track.track_id)).sort( + (a, b) => a.track_number - b.track_number + ), + tags: [], + }); +}); + +app.get("/:did/app.rocksky.song/:rkey", async (c) => { + requestCounter.add(1, { + method: "GET", + route: "/users/:did/app.rocksky.song/:rkey", + }); + const did = c.req.param("did"); + const rkey = c.req.param("rkey"); + const uri = `at://${did}/app.rocksky.song/${rkey}`; + + const [_track, user_track] = await Promise.all([ + ctx.client.db.tracks.filter("uri", equals(uri)).getFirst(), + ctx.client.db.user_tracks + .select(["track_id.*"]) + .filter("uri", equals(uri)) + .getFirst(), + ]); + const track = _track || user_track.track_id; + + if (!track) { + c.status(404); + return c.text("Track not found"); + } + + const [listeners, scrobbles] = await Promise.all([ + ctx.client.db.user_tracks.select(["track_id.*"]).summarize({ + filter: { + "track_id.xata_id": equals(track.xata_id), + }, + columns: ["track_id.*"], + summaries: { + total: { + count: "*", + }, + }, + }), + ctx.client.db.scrobbles.select(["track_id.*", "xata_createdat"]).summarize({ + filter: { + "track_id.xata_id": track.xata_id, + }, + columns: ["track_id.*"], + summaries: { + total: { + count: "*", + }, + }, + }), + ]); + + return c.json({ + ...R.omit(["xata_id"], track), + id: track.xata_id, + tags: [], + listeners: _.get(listeners.summaries, "0.total", 1), + scrobbles: _.get(scrobbles.summaries, "0.total", 1), + }); +}); + +app.get("/:did/app.rocksky.artist/:rkey/tracks", async (c) => { + requestCounter.add(1, { + method: "GET", + route: "/users/:did/app.rocksky.artist/:rkey/tracks", + }); + const did = c.req.param("did"); + const rkey = c.req.param("rkey"); + const uri = `at://${did}/app.rocksky.artist/${rkey}`; + const size = +c.req.query("size") || 10; + const offset = +c.req.query("offset") || 0; + + const tracks = await ctx.client.db.artist_tracks + .select(["track_id.*", "xata_version"]) + .filter({ + "artist_id.uri": equals(uri), + }) + .sort("xata_version", "desc") + .getPaginated({ + pagination: { + size, + offset, + }, + }); + return c.json( + tracks.records.map((item) => ({ + ...R.omit(["xata_id"], item.track_id), + id: item.track_id.xata_id, + xata_version: item.xata_version, + })) + ); +}); + +app.get("/:did/app.rocksky.artist/:rkey/albums", async (c) => { + requestCounter.add(1, { + method: "GET", + route: "/users/:did/app.rocksky.artist/:rkey/albums", + }); + const did = c.req.param("did"); + const rkey = c.req.param("rkey"); + const uri = `at://${did}/app.rocksky.artist/${rkey}`; + const size = +c.req.query("size") || 10; + const offset = +c.req.query("offset") || 0; + + const albums = await ctx.client.db.artist_albums + .select(["album_id.*", "xata_version"]) + .filter({ + "artist_id.uri": equals(uri), + }) + .sort("xata_version", "desc") + .getPaginated({ + pagination: { + size, + offset, + }, + }); + return c.json( + R.uniqBy( + (item) => item.id, + albums.records.map((item) => ({ + ...R.omit(["xata_id"], item.album_id), + id: item.album_id.xata_id, + xata_version: item.xata_version, + })) + ) + ); +}); + +app.get("/:did/app.rocksky.playlist/:rkey", async (c) => { + requestCounter.add(1, { + method: "GET", + route: "/users/:did/app.rocksky.playlist/:rkey", + }); + const did = c.req.param("did"); + const rkey = c.req.param("rkey"); + const uri = `at://${did}/app.rocksky.playlist/${rkey}`; + + const playlist = await ctx.db + .select() + .from(tables.playlists) + .leftJoin(tables.users, eq(tables.playlists.createdBy, tables.users.id)) + .where(eq(tables.playlists.uri, uri)) + .execute(); + + if (!playlist.length) { + c.status(404); + return c.text("Playlist not found"); + } + + const results = await ctx.db + .select() + .from(tables.playlistTracks) + .leftJoin( + tables.playlists, + eq(tables.playlistTracks.playlistId, tables.playlists.id) + ) + .leftJoin( + tables.tracks, + eq(tables.playlistTracks.trackId, tables.tracks.id) + ) + .where(eq(tables.playlists.uri, uri)) + .groupBy( + tables.playlistTracks.id, + tables.playlistTracks.playlistId, + tables.playlistTracks.trackId, + tables.playlistTracks.createdAt, + tables.tracks.id, + tables.tracks.title, + tables.tracks.artist, + tables.tracks.albumArtist, + tables.tracks.albumArt, + tables.tracks.album, + tables.tracks.trackNumber, + tables.tracks.duration, + tables.tracks.mbId, + tables.tracks.youtubeLink, + tables.tracks.spotifyLink, + tables.tracks.appleMusicLink, + tables.tracks.tidalLink, + tables.tracks.sha256, + tables.tracks.discNumber, + tables.tracks.lyrics, + tables.tracks.composer, + tables.tracks.genre, + tables.tracks.copyrightMessage, + tables.tracks.uri, + tables.tracks.albumUri, + tables.tracks.artistUri, + tables.tracks.createdAt, + tables.tracks.updatedAt, + tables.playlists.updatedAt, + tables.playlists.id, + tables.playlists.createdAt, + tables.playlists.name, + tables.playlists.description, + tables.playlists.uri, + tables.playlists.createdBy, + tables.playlists.picture, + tables.playlists.spotifyLink, + tables.playlists.tidalLink, + tables.playlists.appleMusicLink + ) + .orderBy(asc(tables.playlistTracks.createdAt)) + .execute(); + + return c.json({ + ...playlist[0].playlists, + curatedBy: playlist[0].users, + tracks: results.map((x) => x.tracks), + }); +}); + +app.get("/:did", async (c) => { + requestCounter.add(1, { method: "GET", route: "/users/:did" }); + const did = c.req.param("did"); + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + if (bearer && bearer !== "null") { + const claims = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + const agent = await createAgent(ctx.oauthClient, claims.did); + + if (agent) { + const { data: profileRecord } = await agent.com.atproto.repo.getRecord({ + repo: did, + collection: "app.bsky.actor.profile", + rkey: "self", + }); + const handle = await ctx.resolver.resolveDidToHandle(did); + const profile: { + handle?: string; + displayName?: string; + avatar?: BlobRef; + } = + Profile.isRecord(profileRecord.value) && + Profile.validateRecord(profileRecord.value).success + ? { ...profileRecord.value, handle } + : {}; + + if (profile.handle) { + await ctx.db + .update(tables.users) + .set({ + handle, + displayName: profile.displayName, + avatar: `https://cdn.bsky.app/img/avatar/plain/${did}/${profile.avatar.ref.toString()}@jpeg`, + }) + .where(eq(tables.users.did, did)) + .execute(); + + const user = await ctx.client.db.users + .select(["*"]) + .filter("did", equals(did)) + .getFirst(); + + ctx.nc.publish("rocksky.user", Buffer.from(JSON.stringify(user))); + } + } + } + + const user = await ctx.client.db.users + .filter({ + $any: [{ did }, { handle: did }], + }) + .getFirst(); + + if (!user) { + c.status(404); + return c.text("User not found"); + } + + return c.json(user); +}); + +app.post("/:did/app.rocksky.artist/:rkey/shouts", async (c) => { + requestCounter.add(1, { + method: "POST", + route: "/users/:did/app.rocksky.artist/:rkey/shouts", + }); + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + if (!bearer || bearer === "null") { + c.status(401); + return c.text("Unauthorized"); + } + + const payload = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + const agent = await createAgent(ctx.oauthClient, payload.did); + + const user = await ctx.client.db.users + .filter("did", equals(payload.did)) + .getFirst(); + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const did = c.req.param("did"); + const rkey = c.req.param("rkey"); + const body = await c.req.json(); + const parsed = shoutSchema.safeParse(body); + + if (parsed.error) { + c.status(400); + return c.text("Invalid shout data: " + parsed.error.message); + } + + await createShout( + ctx, + parsed.data, + `at://${did}/app.rocksky.artist/${rkey}`, + user, + agent + ); + return c.json({}); +}); + +app.post("/:did/app.rocksky.album/:rkey/shouts", async (c) => { + requestCounter.add(1, { + method: "POST", + route: "/users/:did/app.rocksky.album/:rkey/shouts", + }); + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + if (!bearer || bearer === "null") { + c.status(401); + return c.text("Unauthorized"); + } + + const payload = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + const agent = await createAgent(ctx.oauthClient, payload.did); + + const user = await ctx.client.db.users + .filter("did", equals(payload.did)) + .getFirst(); + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const did = c.req.param("did"); + const rkey = c.req.param("rkey"); + const body = await c.req.json(); + const parsed = shoutSchema.safeParse(body); + + if (parsed.error) { + c.status(400); + return c.text("Invalid shout data: " + parsed.error.message); + } + + await createShout( + ctx, + parsed.data, + `at://${did}/app.rocksky.album/${rkey}`, + user, + agent + ); + return c.json({}); +}); + +app.post("/:did/app.rocksky.song/:rkey/shouts", async (c) => { + requestCounter.add(1, { + method: "POST", + route: "/users/:did/app.rocksky.song/:rkey/shouts", + }); + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + if (!bearer || bearer === "null") { + c.status(401); + return c.text("Unauthorized"); + } + + const payload = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + const agent = await createAgent(ctx.oauthClient, payload.did); + + const user = await ctx.client.db.users + .filter("did", equals(payload.did)) + .getFirst(); + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const did = c.req.param("did"); + const rkey = c.req.param("rkey"); + const body = await c.req.json(); + + const parsed = shoutSchema.safeParse(body); + if (parsed.error) { + c.status(400); + return c.text("Invalid shout data: " + parsed.error.message); + } + + await createShout( + ctx, + parsed.data, + `at://${did}/app.rocksky.song/${rkey}`, + user, + agent + ); + + return c.json({}); +}); + +app.post("/:did/app.rocksky.scrobble/:rkey/shouts", async (c) => { + requestCounter.add(1, { + method: "POST", + route: "/users/:did/app.rocksky.scrobble/:rkey/shouts", + }); + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + if (!bearer || bearer === "null") { + c.status(401); + return c.text("Unauthorized"); + } + + const payload = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + const agent = await createAgent(ctx.oauthClient, payload.did); + + const user = await ctx.client.db.users + .filter("did", equals(payload.did)) + .getFirst(); + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const did = c.req.param("did"); + const rkey = c.req.param("rkey"); + const body = await c.req.json(); + + const parsed = shoutSchema.safeParse(body); + if (parsed.error) { + c.status(400); + return c.text("Invalid shout data: " + parsed.error.message); + } + + await createShout( + ctx, + parsed.data, + `at://${did}/app.rocksky.scrobble/${rkey}`, + user, + agent + ); + + return c.json({}); +}); + +app.post("/:did/shouts", async (c) => { + requestCounter.add(1, { method: "POST", route: "/users/:did/shouts" }); + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + if (!bearer || bearer === "null") { + c.status(401); + return c.text("Unauthorized"); + } + + const payload = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + const agent = await createAgent(ctx.oauthClient, payload.did); + + const user = await ctx.client.db.users + .filter("did", equals(payload.did)) + .getFirst(); + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const did = c.req.param("did"); + const body = await c.req.json(); + const parsed = shoutSchema.safeParse(body); + if (parsed.error) { + c.status(400); + return c.text("Invalid shout data: " + parsed.error.message); + } + + const _user = await ctx.client.db.users + .filter({ + $any: [{ did }, { handle: did }], + }) + .getFirst(); + + if (!_user) { + c.status(404); + return c.text("User not found"); + } + + await createShout(ctx, parsed.data, `at://${_user.did}`, user, agent); + + return c.json({}); +}); + +app.post("/:did/app.rocksky.shout/:rkey/likes", async (c) => { + requestCounter.add(1, { + method: "POST", + route: "/users/:did/app.rocksky.shout/:rkey/likes", + }); + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + if (!bearer || bearer === "null") { + c.status(401); + return c.text("Unauthorized"); + } + + const payload = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + const agent = await createAgent(ctx.oauthClient, payload.did); + + const user = await ctx.client.db.users + .filter("did", equals(payload.did)) + .getFirst(); + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const did = c.req.param("did"); + const rkey = c.req.param("rkey"); + await likeShout(ctx, `at://${did}/app.rocksky.shout/${rkey}`, user, agent); + + return c.json({}); +}); + +app.delete("/:did/app.rocksky.shout/:rkey/likes", async (c) => { + requestCounter.add(1, { + method: "DELETE", + route: "/users/:did/app.rocksky.shout/:rkey/likes", + }); + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + if (!bearer || bearer === "null") { + c.status(401); + return c.text("Unauthorized"); + } + + const payload = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + const agent = await createAgent(ctx.oauthClient, payload.did); + + const user = await ctx.client.db.users + .filter("did", equals(payload.did)) + .getFirst(); + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const did = c.req.param("did"); + const rkey = c.req.param("rkey"); + + await unlikeShout(ctx, `at://${did}/app.rocksky.shout/${rkey}`, user, agent); + + return c.json({}); +}); + +app.post("/:did/app.rocksky.song/:rkey/likes", async (c) => { + requestCounter.add(1, { + method: "POST", + route: "/users/:did/app.rocksky.song/:rkey/likes", + }); + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + if (!bearer || bearer === "null") { + c.status(401); + return c.text("Unauthorized"); + } + + const payload = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + const agent = await createAgent(ctx.oauthClient, payload.did); + + const user = await ctx.client.db.users + .filter("did", equals(payload.did)) + .getFirst(); + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const did = c.req.param("did"); + const rkey = c.req.param("rkey"); + + const result = await ctx.client.db.tracks + .filter("uri", equals(`at://${did}/app.rocksky.song/${rkey}`)) + .getFirst(); + + const track: Track = { + title: result.title, + artist: result.artist, + album: result.album, + albumArt: result.album_art, + albumArtist: result.album_artist, + trackNumber: result.track_number, + duration: result.duration, + composer: result.composer, + lyrics: result.lyrics, + discNumber: result.disc_number, + }; + await likeTrack(ctx, track, user, agent); + + return c.json({}); +}); + +app.delete("/:did/app.rocksky.song/:rkey/likes", async (c) => { + requestCounter.add(1, { + method: "DELETE", + route: "/users/:did/app.rocksky.song/:rkey/likes", + }); + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + if (!bearer || bearer === "null") { + c.status(401); + return c.text("Unauthorized"); + } + + const payload = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + const agent = await createAgent(ctx.oauthClient, payload.did); + + const user = await ctx.client.db.users + .filter("did", equals(payload.did)) + .getFirst(); + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const did = c.req.param("did"); + const rkey = c.req.param("rkey"); + + const track = await ctx.client.db.tracks + .filter("uri", equals(`at://${did}/app.rocksky.song/${rkey}`)) + .getFirst(); + + if (!track) { + c.status(404); + return c.text("Track not found"); + } + + await unLikeTrack(ctx, track.sha256, user, agent); + + return c.json([]); +}); + +app.post("/:did/app.rocksky.shout/:rkey/replies", async (c) => { + requestCounter.add(1, { + method: "POST", + route: "/users/:did/app.rocksky.shout/:rkey/replies", + }); + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + if (!bearer || bearer === "null") { + c.status(401); + return c.text("Unauthorized"); + } + + const payload = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + const agent = await createAgent(ctx.oauthClient, payload.did); + + const user = await ctx.client.db.users + .filter("did", equals(payload.did)) + .getFirst(); + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const did = c.req.param("did"); + const rkey = c.req.param("rkey"); + + const body = await c.req.json(); + const parsed = shoutSchema.safeParse(body); + + if (parsed.error) { + c.status(400); + return c.text("Invalid shout data: " + parsed.error.message); + } + + await replyShout( + ctx, + parsed.data, + `at://${did}/app.rocksky.shout/${rkey}`, + user, + agent + ); + return c.json({}); +}); + +app.get("/:did/app.rocksky.artist/:rkey/shouts", async (c) => { + requestCounter.add(1, { + method: "GET", + route: "/users/:did/app.rocksky.artist/:rkey/shouts", + }); + const did = c.req.param("did"); + const rkey = c.req.param("rkey"); + + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + let user; + if (bearer && bearer !== "null") { + const payload = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + + user = await ctx.client.db.users + .filter("did", equals(payload.did)) + .getFirst(); + } + + const shouts = await ctx.db + .select({ + shouts: user + ? { + id: tables.shouts.id, + content: tables.shouts.content, + createdAt: tables.shouts.createdAt, + uri: tables.shouts.uri, + parent: tables.shouts.parentId, + likes: count(tables.shoutLikes.id).as("likes"), + liked: sql` + EXISTS ( + SELECT 1 + FROM ${tables.shoutLikes} + WHERE ${tables.shoutLikes}.shout_id = ${tables.shouts}.xata_id + AND ${tables.shoutLikes}.user_id = ${user.xata_id} + )`.as("liked"), + } + : { + id: tables.shouts.id, + content: tables.shouts.content, + createdAt: tables.shouts.createdAt, + parent: tables.shouts.parentId, + uri: tables.shouts.uri, + likes: count(tables.shoutLikes.id).as("likes"), + }, + users: { + id: tables.users.id, + did: tables.users.did, + handle: tables.users.handle, + displayName: tables.users.displayName, + avatar: tables.users.avatar, + }, + }) + .from(tables.shouts) + .leftJoin(tables.users, eq(tables.shouts.authorId, tables.users.id)) + .leftJoin(tables.artists, eq(tables.shouts.artistId, tables.artists.id)) + .leftJoin( + tables.shoutLikes, + eq(tables.shouts.id, tables.shoutLikes.shoutId) + ) + .where(eq(tables.artists.uri, `at://${did}/app.rocksky.artist/${rkey}`)) + .groupBy( + tables.shouts.id, + tables.shouts.content, + tables.shouts.createdAt, + tables.shouts.uri, + tables.shouts.parentId, + tables.users.id, + tables.users.did, + tables.users.handle, + tables.users.displayName, + tables.users.avatar + ) + .orderBy(desc(tables.shouts.createdAt)) + .execute(); + return c.json(shouts); +}); + +app.get("/:did/app.rocksky.album/:rkey/shouts", async (c) => { + requestCounter.add(1, { + method: "GET", + route: "/users/:did/app.rocksky.album/:rkey/shouts", + }); + + const did = c.req.param("did"); + const rkey = c.req.param("rkey"); + + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + let user; + if (bearer && bearer !== "null") { + const payload = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + + user = await ctx.client.db.users + .filter("did", equals(payload.did)) + .getFirst(); + } + + const shouts = await ctx.db + .select({ + shouts: user + ? { + id: tables.shouts.id, + content: tables.shouts.content, + createdAt: tables.shouts.createdAt, + parent: tables.shouts.parentId, + uri: tables.shouts.uri, + likes: count(tables.shoutLikes.id).as("likes"), + liked: sql` + EXISTS ( + SELECT 1 + FROM ${tables.shoutLikes} + WHERE ${tables.shoutLikes}.shout_id = ${tables.shouts}.xata_id + AND ${tables.shoutLikes}.user_id = ${user.xata_id} + )`.as("liked"), + } + : { + id: tables.shouts.id, + content: tables.shouts.content, + createdAt: tables.shouts.createdAt, + parent: tables.shouts.parentId, + uri: tables.shouts.uri, + likes: count(tables.shoutLikes.id).as("likes"), + }, + users: { + id: tables.users.id, + did: tables.users.did, + handle: tables.users.handle, + displayName: tables.users.displayName, + avatar: tables.users.avatar, + }, + }) + .from(tables.shouts) + .leftJoin(tables.users, eq(tables.shouts.authorId, tables.users.id)) + .leftJoin(tables.albums, eq(tables.shouts.albumId, tables.albums.id)) + .leftJoin( + tables.shoutLikes, + eq(tables.shouts.id, tables.shoutLikes.shoutId) + ) + .where(eq(tables.albums.uri, `at://${did}/app.rocksky.album/${rkey}`)) + .groupBy( + tables.shouts.id, + tables.shouts.content, + tables.shouts.createdAt, + tables.shouts.uri, + tables.shouts.parentId, + tables.users.id, + tables.users.did, + tables.users.handle, + tables.users.displayName, + tables.users.avatar + ) + .orderBy(desc(tables.shouts.createdAt)) + .execute(); + + return c.json(shouts); +}); + +app.get("/:did/app.rocksky.song/:rkey/shouts", async (c) => { + requestCounter.add(1, { + method: "GET", + route: "/users/:did/app.rocksky.song/:rkey/shouts", + }); + const did = c.req.param("did"); + const rkey = c.req.param("rkey"); + + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + let user; + if (bearer && bearer !== "null") { + const payload = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + + user = await ctx.client.db.users + .filter("did", equals(payload.did)) + .getFirst(); + } + + const shouts = await ctx.db + .select({ + shouts: user + ? { + id: tables.shouts.id, + content: tables.shouts.content, + createdAt: tables.shouts.createdAt, + uri: tables.shouts.uri, + parent: tables.shouts.parentId, + likes: count(tables.shoutLikes.id).as("likes"), + liked: sql` + EXISTS ( + SELECT 1 + FROM ${tables.shoutLikes} + WHERE ${tables.shoutLikes}.shout_id = ${tables.shouts}.xata_id + AND ${tables.shoutLikes}.user_id = ${user.xata_id} + )`.as("liked"), + } + : { + id: tables.shouts.id, + content: tables.shouts.content, + createdAt: tables.shouts.createdAt, + uri: tables.shouts.uri, + parent: tables.shouts.parentId, + likes: count(tables.shoutLikes.id).as("likes"), + }, + users: { + id: tables.users.id, + did: tables.users.did, + handle: tables.users.handle, + displayName: tables.users.displayName, + avatar: tables.users.avatar, + }, + }) + .from(tables.shouts) + .leftJoin(tables.users, eq(tables.shouts.authorId, tables.users.id)) + .leftJoin(tables.tracks, eq(tables.shouts.trackId, tables.tracks.id)) + .leftJoin( + tables.shoutLikes, + eq(tables.shouts.id, tables.shoutLikes.shoutId) + ) + .where(eq(tables.tracks.uri, `at://${did}/app.rocksky.song/${rkey}`)) + .groupBy( + tables.shouts.id, + tables.shouts.content, + tables.shouts.createdAt, + tables.shouts.uri, + tables.shouts.parentId, + tables.users.id, + tables.users.did, + tables.users.handle, + tables.users.displayName, + tables.users.avatar + ) + .orderBy(desc(tables.shouts.createdAt)) + .execute(); + + return c.json(shouts); +}); + +app.get("/:did/app.rocksky.scrobble/:rkey/shouts", async (c) => { + requestCounter.add(1, { + method: "GET", + route: "/users/:did/app.rocksky.scrobble/:rkey/shouts", + }); + const did = c.req.param("did"); + const rkey = c.req.param("rkey"); + + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + let user; + if (bearer && bearer !== "null") { + const payload = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + + user = await ctx.client.db.users + .filter("did", equals(payload.did)) + .getFirst(); + } + + const shouts = await ctx.db + .select({ + shouts: user + ? { + id: tables.shouts.id, + content: tables.shouts.content, + createdAt: tables.shouts.createdAt, + uri: tables.shouts.uri, + parent: tables.shouts.parentId, + likes: count(tables.shoutLikes.id).as("likes"), + liked: sql` + EXISTS ( + SELECT 1 + FROM ${tables.shoutLikes} + WHERE ${tables.shoutLikes}.shout_id = ${tables.shouts}.xata_id + AND ${tables.shoutLikes}.user_id = ${user.xata_id} + )`.as("liked"), + } + : { + id: tables.shouts.id, + content: tables.shouts.content, + createdAt: tables.shouts.createdAt, + uri: tables.shouts.uri, + parent: tables.shouts.parentId, + likes: count(tables.shoutLikes.id).as("likes"), + }, + users: { + id: tables.users.id, + did: tables.users.did, + handle: tables.users.handle, + displayName: tables.users.displayName, + avatar: tables.users.avatar, + }, + }) + .from(tables.shouts) + .leftJoin(tables.users, eq(tables.shouts.authorId, tables.users.id)) + .leftJoin( + tables.scrobbles, + eq(tables.shouts.scrobbleId, tables.scrobbles.id) + ) + .leftJoin( + tables.shoutLikes, + eq(tables.shouts.id, tables.shoutLikes.shoutId) + ) + .where(eq(tables.scrobbles.uri, `at://${did}/app.rocksky.scrobble/${rkey}`)) + .groupBy( + tables.shouts.id, + tables.shouts.content, + tables.shouts.createdAt, + tables.shouts.uri, + tables.shouts.parentId, + tables.users.id, + tables.users.did, + tables.users.handle, + tables.users.displayName, + tables.users.avatar + ) + .orderBy(desc(tables.shouts.createdAt)) + .execute(); + + return c.json(shouts); +}); + +app.get("/:did/shouts", async (c) => { + requestCounter.add(1, { method: "GET", route: "/users/:did/shouts" }); + const did = c.req.param("did"); + + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + let user; + if (bearer && bearer !== "null") { + const payload = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + + user = await ctx.client.db.users + .filter("did", equals(payload.did)) + .getFirst(); + } + + const shouts = await ctx.db + .select({ + profileShouts: { + id: tables.profileShouts.id, + createdAt: tables.profileShouts.createdAt, + }, + shouts: user + ? { + id: tables.shouts.id, + content: tables.shouts.content, + createdAt: tables.shouts.createdAt, + uri: tables.shouts.uri, + parent: tables.shouts.parentId, + likes: count(tables.shoutLikes.id).as("likes"), + liked: sql` + EXISTS ( + SELECT 1 + FROM ${tables.shoutLikes} + WHERE ${tables.shoutLikes}.shout_id = ${tables.shouts}.xata_id + AND ${tables.shoutLikes}.user_id = ${user.xata_id} + )`.as("liked"), + reported: sql` + EXISTS ( + SELECT 1 + FROM ${tables.shoutReports} + WHERE ${tables.shoutReports}.shout_id = ${tables.shouts}.xata_id + AND ${tables.shoutReports}.user_id = ${user.xata_id} + )`.as("reported"), + } + : { + id: tables.shouts.id, + content: tables.shouts.content, + createdAt: tables.shouts.createdAt, + uri: tables.shouts.uri, + parent: tables.shouts.parentId, + likes: count(tables.shoutLikes.id).as("likes"), + }, + users: { + id: aliasedTable(tables.users, "authors").id, + did: aliasedTable(tables.users, "authors").did, + handle: aliasedTable(tables.users, "authors").handle, + displayName: aliasedTable(tables.users, "authors").displayName, + avatar: aliasedTable(tables.users, "authors").avatar, + }, + }) + .from(tables.profileShouts) + .where(or(eq(tables.users.did, did), eq(tables.users.handle, did))) + .leftJoin(tables.shouts, eq(tables.profileShouts.shoutId, tables.shouts.id)) + .leftJoin( + aliasedTable(tables.users, "authors"), + eq(tables.shouts.authorId, aliasedTable(tables.users, "authors").id) + ) + .leftJoin(tables.users, eq(tables.profileShouts.userId, tables.users.id)) + .leftJoin( + tables.shoutLikes, + eq(tables.shouts.id, tables.shoutLikes.shoutId) + ) + .groupBy( + tables.profileShouts.id, + tables.profileShouts.createdAt, + tables.shouts.id, + tables.shouts.uri, + tables.shouts.content, + tables.shouts.createdAt, + tables.shouts.parentId, + tables.users.id, + tables.users.did, + tables.users.handle, + tables.users.displayName, + tables.users.avatar, + aliasedTable(tables.users, "authors").id, + aliasedTable(tables.users, "authors").did, + aliasedTable(tables.users, "authors").handle, + aliasedTable(tables.users, "authors").displayName, + aliasedTable(tables.users, "authors").avatar + ) + .orderBy(desc(tables.profileShouts.createdAt)) + .execute(); + + return c.json(shouts); +}); + +app.get("/:did/app.rocksky.shout/:rkey/likes", async (c) => { + requestCounter.add(1, { + method: "GET", + route: "/users/:did/app.rocksky.shout/:rkey/likes", + }); + const did = c.req.param("did"); + const rkey = c.req.param("rkey"); + const likes = await ctx.client.db.shout_likes + .select(["user_id.*", "xata_createdat"]) + .filter("shout_id.uri", `at://${did}/app.rocksky.shout/${rkey}`) + .getAll(); + return c.json(likes); +}); + +app.get("/:did/app.rocksky.shout/:rkey/replies", async (c) => { + requestCounter.add(1, { + method: "GET", + route: "/users/:did/app.rocksky.shout/:rkey/replies", + }); + const did = c.req.param("did"); + const rkey = c.req.param("rkey"); + const shouts = await ctx.client.db.shouts + .select(["author_id.*", "xata_createdat"]) + .filter("parent_id.uri", `at://${did}/app.rocksky.shout/${rkey}`) + .sort("xata_createdat", "asc") + .getAll(); + return c.json(shouts); +}); + +app.get("/:did/stats", async (c) => { + requestCounter.add(1, { method: "GET", route: "/users/:did/stats" }); + const did = c.req.param("did"); + + const { data } = await ctx.analytics.post("library.getStats", { + user_did: did, + }); + + return c.json({ + scrobbles: data.scrobbles, + artists: data.artists, + lovedTracks: data.loved_tracks, + albums: data.albums, + tracks: data.tracks, + }); +}); + +app.post("/:did/app.rocksky.shout/:rkey/report", async (c) => { + requestCounter.add(1, { + method: "POST", + route: "/users/:did/app.rocksky.shout/:rkey/report", + }); + const did = c.req.param("did"); + const rkey = c.req.param("rkey"); + + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + if (!bearer || bearer === "null") { + c.status(401); + return c.text("Unauthorized"); + } + + const payload = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + const shout = await ctx.client.db.shouts + .filter("uri", `at://${did}/app.rocksky.shout/${rkey}`) + .getFirst(); + + const user = await ctx.client.db.users + .filter("did", equals(payload.did)) + .getFirst(); + + if (!shout) { + c.status(404); + return c.text("Shout not found"); + } + + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const existingReport = await ctx.client.db.shout_reports + .filter({ + user_id: user.xata_id, + shout_id: shout.xata_id, + }) + .getFirst(); + + if (existingReport) { + return c.json(existingReport); + } + + const report = await ctx.client.db.shout_reports.create({ + user_id: user.xata_id, + shout_id: shout.xata_id, + }); + + return c.json(report); +}); + +app.delete("/:did/app.rocksky.shout/:rkey/report", async (c) => { + requestCounter.add(1, { + method: "DELETE", + route: "/users/:did/app.rocksky.shout/:rkey/report", + }); + const did = c.req.param("did"); + const rkey = c.req.param("rkey"); + + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + if (!bearer || bearer === "null") { + c.status(401); + return c.text("Unauthorized"); + } + + const payload = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + const shout = await ctx.client.db.shouts + .filter("uri", `at://${did}/app.rocksky.shout/${rkey}`) + .getFirst(); + + const user = await ctx.client.db.users + .filter("did", equals(payload.did)) + .getFirst(); + + if (!shout) { + c.status(404); + return c.text("Shout not found"); + } + + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const report = await ctx.client.db.shout_reports + .select(["user_id.*", "shout_id.*"]) + .filter({ + user_id: user.xata_id, + shout_id: shout.xata_id, + }) + .getFirst(); + + if (!report) { + c.status(404); + return c.text("Report not found"); + } + + if (report.user_id.xata_id !== user.xata_id) { + c.status(403); + return c.text("Forbidden"); + } + + await ctx.client.db.shout_reports.delete(report.xata_id); + + return c.json(report); +}); + +app.delete("/:did/app.rocksky.shout/:rkey", async (c) => { + requestCounter.add(1, { + method: "DELETE", + route: "/users/:did/app.rocksky.shout/:rkey", + }); + const did = c.req.param("did"); + const rkey = c.req.param("rkey"); + + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + if (!bearer || bearer === "null") { + c.status(401); + return c.text("Unauthorized"); + } + + const payload = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + const agent = await createAgent(ctx.oauthClient, payload.did); + + const user = await ctx.client.db.users + .filter("did", equals(payload.did)) + .getFirst(); + + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const shout = await ctx.client.db.shouts + .select([ + "author_id.*", + "uri", + "content", + "xata_id", + "xata_createdat", + "parent_id", + ]) + .filter("uri", `at://${did}/app.rocksky.shout/${rkey}`) + .getFirst(); + + if (!shout) { + c.status(404); + return c.text("Shout not found"); + } + + if (shout.author_id.xata_id !== user.xata_id) { + c.status(403); + return c.text("Forbidden"); + } + + const replies = await ctx.db + .select({ + replies: { + id: tables.shouts.id, + }, + }) + .from(tables.shouts) + .where(eq(tables.shouts.parentId, shout.xata_id)) + .execute(); + + const replyIds = replies.map(({ replies: r }) => r.id); + + // Delete related records in the correct order + await ctx.db + .delete(tables.shoutLikes) + .where(inArray(tables.shoutLikes.shoutId, replyIds)) + .execute(); + + await ctx.db + .delete(tables.shoutReports) + .where(inArray(tables.shoutReports.shoutId, replyIds)) + .execute(); + + await ctx.db + .delete(tables.profileShouts) + .where(eq(tables.profileShouts.shoutId, shout.xata_id)) + .execute(); + + await ctx.db + .delete(tables.profileShouts) + .where(inArray(tables.profileShouts.shoutId, replyIds)) + .execute(); + + await ctx.db + .delete(tables.shoutLikes) + .where(eq(tables.shoutLikes.shoutId, shout.xata_id)) + .execute(); + + await ctx.db + .delete(tables.shoutReports) + .where(eq(tables.shoutReports.shoutId, shout.xata_id)) + .execute(); + + await ctx.db + .delete(tables.shouts) + .where(inArray(tables.shouts.id, replyIds)) + .execute(); + + await ctx.db + .delete(tables.shouts) + .where(eq(tables.shouts.id, shout.xata_id)) + .execute(); + + await agent.com.atproto.repo.deleteRecord({ + repo: agent.assertDid, + collection: "app.rocksky.shout", + rkey: shout.uri.split("/").pop(), + }); + + return c.json(shout); +}); + +export default app; diff --git a/apps/api/src/users/utils.ts b/apps/api/src/users/utils.ts new file mode 100644 index 00000000..beb02c89 --- /dev/null +++ b/apps/api/src/users/utils.ts @@ -0,0 +1,18 @@ +export function dedupeTracksKeepLyrics(tracks) { + const trackMap = new Map(); + + for (const track of tracks) { + const key = `${track.disc_number} - ${track.track_number}`; + + if (!key) continue; + + const existing = trackMap.get(key); + + // If current has lyrics and either no existing or existing has no lyrics, replace it + if (!existing || (!existing.lyrics && track.lyrics)) { + trackMap.set(key, track); + } + } + + return Array.from(trackMap.values()); +} diff --git a/apps/api/src/webscrobbler/app.ts b/apps/api/src/webscrobbler/app.ts new file mode 100644 index 00000000..a3451437 --- /dev/null +++ b/apps/api/src/webscrobbler/app.ts @@ -0,0 +1,99 @@ +import { ctx } from "context"; +import { eq } from "drizzle-orm"; +import { Hono } from "hono"; +import jwt from "jsonwebtoken"; +import { env } from "lib/env"; +import users from "schema/users"; +import webscrobblers from "schema/webscrobblers"; +import { v4 as uuid } from "uuid"; + +const app = new Hono(); + +app.get("/", async (c) => { + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + + if (!bearer || bearer === "null") { + c.status(401); + return c.text("Unauthorized"); + } + + const { did } = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + + const user = await ctx.client.db.users + .filter({ + $any: [{ did }, { handle: did }], + }) + .getFirst(); + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + const records = await ctx.db + .select() + .from(webscrobblers) + .leftJoin(users, eq(webscrobblers.userId, users.id)) + .where(eq(users.did, did)) + .execute(); + + if (records.length === 0) { + const record = await ctx.client.db.webscrobblers.create({ + uuid: uuid(), + user_id: user.xata_id, + name: "webscrobbler", + }); + return c.json(record); + } + + return c.json(records[0].webscrobblers); +}); + +app.put("/:id", async (c) => { + const bearer = (c.req.header("authorization") || "").split(" ")[1]?.trim(); + const id = c.req.param("id"); + + if (!bearer || bearer === "null") { + c.status(401); + return c.text("Unauthorized"); + } + + const { did } = jwt.verify(bearer, env.JWT_SECRET, { + ignoreExpiration: true, + }); + + const user = await ctx.client.db.users + .filter({ + $any: [{ did }, { handle: did }], + }) + .getFirst(); + if (!user) { + c.status(401); + return c.text("Unauthorized"); + } + + if ( + !id.match(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/) + ) { + c.status(400); + return c.text("Invalid id"); + } + + const existing = await ctx.client.db.webscrobblers + .filter({ user_id: user.xata_id }) + .getFirst(); + + const record = await ctx.client.db.webscrobblers.createOrReplace( + existing?.xata_id, + { + uuid: id, + user_id: user.xata_id, + name: "webscrobbler", + } + ); + + return c.json(record); +}); + +export default app; diff --git a/apps/api/src/websocket/handler.ts b/apps/api/src/websocket/handler.ts new file mode 100644 index 00000000..fca4b679 --- /dev/null +++ b/apps/api/src/websocket/handler.ts @@ -0,0 +1,270 @@ +import chalk from "chalk"; +import { ctx } from "context"; +import { createHash } from "crypto"; +import { and, eq } from "drizzle-orm"; +import { Context } from "hono"; +import jwt from "jsonwebtoken"; +import { env } from "lib/env"; +import lovedTracks from "schema/loved-tracks"; +import tracks from "schema/tracks"; +import users from "schema/users"; +import { v4 as uuidv4 } from "uuid"; +import z from "zod"; + +// Define the schema for the incoming message +const ControlMessageSchema = z.object({ + type: z.string(), + target: z.string().optional(), + action: z.string(), + args: z.any().optional(), + token: z.string(), +}); + +type ControlMessage = z.infer; + +const RegisterDeviceSchema = z.object({ + type: z.literal("register"), + clientName: z.string(), + token: z.string(), +}); + +type RegisterDeviceMessage = z.infer; + +const MessageSchema = z.object({ + type: z.literal("message"), + data: z.any(), + device_id: z.string(), + token: z.string(), +}); + +type Message = z.infer; + +const devices: Record = {}; +const deviceNames: Record = {}; +const userDevices: Record = {}; + +function handleWebsocket(c: Context) { + return { + async onMessage(event, ws) { + try { + if (event.data === "ping") { + ws.send("pong"); + return; + } + const message = JSON.parse(event.data); + const controlMessage = ControlMessageSchema.safeParse(message); + const registerMessage = RegisterDeviceSchema.safeParse(message); + const deviceMessage = MessageSchema.safeParse(message); + + if (deviceMessage.success) { + const { data, device_id, token } = deviceMessage.data; + const { did } = jwt.verify(token, env.JWT_SECRET); + // broadcast to all devices + userDevices[did].forEach(async (id) => { + const targetDevice = devices[id]; + if (targetDevice) { + // check if message is a track or a status + // otherwise, it's a status + if (data.type === "track") { + const sha256 = createHash("sha256") + .update( + `${data.title} - ${data.artist} - ${data.album}`.toLowerCase() + ) + .digest("hex"); + const [cachedTrack, cachedLikes] = await Promise.all([ + ctx.redis.get(`track:${sha256}`), + ctx.redis.get(`likes:${did}:${sha256}`), + ]); + + if (cachedLikes) { + const cachedData = JSON.parse(cachedLikes); + data.liked = cachedData.liked; + } else { + const [likes] = await ctx.db + .select() + .from(lovedTracks) + .leftJoin(tracks, eq(lovedTracks.trackId, tracks.id)) + .leftJoin(users, eq(lovedTracks.userId, users.id)) + .where(and(eq(users.did, did), eq(tracks.sha256, sha256))) + .execute(); + data.liked = likes ? true : false; + await ctx.redis.setEx( + `likes:${did}:${sha256}`, + 2, + JSON.stringify({ liked: data.liked }) + ); + } + + // Check if the track is cached, + // if not, fetch it from the database + // and cache it for 10 seconds + if (cachedTrack) { + const cachedData = JSON.parse(cachedTrack); + data.album_art = cachedData.albumArt; + data.song_uri = cachedData.uri; + data.album_uri = cachedData.albumUri; + data.artist_uri = cachedData.artistUri; + await ctx.redis.setEx( + `nowplaying:${did}`, + 3, + JSON.stringify({ + ...data, + sha256, + liked: data.liked, + }) + ); + } else { + const [track] = await ctx.db + .select() + .from(tracks) + .where(eq(tracks.sha256, sha256)) + .execute(); + if (track) { + data.album_art = track.albumArt; + data.song_uri = track.uri; + data.album_uri = track.albumUri; + data.artist_uri = track.artistUri; + await Promise.all([ + ctx.redis.setEx( + `track:${sha256}`, + 10, + JSON.stringify({ + albumArt: track.albumArt, + uri: track.uri, + albumUri: track.albumUri, + artistUri: track.artistUri, + liked: data.liked, + }) + ), + ctx.redis.setEx( + `nowplaying:${did}`, + 3, + JSON.stringify({ + ...data, + sha256, + liked: data.liked, + }) + ), + ]); + } + } + } else { + await ctx.redis.setEx( + `nowplaying:${did}:status`, + 3, + `${data.status}` + ); + } + + targetDevice.send( + JSON.stringify({ + type: "message", + data, + device_id, + }) + ); + } + }); + } + + if (controlMessage.success) { + const { type, target, action, args, token } = controlMessage.data; + const { did } = jwt.verify(token, env.JWT_SECRET); + console.log( + `Control message: ${chalk.greenBright(type)}, ${chalk.greenBright(target)}, ${chalk.greenBright(action)}, ${chalk.greenBright(args)}, ${chalk.greenBright("***")}` + ); + // Handle control message + const deviceId = userDevices[did]?.find((id) => id === target); + if (deviceId) { + const targetDevice = devices[deviceId]; + if (targetDevice) { + targetDevice.send(JSON.stringify({ type, action, args })); + console.log( + `Control message sent to device: ${chalk.greenBright(deviceId)}, ${chalk.greenBright(target)}` + ); + return; + } + console.error(`Device not found: ${target}`); + return; + } + userDevices[did]?.forEach((id) => { + const targetDevice = devices[id]; + if (targetDevice) { + targetDevice.send(JSON.stringify({ type, action, args })); + console.log( + `Control message sent to all devices: ${chalk.greenBright(id)}, ${chalk.greenBright(target)}` + ); + } + }); + + console.error(`Device ID not found for target: ${target}`); + return; + } + + if (registerMessage.success) { + const { type, clientName, token } = registerMessage.data; + console.log( + `Register message: ${chalk.greenBright(type)}, ${chalk.greenBright(clientName)}, ${chalk.greenBright("****")}` + ); + // Handle register Message + const { did } = jwt.verify(token, env.JWT_SECRET); + const deviceId = uuidv4(); + ws.deviceId = deviceId; + ws.did = did; + devices[deviceId] = ws; + deviceNames[deviceId] = clientName; + userDevices[did] = [...(userDevices[did] || []), deviceId]; + console.log( + `Device registered: ${chalk.greenBright(deviceId)}, ${chalk.greenBright(clientName)}` + ); + + // broadcast to all devices + userDevices[did] + .filter((id) => id !== deviceId) + .forEach((id) => { + const targetDevice = devices[id]; + if (targetDevice) { + targetDevice.send( + JSON.stringify({ + type: "device_registered", + deviceId, + clientName, + }) + ); + } + }); + + ws.send(JSON.stringify({ status: "registered", deviceId })); + return; + } + } catch (e) { + console.error("Error parsing message:", e); + } + }, + onClose: (_, ws) => { + console.log("Connection closed"); + // remove device from devices + const deviceId = ws.deviceId; + const did = ws.did; + if (deviceId && devices[deviceId]) { + delete devices[deviceId]; + console.log(`Device removed: ${chalk.redBright(deviceId)}`); + } + if (did && userDevices[did]) { + userDevices[did] = userDevices[did].filter((id) => id !== deviceId); + if (userDevices[did].length === 0) { + delete userDevices[did]; + } + } + if (deviceId && deviceNames[deviceId]) { + const clientName = deviceNames[deviceId]; + delete deviceNames[deviceId]; + console.log( + `Device name removed: ${chalk.redBright(deviceId)}, ${chalk.redBright(clientName)}` + ); + } + }, + }; +} + +export default handleWebsocket; diff --git a/apps/api/src/xata.ts b/apps/api/src/xata.ts new file mode 100644 index 00000000..bae3cba7 --- /dev/null +++ b/apps/api/src/xata.ts @@ -0,0 +1,4742 @@ +// Generated by Xata Codegen 0.30.1. Please do not edit. +import { buildClient } from "@xata.io/client"; +import type { + BaseClientOptions, + SchemaInference, + XataRecord, +} from "@xata.io/client"; + +const tables = [ + { + name: "album_tags", + checkConstraints: { + album_tags_xata_id_length_xata_id: { + name: "album_tags_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: { + album_id_link: { + name: "album_id_link", + columns: ["album_id"], + referencedTable: "albums", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + tag_id_link: { + name: "tag_id_link", + columns: ["tag_id"], + referencedTable: "tags", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + }, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_album_tags_xata_id_key: { + name: "_pgroll_new_album_tags_xata_id_key", + columns: ["xata_id"], + }, + }, + columns: [ + { + name: "album_id", + type: "link", + link: { table: "albums" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"albums"}', + }, + { + name: "tag_id", + type: "link", + link: { table: "tags" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"tags"}', + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, + { + name: "album_tracks", + checkConstraints: { + album_tracks_xata_id_length_xata_id: { + name: "album_tracks_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: { + album_id_link: { + name: "album_id_link", + columns: ["album_id"], + referencedTable: "albums", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + track_id_link: { + name: "track_id_link", + columns: ["track_id"], + referencedTable: "tracks", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + }, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_album_tracks_xata_id_key: { + name: "_pgroll_new_album_tracks_xata_id_key", + columns: ["xata_id"], + }, + }, + columns: [ + { + name: "album_id", + type: "link", + link: { table: "albums" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"albums"}', + }, + { + name: "track_id", + type: "link", + link: { table: "tracks" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"tracks"}', + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, + { + name: "albums", + checkConstraints: { + albums_xata_id_length_xata_id: { + name: "albums_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: {}, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_albums_xata_id_key: { + name: "_pgroll_new_albums_xata_id_key", + columns: ["xata_id"], + }, + albums__pgroll_new_sha256_key: { + name: "albums__pgroll_new_sha256_key", + columns: ["sha256"], + }, + albums__pgroll_new_uri_key: { + name: "albums__pgroll_new_uri_key", + columns: ["uri"], + }, + albums_apple_music_link_unique: { + name: "albums_apple_music_link_unique", + columns: ["apple_music_link"], + }, + albums_spotify_link_unique: { + name: "albums_spotify_link_unique", + columns: ["spotify_link"], + }, + }, + columns: [ + { + name: "album_art", + type: "text", + notNull: false, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "apple_music_link", + type: "text", + notNull: false, + unique: true, + defaultValue: null, + comment: "", + }, + { + name: "artist", + type: "text", + notNull: true, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "artist_uri", + type: "text", + notNull: false, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "lastfm_link", + type: "text", + notNull: false, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "release_date", + type: "text", + notNull: false, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "sha256", + type: "text", + notNull: true, + unique: true, + defaultValue: null, + comment: "", + }, + { + name: "spotify_link", + type: "text", + notNull: false, + unique: true, + defaultValue: null, + comment: "", + }, + { + name: "tidal_link", + type: "text", + notNull: false, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "title", + type: "text", + notNull: true, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "uri", + type: "text", + notNull: false, + unique: true, + defaultValue: null, + comment: "", + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + { + name: "year", + type: "int", + notNull: false, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "youtube_link", + type: "text", + notNull: false, + unique: false, + defaultValue: null, + comment: "", + }, + ], + }, + { + name: "api_keys", + checkConstraints: { + api_keys_xata_id_length_xata_id: { + name: "api_keys_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: { + user_id_link: { + name: "user_id_link", + columns: ["user_id"], + referencedTable: "users", + referencedColumns: ["xata_id"], + onDelete: "CASCADE", + }, + }, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_api_keys_xata_id_key: { + name: "_pgroll_new_api_keys_xata_id_key", + columns: ["xata_id"], + }, + api_keys__pgroll_new_api_key_key: { + name: "api_keys__pgroll_new_api_key_key", + columns: ["api_key"], + }, + api_keys__pgroll_new_shared_secret_key: { + name: "api_keys__pgroll_new_shared_secret_key", + columns: ["shared_secret"], + }, + api_keys_name_unique: { name: "api_keys_name_unique", columns: ["name"] }, + }, + columns: [ + { + name: "api_key", + type: "text", + notNull: true, + unique: true, + defaultValue: null, + comment: "", + }, + { + name: "description", + type: "text", + notNull: false, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "enabled", + type: "bool", + notNull: true, + unique: false, + defaultValue: "true", + comment: "", + }, + { + name: "name", + type: "text", + notNull: true, + unique: true, + defaultValue: null, + comment: "", + }, + { + name: "shared_secret", + type: "text", + notNull: true, + unique: true, + defaultValue: null, + comment: "", + }, + { + name: "user_id", + type: "link", + link: { table: "users" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"users"}', + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, + { + name: "artist_albums", + checkConstraints: { + artist_albums_xata_id_length_xata_id: { + name: "artist_albums_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: { + album_id_link: { + name: "album_id_link", + columns: ["album_id"], + referencedTable: "albums", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + artist_id_link: { + name: "artist_id_link", + columns: ["artist_id"], + referencedTable: "artists", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + }, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_artist_albums_xata_id_key: { + name: "_pgroll_new_artist_albums_xata_id_key", + columns: ["xata_id"], + }, + }, + columns: [ + { + name: "album_id", + type: "link", + link: { table: "albums" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"albums"}', + }, + { + name: "artist_id", + type: "link", + link: { table: "artists" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"artists"}', + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, + { + name: "artist_tags", + checkConstraints: { + artist_tags_xata_id_length_xata_id: { + name: "artist_tags_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: { + artist_id_link: { + name: "artist_id_link", + columns: ["artist_id"], + referencedTable: "artists", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + tag_id_link: { + name: "tag_id_link", + columns: ["tag_id"], + referencedTable: "tags", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + }, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_artist_tags_xata_id_key: { + name: "_pgroll_new_artist_tags_xata_id_key", + columns: ["xata_id"], + }, + }, + columns: [ + { + name: "artist_id", + type: "link", + link: { table: "artists" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"artists"}', + }, + { + name: "tag_id", + type: "link", + link: { table: "tags" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"tags"}', + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, + { + name: "artist_tracks", + checkConstraints: { + artist_tracks_xata_id_length_xata_id: { + name: "artist_tracks_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: { + artist_id_link: { + name: "artist_id_link", + columns: ["artist_id"], + referencedTable: "artists", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + track_id_link: { + name: "track_id_link", + columns: ["track_id"], + referencedTable: "tracks", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + }, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_artist_tracks_xata_id_key: { + name: "_pgroll_new_artist_tracks_xata_id_key", + columns: ["xata_id"], + }, + }, + columns: [ + { + name: "artist_id", + type: "link", + link: { table: "artists" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"artists"}', + }, + { + name: "track_id", + type: "link", + link: { table: "tracks" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"tracks"}', + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, + { + name: "artists", + checkConstraints: { + artists_xata_id_length_xata_id: { + name: "artists_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: {}, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_artists_xata_id_key: { + name: "_pgroll_new_artists_xata_id_key", + columns: ["xata_id"], + }, + artists__pgroll_new_sha256_key: { + name: "artists__pgroll_new_sha256_key", + columns: ["sha256"], + }, + artists__pgroll_new_uri_key: { + name: "artists__pgroll_new_uri_key", + columns: ["uri"], + }, + artists_apple_music_link_unique: { + name: "artists_apple_music_link_unique", + columns: ["apple_music_link"], + }, + artists_spotify_link_unique: { + name: "artists_spotify_link_unique", + columns: ["spotify_link"], + }, + artists_tidal_link_unique: { + name: "artists_tidal_link_unique", + columns: ["tidal_link"], + }, + artists_youtube_link_unique: { + name: "artists_youtube_link_unique", + columns: ["youtube_link"], + }, + }, + columns: [ + { + name: "apple_music_link", + type: "text", + notNull: false, + unique: true, + defaultValue: null, + comment: "", + }, + { + name: "biography", + type: "text", + notNull: false, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "born", + type: "datetime", + notNull: false, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "born_in", + type: "text", + notNull: false, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "died", + type: "datetime", + notNull: false, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "lastfm_link", + type: "text", + notNull: false, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "name", + type: "text", + notNull: true, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "picture", + type: "text", + notNull: false, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "sha256", + type: "text", + notNull: true, + unique: true, + defaultValue: null, + comment: "", + }, + { + name: "spotify_link", + type: "text", + notNull: false, + unique: true, + defaultValue: null, + comment: "", + }, + { + name: "tidal_link", + type: "text", + notNull: false, + unique: true, + defaultValue: null, + comment: "", + }, + { + name: "uri", + type: "text", + notNull: false, + unique: true, + defaultValue: null, + comment: "", + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + { + name: "youtube_link", + type: "text", + notNull: false, + unique: true, + defaultValue: null, + comment: "", + }, + ], + }, + { + name: "builtin_storage_paths", + checkConstraints: { + builtin_storage_paths_xata_id_length_xata_id: { + name: "builtin_storage_paths_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: { + track_id_link: { + name: "track_id_link", + columns: ["track_id"], + referencedTable: "tracks", + referencedColumns: ["xata_id"], + onDelete: "CASCADE", + }, + user_id_link: { + name: "user_id_link", + columns: ["user_id"], + referencedTable: "users", + referencedColumns: ["xata_id"], + onDelete: "CASCADE", + }, + }, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_builtin_storage_paths_xata_id_key: { + name: "_pgroll_new_builtin_storage_paths_xata_id_key", + columns: ["xata_id"], + }, + builtin_storage_paths__pgroll_new_path_key: { + name: "builtin_storage_paths__pgroll_new_path_key", + columns: ["path"], + }, + }, + columns: [ + { + name: "path", + type: "text", + notNull: true, + unique: true, + defaultValue: null, + comment: "", + }, + { + name: "track_id", + type: "link", + link: { table: "tracks" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"tracks"}', + }, + { + name: "user_id", + type: "link", + link: { table: "users" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"users"}', + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, + { + name: "dropbox", + checkConstraints: { + dropbox_xata_id_length_xata_id: { + name: "dropbox_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: { + dropbox_token_id_link: { + name: "dropbox_token_id_link", + columns: ["dropbox_token_id"], + referencedTable: "dropbox_tokens", + referencedColumns: ["xata_id"], + onDelete: "CASCADE", + }, + user_id_link: { + name: "user_id_link", + columns: ["user_id"], + referencedTable: "users", + referencedColumns: ["xata_id"], + onDelete: "CASCADE", + }, + }, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_dropbox_xata_id_key: { + name: "_pgroll_new_dropbox_xata_id_key", + columns: ["xata_id"], + }, + }, + columns: [ + { + name: "dropbox_token_id", + type: "link", + link: { table: "dropbox_tokens" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"dropbox_tokens"}', + }, + { + name: "user_id", + type: "link", + link: { table: "users" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"users"}', + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, + { + name: "dropbox_accounts", + checkConstraints: { + dropbox_accounts_xata_id_length_xata_id: { + name: "dropbox_accounts_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: { + user_id_link: { + name: "user_id_link", + columns: ["user_id"], + referencedTable: "users", + referencedColumns: ["xata_id"], + onDelete: "CASCADE", + }, + }, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_dropbox_accounts_xata_id_key: { + name: "_pgroll_new_dropbox_accounts_xata_id_key", + columns: ["xata_id"], + }, + dropbox_accounts__pgroll_new_email_key: { + name: "dropbox_accounts__pgroll_new_email_key", + columns: ["email"], + }, + }, + columns: [ + { + name: "email", + type: "text", + notNull: true, + unique: true, + defaultValue: null, + comment: "", + }, + { + name: "is_beta_user", + type: "bool", + notNull: true, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "user_id", + type: "link", + link: { table: "users" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"users"}', + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, + { + name: "dropbox_paths", + checkConstraints: { + dropbox_paths_xata_id_length_xata_id: { + name: "dropbox_paths_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: { + dropbox_id_link: { + name: "dropbox_id_link", + columns: ["dropbox_id"], + referencedTable: "dropbox", + referencedColumns: ["xata_id"], + onDelete: "CASCADE", + }, + track_id_link: { + name: "track_id_link", + columns: ["track_id"], + referencedTable: "tracks", + referencedColumns: ["xata_id"], + onDelete: "CASCADE", + }, + }, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_dropbox_paths_xata_id_key: { + name: "_pgroll_new_dropbox_paths_xata_id_key", + columns: ["xata_id"], + }, + dropbox_paths__pgroll_new_file_id_key: { + name: "dropbox_paths__pgroll_new_file_id_key", + columns: ["file_id"], + }, + }, + columns: [ + { + name: "dropbox_id", + type: "link", + link: { table: "dropbox" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"dropbox"}', + }, + { + name: "file_id", + type: "text", + notNull: true, + unique: true, + defaultValue: null, + comment: "", + }, + { + name: "name", + type: "text", + notNull: true, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "path", + type: "text", + notNull: true, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "track_id", + type: "link", + link: { table: "tracks" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"tracks"}', + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, + { + name: "dropbox_tokens", + checkConstraints: { + dropbox_tokens_xata_id_length_xata_id: { + name: "dropbox_tokens_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: {}, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_dropbox_tokens_xata_id_key: { + name: "_pgroll_new_dropbox_tokens_xata_id_key", + columns: ["xata_id"], + }, + }, + columns: [ + { + name: "refresh_token", + type: "text", + notNull: true, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, + { + name: "google_drive", + checkConstraints: { + google_drive_xata_id_length_xata_id: { + name: "google_drive_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: { + google_drive_token_id_link: { + name: "google_drive_token_id_link", + columns: ["google_drive_token_id"], + referencedTable: "google_drive_tokens", + referencedColumns: ["xata_id"], + onDelete: "CASCADE", + }, + user_id_link: { + name: "user_id_link", + columns: ["user_id"], + referencedTable: "users", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + }, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_google_drive_xata_id_key: { + name: "_pgroll_new_google_drive_xata_id_key", + columns: ["xata_id"], + }, + }, + columns: [ + { + name: "google_drive_token_id", + type: "link", + link: { table: "google_drive_tokens" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"google_drive_tokens"}', + }, + { + name: "user_id", + type: "link", + link: { table: "users" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"users"}', + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, + { + name: "google_drive_accounts", + checkConstraints: { + google_drive_accounts_xata_id_length_xata_id: { + name: "google_drive_accounts_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: { + user_id_link: { + name: "user_id_link", + columns: ["user_id"], + referencedTable: "users", + referencedColumns: ["xata_id"], + onDelete: "CASCADE", + }, + }, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_google_drive_accounts_xata_id_key: { + name: "_pgroll_new_google_drive_accounts_xata_id_key", + columns: ["xata_id"], + }, + google_drive_accounts__pgroll_new_email_key: { + name: "google_drive_accounts__pgroll_new_email_key", + columns: ["email"], + }, + }, + columns: [ + { + name: "email", + type: "text", + notNull: true, + unique: true, + defaultValue: null, + comment: "", + }, + { + name: "is_beta_user", + type: "bool", + notNull: true, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "user_id", + type: "link", + link: { table: "users" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"users"}', + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, + { + name: "google_drive_paths", + checkConstraints: { + google_drive_paths_xata_id_length_xata_id: { + name: "google_drive_paths_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: { + google_drive_id_link: { + name: "google_drive_id_link", + columns: ["google_drive_id"], + referencedTable: "google_drive", + referencedColumns: ["xata_id"], + onDelete: "CASCADE", + }, + track_id_link: { + name: "track_id_link", + columns: ["track_id"], + referencedTable: "tracks", + referencedColumns: ["xata_id"], + onDelete: "CASCADE", + }, + }, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_google_drive_paths_xata_id_key: { + name: "_pgroll_new_google_drive_paths_xata_id_key", + columns: ["xata_id"], + }, + google_drive_paths__pgroll_new_google_drive_file_id_key: { + name: "google_drive_paths__pgroll_new_google_drive_file_id_key", + columns: ["file_id"], + }, + }, + columns: [ + { + name: "file_id", + type: "text", + notNull: true, + unique: true, + defaultValue: null, + comment: "", + }, + { + name: "google_drive_id", + type: "link", + link: { table: "google_drive" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"google_drive"}', + }, + { + name: "name", + type: "text", + notNull: true, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "track_id", + type: "link", + link: { table: "tracks" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"tracks"}', + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, + { + name: "google_drive_tokens", + checkConstraints: { + google_drive_tokens_xata_id_length_xata_id: { + name: "google_drive_tokens_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: {}, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_google_drive_tokens_xata_id_key: { + name: "_pgroll_new_google_drive_tokens_xata_id_key", + columns: ["xata_id"], + }, + }, + columns: [ + { + name: "refresh_token", + type: "text", + notNull: true, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, + { + name: "loved_tracks", + checkConstraints: { + loved_tracks_xata_id_length_xata_id: { + name: "loved_tracks_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: { + track_id_link: { + name: "track_id_link", + columns: ["track_id"], + referencedTable: "tracks", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + user_id_link: { + name: "user_id_link", + columns: ["user_id"], + referencedTable: "users", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + }, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_loved_tracks_xata_id_key: { + name: "_pgroll_new_loved_tracks_xata_id_key", + columns: ["xata_id"], + }, + loved_tracks__pgroll_new_uri_key: { + name: "loved_tracks__pgroll_new_uri_key", + columns: ["uri"], + }, + }, + columns: [ + { + name: "track_id", + type: "link", + link: { table: "tracks" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"tracks"}', + }, + { + name: "uri", + type: "text", + notNull: false, + unique: true, + defaultValue: null, + comment: "", + }, + { + name: "user_id", + type: "link", + link: { table: "users" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"users"}', + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, + { + name: "playback_state", + checkConstraints: { + playback_states_xata_id_length_xata_id: { + name: "playback_states_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: { + track_id_link: { + name: "track_id_link", + columns: ["track_id"], + referencedTable: "tracks", + referencedColumns: ["xata_id"], + onDelete: "CASCADE", + }, + user_id_link: { + name: "user_id_link", + columns: ["user_id"], + referencedTable: "users", + referencedColumns: ["xata_id"], + onDelete: "CASCADE", + }, + }, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_playback_states_xata_id_key: { + name: "_pgroll_new_playback_states_xata_id_key", + columns: ["xata_id"], + }, + }, + columns: [ + { + name: "progress_ms", + type: "int", + notNull: true, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "queue_position", + type: "int", + notNull: true, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "track_id", + type: "link", + link: { table: "tracks" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"tracks"}', + }, + { + name: "user_id", + type: "link", + link: { table: "users" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"users"}', + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, + { + name: "playlist_tracks", + checkConstraints: { + playlist_tracks_xata_id_length_xata_id: { + name: "playlist_tracks_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: { + playlist_id_link: { + name: "playlist_id_link", + columns: ["playlist_id"], + referencedTable: "playlists", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + track_id_link: { + name: "track_id_link", + columns: ["track_id"], + referencedTable: "tracks", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + }, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_playlist_tracks_xata_id_key: { + name: "_pgroll_new_playlist_tracks_xata_id_key", + columns: ["xata_id"], + }, + }, + columns: [ + { + name: "playlist_id", + type: "link", + link: { table: "playlists" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"playlists"}', + }, + { + name: "track_id", + type: "link", + link: { table: "tracks" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"tracks"}', + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, + { + name: "playlists", + checkConstraints: { + playlists_xata_id_length_xata_id: { + name: "playlists_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: { + created_by_link: { + name: "created_by_link", + columns: ["created_by"], + referencedTable: "users", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + }, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_playlists_xata_id_key: { + name: "_pgroll_new_playlists_xata_id_key", + columns: ["xata_id"], + }, + playlists__pgroll_new_uri_key: { + name: "playlists__pgroll_new_uri_key", + columns: ["uri"], + }, + playlists_apple_music_link_unique: { + name: "playlists_apple_music_link_unique", + columns: ["apple_music_link"], + }, + playlists_spotify_link_unique: { + name: "playlists_spotify_link_unique", + columns: ["spotify_link"], + }, + playlists_tidal_link_unique: { + name: "playlists_tidal_link_unique", + columns: ["tidal_link"], + }, + }, + columns: [ + { + name: "apple_music_link", + type: "text", + notNull: false, + unique: true, + defaultValue: null, + comment: "", + }, + { + name: "created_by", + type: "link", + link: { table: "users" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"users"}', + }, + { + name: "description", + type: "text", + notNull: false, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "name", + type: "text", + notNull: true, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "picture", + type: "text", + notNull: false, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "spotify_link", + type: "text", + notNull: false, + unique: true, + defaultValue: null, + comment: "", + }, + { + name: "tidal_link", + type: "text", + notNull: false, + unique: true, + defaultValue: null, + comment: "", + }, + { + name: "uri", + type: "text", + notNull: false, + unique: true, + defaultValue: null, + comment: "", + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, + { + name: "profile_shouts", + checkConstraints: { + profile_shouts_xata_id_length_xata_id: { + name: "profile_shouts_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: { + shout_id_link: { + name: "shout_id_link", + columns: ["shout_id"], + referencedTable: "shouts", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + user_id_link: { + name: "user_id_link", + columns: ["user_id"], + referencedTable: "users", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + }, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_profile_shouts_xata_id_key: { + name: "_pgroll_new_profile_shouts_xata_id_key", + columns: ["xata_id"], + }, + }, + columns: [ + { + name: "shout_id", + type: "link", + link: { table: "shouts" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"shouts"}', + }, + { + name: "user_id", + type: "link", + link: { table: "users" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"users"}', + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, + { + name: "queue_tracks", + checkConstraints: { + queue_tracks_xata_id_length_xata_id: { + name: "queue_tracks_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: { + track_id_link: { + name: "track_id_link", + columns: ["track_id"], + referencedTable: "tracks", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + user_id_link: { + name: "user_id_link", + columns: ["user_id"], + referencedTable: "users", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + }, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_queue_tracks_xata_id_key: { + name: "_pgroll_new_queue_tracks_xata_id_key", + columns: ["xata_id"], + }, + }, + columns: [ + { + name: "position", + type: "int", + notNull: true, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "track_id", + type: "link", + link: { table: "tracks" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"tracks"}', + }, + { + name: "user_id", + type: "link", + link: { table: "users" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"users"}', + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, + { + name: "radios", + checkConstraints: { + radios_xata_id_length_xata_id: { + name: "radios_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: {}, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_radios_xata_id_key: { + name: "_pgroll_new_radios_xata_id_key", + columns: ["xata_id"], + }, + radios__pgroll_new_uri_key: { + name: "radios__pgroll_new_uri_key", + columns: ["uri"], + }, + radios__pgroll_new_url_key: { + name: "radios__pgroll_new_url_key", + columns: ["url"], + }, + }, + columns: [ + { + name: "description", + type: "text", + notNull: false, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "genre", + type: "text", + notNull: false, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "logo", + type: "text", + notNull: false, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "name", + type: "text", + notNull: true, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "uri", + type: "text", + notNull: false, + unique: true, + defaultValue: null, + comment: "", + }, + { + name: "url", + type: "text", + notNull: true, + unique: true, + defaultValue: null, + comment: "", + }, + { + name: "website", + type: "text", + notNull: false, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, + { + name: "s3_bucket", + checkConstraints: { + s3_xata_id_length_xata_id: { + name: "s3_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: { + s3_token_id_link: { + name: "s3_token_id_link", + columns: ["s3_token_id"], + referencedTable: "s3_tokens", + referencedColumns: ["xata_id"], + onDelete: "CASCADE", + }, + user_id_link: { + name: "user_id_link", + columns: ["user_id"], + referencedTable: "users", + referencedColumns: ["xata_id"], + onDelete: "CASCADE", + }, + }, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_s3_xata_id_key: { + name: "_pgroll_new_s3_xata_id_key", + columns: ["xata_id"], + }, + }, + columns: [ + { + name: "name", + type: "text", + notNull: true, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "s3_token_id", + type: "link", + link: { table: "s3_tokens" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"s3_tokens"}', + }, + { + name: "user_id", + type: "link", + link: { table: "users" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"users"}', + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, + { + name: "s3_paths", + checkConstraints: { + s3_paths_xata_id_length_xata_id: { + name: "s3_paths_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: { + s3_bucket_id_link: { + name: "s3_bucket_id_link", + columns: ["s3_bucket_id"], + referencedTable: "s3_bucket", + referencedColumns: ["xata_id"], + onDelete: "CASCADE", + }, + track_id_link: { + name: "track_id_link", + columns: ["track_id"], + referencedTable: "tracks", + referencedColumns: ["xata_id"], + onDelete: "CASCADE", + }, + }, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_s3_paths_xata_id_key: { + name: "_pgroll_new_s3_paths_xata_id_key", + columns: ["xata_id"], + }, + }, + columns: [ + { + name: "name", + type: "text", + notNull: true, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "path", + type: "text", + notNull: true, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "s3_bucket_id", + type: "link", + link: { table: "s3_bucket" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"s3_bucket"}', + }, + { + name: "track_id", + type: "link", + link: { table: "tracks" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"tracks"}', + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, + { + name: "s3_tokens", + checkConstraints: { + s3_tokens_xata_id_length_xata_id: { + name: "s3_tokens_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: {}, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_s3_tokens_xata_id_key: { + name: "_pgroll_new_s3_tokens_xata_id_key", + columns: ["xata_id"], + }, + }, + columns: [ + { + name: "client_access_key", + type: "text", + notNull: true, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "secret_access_key", + type: "text", + notNull: true, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, + { + name: "scrobbles", + checkConstraints: { + scrobbles_xata_id_length_xata_id: { + name: "scrobbles_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: { + album_id_link: { + name: "album_id_link", + columns: ["album_id"], + referencedTable: "albums", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + artist_id_link: { + name: "artist_id_link", + columns: ["artist_id"], + referencedTable: "artists", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + track_id_link: { + name: "track_id_link", + columns: ["track_id"], + referencedTable: "tracks", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + user_id_link: { + name: "user_id_link", + columns: ["user_id"], + referencedTable: "users", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + }, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_scrobbles_xata_id_key: { + name: "_pgroll_new_scrobbles_xata_id_key", + columns: ["xata_id"], + }, + scrobbles_uri_unique: { name: "scrobbles_uri_unique", columns: ["uri"] }, + }, + columns: [ + { + name: "album_id", + type: "link", + link: { table: "albums" }, + notNull: false, + unique: false, + defaultValue: null, + comment: '{"xata.link":"albums"}', + }, + { + name: "artist_id", + type: "link", + link: { table: "artists" }, + notNull: false, + unique: false, + defaultValue: null, + comment: '{"xata.link":"artists"}', + }, + { + name: "timestamp", + type: "datetime", + notNull: false, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "track_id", + type: "link", + link: { table: "tracks" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"tracks"}', + }, + { + name: "uri", + type: "text", + notNull: false, + unique: true, + defaultValue: null, + comment: "", + }, + { + name: "user_id", + type: "link", + link: { table: "users" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"users"}', + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, + { + name: "sftp", + checkConstraints: { + sftp_xata_id_length_xata_id: { + name: "sftp_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: {}, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_sftp_xata_id_key: { + name: "_pgroll_new_sftp_xata_id_key", + columns: ["xata_id"], + }, + }, + columns: [ + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, + { + name: "sftp_access", + checkConstraints: { + sftp_access_xata_id_length_xata_id: { + name: "sftp_access_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: {}, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_sftp_access_xata_id_key: { + name: "_pgroll_new_sftp_access_xata_id_key", + columns: ["xata_id"], + }, + }, + columns: [ + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, + { + name: "sftp_path", + checkConstraints: { + sftp_path_xata_id_length_xata_id: { + name: "sftp_path_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: { + sftp_id_link: { + name: "sftp_id_link", + columns: ["sftp_id"], + referencedTable: "sftp", + referencedColumns: ["xata_id"], + onDelete: "CASCADE", + }, + track_id_link: { + name: "track_id_link", + columns: ["track_id"], + referencedTable: "tracks", + referencedColumns: ["xata_id"], + onDelete: "CASCADE", + }, + }, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_sftp_path_xata_id_key: { + name: "_pgroll_new_sftp_path_xata_id_key", + columns: ["xata_id"], + }, + }, + columns: [ + { + name: "name", + type: "text", + notNull: true, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "path", + type: "text", + notNull: true, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "sftp_id", + type: "link", + link: { table: "sftp" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"sftp"}', + }, + { + name: "track_id", + type: "link", + link: { table: "tracks" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"tracks"}', + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, + { + name: "shout_likes", + checkConstraints: { + shout_likes_xata_id_length_xata_id: { + name: "shout_likes_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: { + shout_id_link: { + name: "shout_id_link", + columns: ["shout_id"], + referencedTable: "shouts", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + user_id_link: { + name: "user_id_link", + columns: ["user_id"], + referencedTable: "users", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + }, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_shout_likes_xata_id_key: { + name: "_pgroll_new_shout_likes_xata_id_key", + columns: ["xata_id"], + }, + shout_likes__pgroll_new_uri_key: { + name: "shout_likes__pgroll_new_uri_key", + columns: ["uri"], + }, + }, + columns: [ + { + name: "shout_id", + type: "link", + link: { table: "shouts" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"shouts"}', + }, + { + name: "uri", + type: "text", + notNull: true, + unique: true, + defaultValue: null, + comment: "", + }, + { + name: "user_id", + type: "link", + link: { table: "users" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"users"}', + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, + { + name: "shout_reports", + checkConstraints: { + shout_reports_xata_id_length_xata_id: { + name: "shout_reports_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: { + shout_id_link: { + name: "shout_id_link", + columns: ["shout_id"], + referencedTable: "shouts", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + user_id_link: { + name: "user_id_link", + columns: ["user_id"], + referencedTable: "users", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + }, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_shout_reports_xata_id_key: { + name: "_pgroll_new_shout_reports_xata_id_key", + columns: ["xata_id"], + }, + }, + columns: [ + { + name: "shout_id", + type: "link", + link: { table: "shouts" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"shouts"}', + }, + { + name: "user_id", + type: "link", + link: { table: "users" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"users"}', + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, + { + name: "shouts", + checkConstraints: { + shouts_xata_id_length_xata_id: { + name: "shouts_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: { + album_id_link: { + name: "album_id_link", + columns: ["album_id"], + referencedTable: "albums", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + artist_id_link: { + name: "artist_id_link", + columns: ["artist_id"], + referencedTable: "artists", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + parent_id_link: { + name: "parent_id_link", + columns: ["parent_id"], + referencedTable: "shouts", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + scrobble_id_link: { + name: "scrobble_id_link", + columns: ["scrobble_id"], + referencedTable: "scrobbles", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + track_id_link: { + name: "track_id_link", + columns: ["track_id"], + referencedTable: "tracks", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + user_id_link: { + name: "user_id_link", + columns: ["author_id"], + referencedTable: "users", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + }, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_shouts_xata_id_key: { + name: "_pgroll_new_shouts_xata_id_key", + columns: ["xata_id"], + }, + shouts__pgroll_new_uri_key: { + name: "shouts__pgroll_new_uri_key", + columns: ["uri"], + }, + }, + columns: [ + { + name: "album_id", + type: "link", + link: { table: "albums" }, + notNull: false, + unique: false, + defaultValue: null, + comment: '{"xata.link":"albums"}', + }, + { + name: "artist_id", + type: "link", + link: { table: "artists" }, + notNull: false, + unique: false, + defaultValue: null, + comment: '{"xata.link":"artists"}', + }, + { + name: "author_id", + type: "link", + link: { table: "users" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"users"}', + }, + { + name: "content", + type: "text", + notNull: true, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "parent_id", + type: "link", + link: { table: "shouts" }, + notNull: false, + unique: false, + defaultValue: null, + comment: '{"xata.link":"shouts"}', + }, + { + name: "scrobble_id", + type: "link", + link: { table: "scrobbles" }, + notNull: false, + unique: false, + defaultValue: null, + comment: '{"xata.link":"scrobbles"}', + }, + { + name: "track_id", + type: "link", + link: { table: "tracks" }, + notNull: false, + unique: false, + defaultValue: null, + comment: '{"xata.link":"tracks"}', + }, + { + name: "uri", + type: "text", + notNull: false, + unique: true, + defaultValue: null, + comment: "", + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, + { + name: "spotify_accounts", + checkConstraints: { + spotify_accounts_xata_id_length_xata_id: { + name: "spotify_accounts_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: { + user_id_link: { + name: "user_id_link", + columns: ["user_id"], + referencedTable: "users", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + }, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_spotify_accounts_xata_id_key: { + name: "_pgroll_new_spotify_accounts_xata_id_key", + columns: ["xata_id"], + }, + spotify_accounts__pgroll_new_email_key: { + name: "spotify_accounts__pgroll_new_email_key", + columns: ["email"], + }, + }, + columns: [ + { + name: "email", + type: "text", + notNull: true, + unique: true, + defaultValue: null, + comment: "", + }, + { + name: "is_beta_user", + type: "bool", + notNull: true, + unique: false, + defaultValue: "false", + comment: "", + }, + { + name: "user_id", + type: "link", + link: { table: "users" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"users"}', + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, + { + name: "spotify_tokens", + checkConstraints: { + spotify_tokens_xata_id_length_xata_id: { + name: "spotify_tokens_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: { + user_id_link: { + name: "user_id_link", + columns: ["user_id"], + referencedTable: "users", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + }, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_spotify_tokens_xata_id_key: { + name: "_pgroll_new_spotify_tokens_xata_id_key", + columns: ["xata_id"], + }, + }, + columns: [ + { + name: "access_token", + type: "text", + notNull: true, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "refresh_token", + type: "text", + notNull: true, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "user_id", + type: "link", + link: { table: "users" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"users"}', + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, + { + name: "tags", + checkConstraints: { + tags_xata_id_length_xata_id: { + name: "tags_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: {}, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_tags_xata_id_key: { + name: "_pgroll_new_tags_xata_id_key", + columns: ["xata_id"], + }, + tags__pgroll_new_name_key: { + name: "tags__pgroll_new_name_key", + columns: ["name"], + }, + }, + columns: [ + { + name: "name", + type: "text", + notNull: true, + unique: true, + defaultValue: null, + comment: "", + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, + { + name: "track_tags", + checkConstraints: { + track_tags_xata_id_length_xata_id: { + name: "track_tags_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: { + tag_id_link: { + name: "tag_id_link", + columns: ["tag_id"], + referencedTable: "tags", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + track_id_link: { + name: "track_id_link", + columns: ["track_id"], + referencedTable: "tracks", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + }, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_track_tags_xata_id_key: { + name: "_pgroll_new_track_tags_xata_id_key", + columns: ["xata_id"], + }, + }, + columns: [ + { + name: "tag_id", + type: "link", + link: { table: "tags" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"tags"}', + }, + { + name: "track_id", + type: "link", + link: { table: "tracks" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"tracks"}', + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, + { + name: "tracks", + checkConstraints: { + tracks_xata_id_length_xata_id: { + name: "tracks_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: {}, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_tracks_xata_id_key: { + name: "_pgroll_new_tracks_xata_id_key", + columns: ["xata_id"], + }, + tracks__pgroll_new_mb_id_key: { + name: "tracks__pgroll_new_mb_id_key", + columns: ["mb_id"], + }, + tracks__pgroll_new_sha256_key: { + name: "tracks__pgroll_new_sha256_key", + columns: ["sha256"], + }, + tracks__pgroll_new_uri_key: { + name: "tracks__pgroll_new_uri_key", + columns: ["uri"], + }, + tracks_tidal_link_unique: { + name: "tracks_tidal_link_unique", + columns: ["tidal_link"], + }, + tracks_youtube_link_unique: { + name: "tracks_youtube_link_unique", + columns: ["youtube_link"], + }, + }, + columns: [ + { + name: "album", + type: "text", + notNull: true, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "album_art", + type: "text", + notNull: false, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "album_artist", + type: "text", + notNull: true, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "album_uri", + type: "text", + notNull: false, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "apple_music_link", + type: "text", + notNull: false, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "artist", + type: "text", + notNull: true, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "artist_uri", + type: "text", + notNull: false, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "composer", + type: "text", + notNull: false, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "copyright_message", + type: "text", + notNull: false, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "disc_number", + type: "int", + notNull: false, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "duration", + type: "int", + notNull: false, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "genre", + type: "text", + notNull: false, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "label", + type: "text", + notNull: false, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "lastfm_link", + type: "text", + notNull: false, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "lyrics", + type: "text", + notNull: false, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "mb_id", + type: "text", + notNull: false, + unique: true, + defaultValue: null, + comment: "", + }, + { + name: "sha256", + type: "text", + notNull: true, + unique: true, + defaultValue: null, + comment: "", + }, + { + name: "spotify_link", + type: "text", + notNull: false, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "tidal_link", + type: "text", + notNull: false, + unique: true, + defaultValue: null, + comment: "", + }, + { + name: "title", + type: "text", + notNull: true, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "track_number", + type: "int", + notNull: false, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "uri", + type: "text", + notNull: false, + unique: true, + defaultValue: null, + comment: "", + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + { + name: "youtube_link", + type: "text", + notNull: false, + unique: true, + defaultValue: null, + comment: "", + }, + ], + }, + { + name: "user_albums", + checkConstraints: { + user_albums_xata_id_length_xata_id: { + name: "user_albums_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: { + album_id_link: { + name: "album_id_link", + columns: ["album_id"], + referencedTable: "albums", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + user_id_link: { + name: "user_id_link", + columns: ["user_id"], + referencedTable: "users", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + }, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_user_albums_xata_id_key: { + name: "_pgroll_new_user_albums_xata_id_key", + columns: ["xata_id"], + }, + }, + columns: [ + { + name: "album_id", + type: "link", + link: { table: "albums" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"albums"}', + }, + { + name: "scrobbles", + type: "int", + notNull: false, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "uri", + type: "text", + notNull: false, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "user_id", + type: "link", + link: { table: "users" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"users"}', + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, + { + name: "user_artists", + checkConstraints: { + user_artists_xata_id_length_xata_id: { + name: "user_artists_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: { + artist_id_link: { + name: "artist_id_link", + columns: ["artist_id"], + referencedTable: "artists", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + user_id_link: { + name: "user_id_link", + columns: ["user_id"], + referencedTable: "users", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + }, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_user_artists_xata_id_key: { + name: "_pgroll_new_user_artists_xata_id_key", + columns: ["xata_id"], + }, + }, + columns: [ + { + name: "artist_id", + type: "link", + link: { table: "artists" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"artists"}', + }, + { + name: "scrobbles", + type: "int", + notNull: false, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "uri", + type: "text", + notNull: true, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "user_id", + type: "link", + link: { table: "users" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"users"}', + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, + { + name: "user_playlists", + checkConstraints: { + user_playlists_xata_id_length_xata_id: { + name: "user_playlists_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: { + playlist_id_link: { + name: "playlist_id_link", + columns: ["playlist_id"], + referencedTable: "playlists", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + user_id_link: { + name: "user_id_link", + columns: ["user_id"], + referencedTable: "users", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + }, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_user_playlists_xata_id_key: { + name: "_pgroll_new_user_playlists_xata_id_key", + columns: ["xata_id"], + }, + user_playlists__pgroll_new_uri_key: { + name: "user_playlists__pgroll_new_uri_key", + columns: ["uri"], + }, + }, + columns: [ + { + name: "playlist_id", + type: "link", + link: { table: "playlists" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"playlists"}', + }, + { + name: "uri", + type: "text", + notNull: false, + unique: true, + defaultValue: null, + comment: "", + }, + { + name: "user_id", + type: "link", + link: { table: "users" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"users"}', + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, + { + name: "user_tracks", + checkConstraints: { + user_tracks_xata_id_length_xata_id: { + name: "user_tracks_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: { + track_id_link: { + name: "track_id_link", + columns: ["track_id"], + referencedTable: "tracks", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + user_id_link: { + name: "user_id_link", + columns: ["user_id"], + referencedTable: "users", + referencedColumns: ["xata_id"], + onDelete: "SET NULL", + }, + }, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_user_tracks_xata_id_key: { + name: "_pgroll_new_user_tracks_xata_id_key", + columns: ["xata_id"], + }, + }, + columns: [ + { + name: "scrobbles", + type: "int", + notNull: false, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "track_id", + type: "link", + link: { table: "tracks" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"tracks"}', + }, + { + name: "uri", + type: "text", + notNull: false, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "user_id", + type: "link", + link: { table: "users" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"users"}', + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, + { + name: "users", + checkConstraints: { + users_xata_id_length_xata_id: { + name: "users_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: {}, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_users_xata_id_key: { + name: "_pgroll_new_users_xata_id_key", + columns: ["xata_id"], + }, + users__pgroll_new_did_key: { + name: "users__pgroll_new_did_key", + columns: ["did"], + }, + users__pgroll_new_handle_key: { + name: "users__pgroll_new_handle_key", + columns: ["handle"], + }, + }, + columns: [ + { + name: "avatar", + type: "text", + notNull: true, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "did", + type: "text", + notNull: true, + unique: true, + defaultValue: null, + comment: "", + }, + { + name: "display_name", + type: "text", + notNull: true, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "handle", + type: "text", + notNull: true, + unique: true, + defaultValue: null, + comment: "", + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, + { + name: "webscrobblers", + checkConstraints: { + webscrobblers_xata_id_length_xata_id: { + name: "webscrobblers_xata_id_length_xata_id", + columns: ["xata_id"], + definition: "CHECK ((length(xata_id) < 256))", + }, + }, + foreignKeys: { + user_id_link: { + name: "user_id_link", + columns: ["user_id"], + referencedTable: "users", + referencedColumns: ["xata_id"], + onDelete: "CASCADE", + }, + }, + primaryKey: [], + uniqueConstraints: { + _pgroll_new_webscrobblers_xata_id_key: { + name: "_pgroll_new_webscrobblers_xata_id_key", + columns: ["xata_id"], + }, + webscrobblers__pgroll_new_uuid_key: { + name: "webscrobblers__pgroll_new_uuid_key", + columns: ["uuid"], + }, + }, + columns: [ + { + name: "description", + type: "text", + notNull: false, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "enabled", + type: "bool", + notNull: false, + unique: false, + defaultValue: "true", + comment: "", + }, + { + name: "name", + type: "text", + notNull: true, + unique: false, + defaultValue: null, + comment: "", + }, + { + name: "user_id", + type: "link", + link: { table: "users" }, + notNull: true, + unique: false, + defaultValue: null, + comment: '{"xata.link":"users"}', + }, + { + name: "uuid", + type: "text", + notNull: true, + unique: true, + defaultValue: null, + comment: "", + }, + { + name: "xata_createdat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_id", + type: "text", + notNull: true, + unique: true, + defaultValue: "('rec_'::text || (xata_private.xid())::text)", + comment: "", + }, + { + name: "xata_updatedat", + type: "datetime", + notNull: true, + unique: false, + defaultValue: "now()", + comment: "", + }, + { + name: "xata_version", + type: "int", + notNull: true, + unique: false, + defaultValue: "0", + comment: "", + }, + ], + }, +] as const; + +export type SchemaTables = typeof tables; +export type InferredTypes = SchemaInference; + +export type AlbumTags = InferredTypes["album_tags"]; +export type AlbumTagsRecord = AlbumTags & XataRecord; + +export type AlbumTracks = InferredTypes["album_tracks"]; +export type AlbumTracksRecord = AlbumTracks & XataRecord; + +export type Albums = InferredTypes["albums"]; +export type AlbumsRecord = Albums & XataRecord; + +export type ApiKeys = InferredTypes["api_keys"]; +export type ApiKeysRecord = ApiKeys & XataRecord; + +export type ArtistAlbums = InferredTypes["artist_albums"]; +export type ArtistAlbumsRecord = ArtistAlbums & XataRecord; + +export type ArtistTags = InferredTypes["artist_tags"]; +export type ArtistTagsRecord = ArtistTags & XataRecord; + +export type ArtistTracks = InferredTypes["artist_tracks"]; +export type ArtistTracksRecord = ArtistTracks & XataRecord; + +export type Artists = InferredTypes["artists"]; +export type ArtistsRecord = Artists & XataRecord; + +export type BuiltinStoragePaths = InferredTypes["builtin_storage_paths"]; +export type BuiltinStoragePathsRecord = BuiltinStoragePaths & XataRecord; + +export type Dropbox = InferredTypes["dropbox"]; +export type DropboxRecord = Dropbox & XataRecord; + +export type DropboxAccounts = InferredTypes["dropbox_accounts"]; +export type DropboxAccountsRecord = DropboxAccounts & XataRecord; + +export type DropboxPaths = InferredTypes["dropbox_paths"]; +export type DropboxPathsRecord = DropboxPaths & XataRecord; + +export type DropboxTokens = InferredTypes["dropbox_tokens"]; +export type DropboxTokensRecord = DropboxTokens & XataRecord; + +export type GoogleDrive = InferredTypes["google_drive"]; +export type GoogleDriveRecord = GoogleDrive & XataRecord; + +export type GoogleDriveAccounts = InferredTypes["google_drive_accounts"]; +export type GoogleDriveAccountsRecord = GoogleDriveAccounts & XataRecord; + +export type GoogleDrivePaths = InferredTypes["google_drive_paths"]; +export type GoogleDrivePathsRecord = GoogleDrivePaths & XataRecord; + +export type GoogleDriveTokens = InferredTypes["google_drive_tokens"]; +export type GoogleDriveTokensRecord = GoogleDriveTokens & XataRecord; + +export type LovedTracks = InferredTypes["loved_tracks"]; +export type LovedTracksRecord = LovedTracks & XataRecord; + +export type PlaybackState = InferredTypes["playback_state"]; +export type PlaybackStateRecord = PlaybackState & XataRecord; + +export type PlaylistTracks = InferredTypes["playlist_tracks"]; +export type PlaylistTracksRecord = PlaylistTracks & XataRecord; + +export type Playlists = InferredTypes["playlists"]; +export type PlaylistsRecord = Playlists & XataRecord; + +export type ProfileShouts = InferredTypes["profile_shouts"]; +export type ProfileShoutsRecord = ProfileShouts & XataRecord; + +export type QueueTracks = InferredTypes["queue_tracks"]; +export type QueueTracksRecord = QueueTracks & XataRecord; + +export type Radios = InferredTypes["radios"]; +export type RadiosRecord = Radios & XataRecord; + +export type S3Bucket = InferredTypes["s3_bucket"]; +export type S3BucketRecord = S3Bucket & XataRecord; + +export type S3Paths = InferredTypes["s3_paths"]; +export type S3PathsRecord = S3Paths & XataRecord; + +export type S3Tokens = InferredTypes["s3_tokens"]; +export type S3TokensRecord = S3Tokens & XataRecord; + +export type Scrobbles = InferredTypes["scrobbles"]; +export type ScrobblesRecord = Scrobbles & XataRecord; + +export type Sftp = InferredTypes["sftp"]; +export type SftpRecord = Sftp & XataRecord; + +export type SftpAccess = InferredTypes["sftp_access"]; +export type SftpAccessRecord = SftpAccess & XataRecord; + +export type SftpPath = InferredTypes["sftp_path"]; +export type SftpPathRecord = SftpPath & XataRecord; + +export type ShoutLikes = InferredTypes["shout_likes"]; +export type ShoutLikesRecord = ShoutLikes & XataRecord; + +export type ShoutReports = InferredTypes["shout_reports"]; +export type ShoutReportsRecord = ShoutReports & XataRecord; + +export type Shouts = InferredTypes["shouts"]; +export type ShoutsRecord = Shouts & XataRecord; + +export type SpotifyAccounts = InferredTypes["spotify_accounts"]; +export type SpotifyAccountsRecord = SpotifyAccounts & XataRecord; + +export type SpotifyTokens = InferredTypes["spotify_tokens"]; +export type SpotifyTokensRecord = SpotifyTokens & XataRecord; + +export type Tags = InferredTypes["tags"]; +export type TagsRecord = Tags & XataRecord; + +export type TrackTags = InferredTypes["track_tags"]; +export type TrackTagsRecord = TrackTags & XataRecord; + +export type Tracks = InferredTypes["tracks"]; +export type TracksRecord = Tracks & XataRecord; + +export type UserAlbums = InferredTypes["user_albums"]; +export type UserAlbumsRecord = UserAlbums & XataRecord; + +export type UserArtists = InferredTypes["user_artists"]; +export type UserArtistsRecord = UserArtists & XataRecord; + +export type UserPlaylists = InferredTypes["user_playlists"]; +export type UserPlaylistsRecord = UserPlaylists & XataRecord; + +export type UserTracks = InferredTypes["user_tracks"]; +export type UserTracksRecord = UserTracks & XataRecord; + +export type Users = InferredTypes["users"]; +export type UsersRecord = Users & XataRecord; + +export type Webscrobblers = InferredTypes["webscrobblers"]; +export type WebscrobblersRecord = Webscrobblers & XataRecord; + +export type DatabaseSchema = { + album_tags: AlbumTagsRecord; + album_tracks: AlbumTracksRecord; + albums: AlbumsRecord; + api_keys: ApiKeysRecord; + artist_albums: ArtistAlbumsRecord; + artist_tags: ArtistTagsRecord; + artist_tracks: ArtistTracksRecord; + artists: ArtistsRecord; + builtin_storage_paths: BuiltinStoragePathsRecord; + dropbox: DropboxRecord; + dropbox_accounts: DropboxAccountsRecord; + dropbox_paths: DropboxPathsRecord; + dropbox_tokens: DropboxTokensRecord; + google_drive: GoogleDriveRecord; + google_drive_accounts: GoogleDriveAccountsRecord; + google_drive_paths: GoogleDrivePathsRecord; + google_drive_tokens: GoogleDriveTokensRecord; + loved_tracks: LovedTracksRecord; + playback_state: PlaybackStateRecord; + playlist_tracks: PlaylistTracksRecord; + playlists: PlaylistsRecord; + profile_shouts: ProfileShoutsRecord; + queue_tracks: QueueTracksRecord; + radios: RadiosRecord; + s3_bucket: S3BucketRecord; + s3_paths: S3PathsRecord; + s3_tokens: S3TokensRecord; + scrobbles: ScrobblesRecord; + sftp: SftpRecord; + sftp_access: SftpAccessRecord; + sftp_path: SftpPathRecord; + shout_likes: ShoutLikesRecord; + shout_reports: ShoutReportsRecord; + shouts: ShoutsRecord; + spotify_accounts: SpotifyAccountsRecord; + spotify_tokens: SpotifyTokensRecord; + tags: TagsRecord; + track_tags: TrackTagsRecord; + tracks: TracksRecord; + user_albums: UserAlbumsRecord; + user_artists: UserArtistsRecord; + user_playlists: UserPlaylistsRecord; + user_tracks: UserTracksRecord; + users: UsersRecord; + webscrobblers: WebscrobblersRecord; +}; + +const DatabaseClient = buildClient(); + +const defaultOptions = { + databaseURL: + "https://Tsiry-Sandratraina-s-workspace-b1ficn.us-east-1.xata.sh/db/rocksky", +}; + +export class XataClient extends DatabaseClient { + constructor(options?: BaseClientOptions) { + super({ ...defaultOptions, ...options }, tables); + } +} + +let instance: XataClient | undefined = undefined; + +export const getXataClient = () => { + if (instance) return instance; + + instance = new XataClient(); + return instance; +}; diff --git a/apps/api/src/xrpc/app/rocksky/actor/getActorAlbums.ts b/apps/api/src/xrpc/app/rocksky/actor/getActorAlbums.ts new file mode 100644 index 00000000..11dd3a36 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/actor/getActorAlbums.ts @@ -0,0 +1,73 @@ +import { Context } from "context"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { QueryParams } from "lexicon/types/app/rocksky/actor/getActorAlbums"; +import { AlbumViewBasic } from "lexicon/types/app/rocksky/album/defs"; +import { deepCamelCaseKeys } from "lib"; + +export default function (server: Server, ctx: Context) { + const getActorAlbums = (params) => + pipe( + { params, ctx }, + retrieve, + Effect.flatMap(presentation), + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({ artists: [] }); + }) + ); + server.app.rocksky.actor.getActorAlbums({ + auth: ctx.authVerifier, + handler: async ({ params }) => { + const result = await Effect.runPromise(getActorAlbums(params)); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const retrieve = ({ + params, + ctx, +}: { + params: QueryParams; + ctx: Context; +}): Effect.Effect<{ data: Album[] }, Error> => { + return Effect.tryPromise({ + try: () => + ctx.analytics.post("library.getTopAlbums", { + user_did: params.did, + pagination: { + skip: params.offset || 0, + take: params.limit || 10, + }, + }), + catch: (error) => new Error(`Failed to retrieve albums: ${error}`), + }); +}; + +const presentation = ({ + data, +}: { + data: Album[]; +}): Effect.Effect<{ albums: AlbumViewBasic[] }, never> => { + return Effect.sync(() => ({ albums: deepCamelCaseKeys(data) })); +}; + +type Album = { + id: string; + uri: string; + title: string; + artist: string; + artist_uri: string; + year: number; + album_art: string; + release_date: string; + sha256: string; + play_count: number; + unique_listeners: number; +}; diff --git a/apps/api/src/xrpc/app/rocksky/actor/getActorArtists.ts b/apps/api/src/xrpc/app/rocksky/actor/getActorArtists.ts new file mode 100644 index 00000000..90162e67 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/actor/getActorArtists.ts @@ -0,0 +1,68 @@ +import { Context } from "context"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { QueryParams } from "lexicon/types/app/rocksky/actor/getActorArtists"; +import { ArtistViewBasic } from "lexicon/types/app/rocksky/artist/defs"; +import { deepCamelCaseKeys } from "lib"; + +export default function (server: Server, ctx: Context) { + const getActorArtists = (params) => + pipe( + { params, ctx }, + retrieve, + Effect.flatMap(presentation), + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({ artists: [] }); + }) + ); + server.app.rocksky.actor.getActorArtists({ + handler: async ({ params }) => { + const result = await Effect.runPromise(getActorArtists(params)); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const retrieve = ({ + params, + ctx, +}: { + params: QueryParams; + ctx: Context; +}): Effect.Effect<{ data: Artist[] }, Error> => { + return Effect.tryPromise({ + try: () => + ctx.analytics.post("library.getTopArtists", { + user_did: params.did, + pagination: { + skip: params.offset || 0, + take: params.limit || 10, + }, + }), + catch: (error) => new Error(`Failed to retrieve artists: ${error}`), + }); +}; + +const presentation = ({ + data, +}: { + data: Artist[]; +}): Effect.Effect<{ artists: ArtistViewBasic[] }, never> => { + return Effect.sync(() => ({ artists: deepCamelCaseKeys(data) })); +}; + +type Artist = { + id: string; + name: string; + picture: string; + play_count: number; + sha256: string; + unique_listeners: number; + uri: string; +}; diff --git a/apps/api/src/xrpc/app/rocksky/actor/getActorLovedSongs.ts b/apps/api/src/xrpc/app/rocksky/actor/getActorLovedSongs.ts new file mode 100644 index 00000000..00b2f9d2 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/actor/getActorLovedSongs.ts @@ -0,0 +1,76 @@ +import { Context } from "context"; +import { desc, eq, or } from "drizzle-orm"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { QueryParams } from "lexicon/types/app/rocksky/actor/getActorLovedSongs"; +import { SongViewBasic } from "lexicon/types/app/rocksky/song/defs"; +import tables from "schema"; +import { SelectTrack } from "schema/tracks"; + +export default function (server: Server, ctx: Context) { + const getActorLovedSongs = (params) => + pipe( + { params, ctx }, + retrieve, + Effect.flatMap(presentation), + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({ tracks: [] }); + }) + ); + server.app.rocksky.actor.getActorLovedSongs({ + handler: async ({ params }) => { + const result = await Effect.runPromise(getActorLovedSongs(params)); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const retrieve = ({ + params, + ctx, +}: { + params: QueryParams; + ctx: Context; +}): Effect.Effect => { + return Effect.tryPromise({ + try: () => + ctx.db + .select() + .from(tables.lovedTracks) + .leftJoin( + tables.tracks, + eq(tables.lovedTracks.trackId, tables.tracks.id) + ) + .leftJoin(tables.users, eq(tables.lovedTracks.userId, tables.users.id)) + .where( + or( + eq(tables.users.did, params.did), + eq(tables.users.handle, params.did) + ) + ) + .limit(params.limit ?? 10) + .offset(params.offset ?? 0) + .orderBy(desc(tables.lovedTracks.createdAt)) + .execute() + .then((rows) => rows.map((row) => row.tracks)), + catch: (error) => new Error(`Failed to retrieve loved songs: ${error}`), + }); +}; + +const presentation = ( + data: SelectTrack[] +): Effect.Effect<{ tracks: SongViewBasic[] }, never> => { + return Effect.sync(() => ({ + tracks: data.map((track) => ({ + ...track, + createdAt: track.createdAt.toISOString(), + updatedAt: track.updatedAt.toISOString(), + })), + })); +}; diff --git a/apps/api/src/xrpc/app/rocksky/actor/getActorPlaylists.ts b/apps/api/src/xrpc/app/rocksky/actor/getActorPlaylists.ts new file mode 100644 index 00000000..e7d87f87 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/actor/getActorPlaylists.ts @@ -0,0 +1,100 @@ +import { Context } from "context"; +import { eq, or, sql } from "drizzle-orm"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { QueryParams } from "lexicon/types/app/rocksky/actor/getActorPlaylists"; +import { PlaylistViewBasic } from "lexicon/types/app/rocksky/playlist/defs"; +import tables from "schema"; +import { SelectPlaylist } from "schema/playlists"; + +export default function (server: Server, ctx: Context) { + const getActorPlaylists = (params) => + pipe( + { params, ctx }, + retrieve, + Effect.flatMap(presentation), + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({ playlists: [] }); + }) + ); + server.app.rocksky.actor.getActorPlaylists({ + handler: async ({ params }) => { + const result = await Effect.runPromise(getActorPlaylists(params)); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const retrieve = ({ + params, + ctx, +}: { + params: QueryParams; + ctx: Context; +}): Effect.Effect => { + return Effect.tryPromise({ + try: () => + ctx.db + .select({ + users: tables.users, + playlists: tables.playlists, + trackCount: sql` + (SELECT COUNT(*) + FROM ${tables.playlistTracks} + WHERE ${tables.playlistTracks.playlistId} = ${tables.playlists.id} + )`.as("trackCount"), + }) + .from(tables.playlists) + .leftJoin(tables.users, eq(tables.playlists.createdBy, tables.users.id)) + .where( + or( + eq(tables.users.did, params.did), + eq(tables.users.handle, params.did) + ) + ) + .offset(params.offset) + .limit(params.limit) + .execute() + .then((rows) => + rows.map((row) => ({ + ...row.playlists, + trackCount: row.trackCount, + title: row.playlists.name, + coverImageUrl: row.playlists.picture, + curatorDId: row.users.did, + curatorName: row.users.displayName, + curatorAvatarUrl: row.users.avatar, + curatorHandle: row.users.handle, + })) + ), + catch: (error) => new Error(`Failed to retrieve user playlists: ${error}`), + }); +}; + +const presentation = ( + playlists: Playlist[] +): Effect.Effect<{ playlists: PlaylistViewBasic[] }, never> => { + return Effect.sync(() => ({ + playlists: playlists.map((playlist) => ({ + ...playlist, + createdAt: playlist.createdAt.toISOString(), + updatedAt: playlist.updatedAt.toISOString(), + })), + })); +}; + +type Playlist = SelectPlaylist & { + trackCount: number; + title: string; + coverImageUrl: string; + curatorDId: string; + curatorName: string; + curatorAvatarUrl: string; + curatorHandle: string; +}; diff --git a/apps/api/src/xrpc/app/rocksky/actor/getActorScrobbles.ts b/apps/api/src/xrpc/app/rocksky/actor/getActorScrobbles.ts new file mode 100644 index 00000000..12e3f359 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/actor/getActorScrobbles.ts @@ -0,0 +1,76 @@ +import { Context } from "context"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { QueryParams } from "lexicon/types/app/rocksky/actor/getActorScrobbles"; +import { ScrobbleViewBasic } from "lexicon/types/app/rocksky/scrobble/defs"; +import { deepCamelCaseKeys } from "lib"; + +export default function (server: Server, ctx: Context) { + const getActorScrobbles = (params) => + pipe( + { params, ctx }, + retrieve, + Effect.flatMap(presentation), + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({ scrobbles: [] }); + }) + ); + server.app.rocksky.actor.getActorScrobbles({ + handler: async ({ params }) => { + const result = await Effect.runPromise(getActorScrobbles(params)); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const retrieve = ({ + params, + ctx, +}: { + params: QueryParams; + ctx: Context; +}): Effect.Effect<{ data: Scrobble[] }, Error> => { + return Effect.tryPromise({ + try: () => + ctx.analytics.post("library.getScrobbles", { + user_did: params.did, + pagination: { + skip: params.offset, + take: params.limit, + }, + }), + catch: (error) => new Error(`Failed to retrieve artists: ${error}`), + }); +}; + +const presentation = ({ + data, +}: { + data: Scrobble[]; +}): Effect.Effect<{ scrobbles: ScrobbleViewBasic[] }, never> => { + return Effect.sync(() => ({ scrobbles: deepCamelCaseKeys(data) })); +}; + +type Scrobble = { + id: string; + track_id: string; + title: string; + artist: string; + album_artist: string; + album_art: string; + album: string; + handle: string; + did: string; + avatar: string | null; + uri: string; + track_uri: string; + artist_uri: string; + album_uri: string; + created_at: string; +}; diff --git a/apps/api/src/xrpc/app/rocksky/actor/getActorSongs.ts b/apps/api/src/xrpc/app/rocksky/actor/getActorSongs.ts new file mode 100644 index 00000000..d2aabc08 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/actor/getActorSongs.ts @@ -0,0 +1,78 @@ +import { Context } from "context"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { QueryParams } from "lexicon/types/app/rocksky/actor/getActorSongs"; +import { SongViewBasic } from "lexicon/types/app/rocksky/song/defs"; +import { deepCamelCaseKeys } from "lib"; + +export default function (server: Server, ctx: Context) { + const getActorSongs = (params) => + pipe( + { params, ctx }, + retrieve, + Effect.flatMap(presentation), + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({ tracks: [] }); + }) + ); + server.app.rocksky.actor.getActorSongs({ + handler: async ({ params }) => { + const result = await Effect.runPromise(getActorSongs(params)); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const retrieve = ({ + params, + ctx, +}: { + params: QueryParams; + ctx: Context; +}): Effect.Effect<{ data: Track[] }, Error> => { + return Effect.tryPromise({ + try: () => + ctx.analytics.post("library.getTopTracks", { + user_did: params.did, + pagination: { + skip: params.offset || 0, + take: params.limit || 10, + }, + }), + catch: (error) => new Error(`Failed to retrieve tracks: ${error}`), + }); +}; + +const presentation = ({ + data, +}: { + data: Track[]; +}): Effect.Effect<{ tracks: SongViewBasic[] }, never> => { + return Effect.sync(() => ({ tracks: deepCamelCaseKeys(data) })); +}; + +type Track = { + id: string; + uri: string; + unique_listeners: number; + play_count: number; + title: string; + artist: string; + artist_uri: string; + album: string; + album_uri: string; + album_art: string; + album_artist: string; + copyright_message: string; + disc_number: number; + duration: number; + sha256: string; + track_number: number; + created_at: string; +}; diff --git a/apps/api/src/xrpc/app/rocksky/actor/getProfile.ts b/apps/api/src/xrpc/app/rocksky/actor/getProfile.ts new file mode 100644 index 00000000..92ae8da4 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/actor/getProfile.ts @@ -0,0 +1,238 @@ +import { Agent, AtpAgent } from "@atproto/api"; +import { OutputSchema } from "@atproto/api/dist/client/types/com/atproto/repo/getRecord"; +import { HandlerAuth } from "@atproto/xrpc-server"; +import { Context } from "context"; +import { eq } from "drizzle-orm"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { ProfileViewDetailed } from "lexicon/types/app/rocksky/actor/defs"; +import { QueryParams } from "lexicon/types/app/rocksky/actor/getProfile"; +import { createAgent } from "lib/agent"; +import _ from "lodash"; +import tables from "schema"; +import { SelectUser } from "schema/users"; + +export default function (server: Server, ctx: Context) { + const getActorProfile = (params, auth: HandlerAuth) => + pipe( + { params, ctx, did: auth.credentials?.did }, + resolveHandleToDid, + Effect.flatMap(withServiceEndpoint), + Effect.flatMap(withAgent), + Effect.flatMap(withUser), + Effect.flatMap(retrieveProfile), + Effect.flatMap(refreshProfile), + Effect.flatMap(presentation), + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({}); + }) + ); + server.app.rocksky.actor.getProfile({ + auth: ctx.authVerifier, + handler: async ({ params, auth }) => { + const result = await Effect.runPromise(getActorProfile(params, auth)); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const resolveHandleToDid = ({ + params, + ctx, + did, +}: { + params: QueryParams; + ctx: Context; + did?: string; +}): Effect.Effect< + { did?: string; ctx: Context; params: QueryParams }, + Error +> => { + return Effect.tryPromise({ + try: async () => { + if (!params.did?.startsWith("did:plc:") && !!params.did) { + return fetch( + `https://dns.google/resolve?name=_atproto.${params.did}&type=TXT` + ) + .then((res) => res.json()) + .then( + (data) => + _.get(data, "Answer.0.data", "").replace(/"/g, "").split("=")[1] + ) + .then((did) => ({ + did, + ctx, + params, + })); + } + return { + did: params.did || did, + ctx, + params, + }; + }, + catch: (error) => new Error(`Failed to resolve handle to DID: ${error}`), + }); +}; + +const withServiceEndpoint = ({ + params, + ctx, + did, +}: { + params: QueryParams; + ctx: Context; + did?: string; +}): Effect.Effect => { + return Effect.tryPromise({ + try: async () => { + if (params.did) { + return fetch(`https://plc.directory/${did}`) + .then((res) => res.json()) + .then((data) => ({ + did, + serviceEndpoint: _.get(data, "service.0.serviceEndpoint"), + ctx, + params, + })); + } + return { + did, + ctx, + params, + }; + }, + catch: (error) => new Error(`Failed to get service endpoint: ${error}`), + }); +}; + +const withAgent = ({ + params, + ctx, + did, + serviceEndpoint, +}: WithServiceEndpoint): Effect.Effect => + Effect.tryPromise({ + try: async () => { + return { + ctx, + did, + params, + agent: serviceEndpoint + ? new AtpAgent({ service: serviceEndpoint }) + : await createAgent(ctx.oauthClient, did), + }; + }, + catch: (error) => new Error(`Failed to create agent: ${error}`), + }); + +const withUser = ({ + params, + ctx, + did, + agent, +}: WithAgent): Effect.Effect => { + return Effect.tryPromise({ + try: async () => + ctx.db + .select() + .from(tables.users) + .where(eq(tables.users.did, did)) + .execute() + .then((users) => ({ + user: users[0], + ctx, + params, + did, + agent, + })), + catch: (error) => new Error(`Failed to retrieve current user: ${error}`), + }); +}; + +const retrieveProfile = ({ + ctx, + did, + agent, + user, +}: WithUser): Effect.Effect<[Profile, string], Error> => { + return Effect.tryPromise({ + try: async () => { + return Promise.all([ + agent.com.atproto.repo + .getRecord({ + repo: did, + collection: "app.bsky.actor.profile", + rkey: "self", + }) + .then(({ data }) => ({ + profileRecord: data, + ctx, + did, + user, + })), + ctx.resolver.resolveDidToHandle(did), + ]); + }, + catch: (error) => new Error(`Failed to retrieve profile: ${error}`), + }); +}; + +const refreshProfile = ([profile, handle]: [Profile, string]) => { + return Effect.tryPromise({ + try: async () => { + return [profile, handle]; + }, + catch: (error) => new Error(`Failed to refresh profile: ${error}`), + }); +}; + +const presentation = ([profile, handle]: [Profile, string]): Effect.Effect< + ProfileViewDetailed, + never +> => { + return Effect.sync(() => ({ + id: profile.user?.id, + did: profile.did, + handle, + displayName: _.get(profile, "profileRecord.value.displayName"), + avatar: `https://cdn.bsky.app/img/avatar/plain/${profile.did}/${_.get(profile, "profileRecord.value.avatar.ref", "").toString()}@jpeg`, + createdAt: profile.user?.createdAt.toISOString(), + updatedAt: profile.user?.updatedAt.toISOString(), + })); +}; + +type Profile = { + profileRecord: OutputSchema; + ctx: Context; + did: string; + user?: SelectUser; +}; + +type WithServiceEndpoint = { + params: QueryParams; + ctx: Context; + did?: string; + serviceEndpoint?: string; +}; + +type WithAgent = { + ctx: Context; + did?: string; + params: QueryParams; + agent: Agent | AtpAgent; +}; + +type WithUser = { + user?: SelectUser; + ctx: Context; + params: QueryParams; + did?: string; + agent: Agent | AtpAgent; +}; diff --git a/apps/api/src/xrpc/app/rocksky/album/getAlbum.ts b/apps/api/src/xrpc/app/rocksky/album/getAlbum.ts new file mode 100644 index 00000000..70a56f36 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/album/getAlbum.ts @@ -0,0 +1,110 @@ +import { Context } from "context"; +import { asc, count, eq, or } from "drizzle-orm"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { AlbumViewDetailed } from "lexicon/types/app/rocksky/album/defs"; +import { QueryParams } from "lexicon/types/app/rocksky/album/getAlbum"; +import { dedupeTracksKeepLyrics } from "lib"; +import * as R from "ramda"; +import tables from "schema"; +import { SelectAlbum } from "schema/albums"; +import { SelectTrack } from "schema/tracks"; + +export default function (server: Server, ctx: Context) { + const getAlbum = (params) => + pipe( + { params, ctx }, + retrieve, + Effect.flatMap(presentation), + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({}); + }) + ); + server.app.rocksky.album.getAlbum({ + handler: async ({ params }) => { + const result = await Effect.runPromise(getAlbum(params)); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const retrieve = ({ params, ctx }: { params: QueryParams; ctx: Context }) => { + return Effect.tryPromise({ + try: async () => { + const album = await ctx.db + .select() + .from(tables.userAlbums) + .leftJoin( + tables.albums, + eq(tables.userAlbums.albumId, tables.albums.id) + ) + .where( + or( + eq(tables.userAlbums.uri, params.uri), + eq(tables.albums.uri, params.uri) + ) + ) + .execute() + .then((rows) => rows[0]?.albums); + return Promise.all([ + Promise.resolve(album), + ctx.db + .select() + .from(tables.albumTracks) + .leftJoin( + tables.tracks, + eq(tables.albumTracks.trackId, tables.tracks.id) + ) + .where(eq(tables.albumTracks.albumId, album.id)) + .orderBy( + asc(tables.tracks.discNumber), + asc(tables.tracks.trackNumber) + ) + .execute() + .then((rows) => rows.map((data) => data.tracks)) + .then(dedupeTracksKeepLyrics) + .then((tracks) => + tracks.map((track) => ({ + ...R.omit(["lyrics"], track), + createdAt: track.createdAt.toISOString(), + updatedAt: track.updatedAt.toISOString(), + })) + ), + ctx.db + .select({ count: count() }) + .from(tables.userAlbums) + .where(eq(tables.userAlbums.albumId, album?.id)) + .execute() + .then((rows) => rows[0]?.count || 0), + ctx.db + .select({ count: count() }) + .from(tables.scrobbles) + .where(eq(tables.scrobbles.albumId, album?.id)) + .execute() + .then((rows) => rows[0]?.count || 0), + ]); + }, + catch: (error) => new Error(`Failed to retrieve album: ${error}`), + }); +}; + +const presentation = ([album, tracks, uniqueListeners, playCount]: [ + SelectAlbum, + SelectTrack[], + number, + number, +]): Effect.Effect => { + return Effect.sync(() => ({ + ...album, + tracks, + playCount, + uniqueListeners, + createdAt: album.createdAt.toISOString(), + })); +}; diff --git a/apps/api/src/xrpc/app/rocksky/album/getAlbumTracks.ts b/apps/api/src/xrpc/app/rocksky/album/getAlbumTracks.ts new file mode 100644 index 00000000..a289abc7 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/album/getAlbumTracks.ts @@ -0,0 +1,73 @@ +import { Context } from "context"; +import { asc, eq } from "drizzle-orm"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { QueryParams } from "lexicon/types/app/rocksky/album/getAlbumTracks"; +import { SongViewBasic } from "lexicon/types/app/rocksky/song/defs"; +import { dedupeTracksKeepLyrics } from "lib"; +import * as R from "ramda"; +import tables from "schema"; + +export default function (server: Server, ctx: Context) { + const getAlbumTracks = (params) => + pipe( + { params, ctx }, + retrieve, + Effect.flatMap(presentation), + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({}); + }) + ); + server.app.rocksky.album.getAlbumTracks({ + handler: async ({ params }) => { + const result = await Effect.runPromise(getAlbumTracks(params)); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const retrieve = ({ params, ctx }: { params: QueryParams; ctx: Context }) => { + return Effect.tryPromise({ + try: async () => + ctx.db + .select() + .from(tables.albumTracks) + .leftJoin( + tables.tracks, + eq(tables.albumTracks.trackId, tables.tracks.id) + ) + .leftJoin( + tables.albums, + eq(tables.albumTracks.albumId, tables.albums.id) + ) + .leftJoin( + tables.userAlbums, + eq(tables.albums.id, tables.userAlbums.albumId) + ) + .where(eq(tables.userAlbums.uri, params.uri)) + .orderBy(asc(tables.tracks.discNumber), asc(tables.tracks.trackNumber)) + .execute() + .then((rows) => rows.map((data) => data.tracks)) + .then(dedupeTracksKeepLyrics) + .then((tracks) => + tracks.map((track) => ({ + ...R.omit(["lyrics"], track), + createdAt: track.createdAt.toISOString(), + updatedAt: track.updatedAt.toISOString(), + })) + ), + catch: (error) => new Error(`Failed to retrieve album tracks: ${error}`), + }); +}; + +const presentation = ( + tracks +): Effect.Effect<{ tracks: SongViewBasic[] }, never> => { + return Effect.sync(() => ({ tracks })); +}; diff --git a/apps/api/src/xrpc/app/rocksky/album/getAlbums.ts b/apps/api/src/xrpc/app/rocksky/album/getAlbums.ts new file mode 100644 index 00000000..4e3e661e --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/album/getAlbums.ts @@ -0,0 +1,71 @@ +import { Context } from "context"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { AlbumViewBasic } from "lexicon/types/app/rocksky/album/defs"; +import { QueryParams } from "lexicon/types/app/rocksky/album/getAlbums"; +import { deepCamelCaseKeys } from "lib"; + +export default function (server: Server, ctx: Context) { + const getAlbums = (params) => + pipe( + { params, ctx }, + retrieve, + Effect.flatMap(presentation), + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({ albums: [] }); + }) + ); + server.app.rocksky.album.getAlbums({ + handler: async ({ params }) => { + const result = await Effect.runPromise(getAlbums(params)); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const retrieve = ({ + params, + ctx, +}: { + params: QueryParams; + ctx: Context; +}): Effect.Effect<{ data: Album[] }, Error> => { + return Effect.tryPromise({ + try: () => + ctx.analytics.post("library.getAlbums", { + pagination: { + skip: params.offset || 0, + take: params.limit || 100, + }, + }), + catch: (error) => new Error(`Failed to retrieve albums: ${error}`), + }); +}; + +const presentation = ({ + data, +}: { + data: Album[]; +}): Effect.Effect<{ albums: AlbumViewBasic[] }, never> => { + return Effect.sync(() => ({ albums: deepCamelCaseKeys(data) })); +}; + +type Album = { + id: string; + uri: string; + title: string; + artist: string; + artist_uri: string; + year: number; + album_art: string; + release_date: string; + sha256: string; + play_count: number; + unique_listeners: number; +}; diff --git a/apps/api/src/xrpc/app/rocksky/apikey/createApikey.ts b/apps/api/src/xrpc/app/rocksky/apikey/createApikey.ts new file mode 100644 index 00000000..aef8dcec --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/apikey/createApikey.ts @@ -0,0 +1,63 @@ +import { HandlerAuth } from "@atproto/xrpc-server"; +import { Context } from "context"; +import { eq } from "drizzle-orm"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { InputSchema } from "lexicon/types/app/rocksky/apikey/createApikey"; +import tables from "schema"; + +export default function (server: Server, ctx: Context) { + const createApikey = (input: InputSchema, auth: HandlerAuth) => + pipe( + input, + create, + presentation, + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({}); + }) + ); + server.app.rocksky.apikey.createApikey({ + auth: ctx.authVerifier, + handler: async ({ input, auth }) => { + const result = await Effect.runPromise(createApikey(input.body, auth)); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const getCurrentUser = ({ + params, + ctx, + did, +}: { + params: InputSchema; + ctx: Context; + did?: string; +}) => { + return Effect.tryPromise({ + try: async () => + ctx.db + .select() + .from(tables.users) + .where(eq(tables.users.did, did)) + .execute() + .then((users) => ({ user: users[0], ctx, params })), + catch: (error) => new Error(`Failed to retrieve current user: ${error}`), + }); +}; + +const create = () => { + // Logic to create an API key + return {}; +}; + +const presentation = () => { + // Logic to format the API key for presentation + return Effect.sync(() => ({})); +}; diff --git a/apps/api/src/xrpc/app/rocksky/apikey/getApikeys.ts b/apps/api/src/xrpc/app/rocksky/apikey/getApikeys.ts new file mode 100644 index 00000000..d29ceaff --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/apikey/getApikeys.ts @@ -0,0 +1,41 @@ +import { HandlerAuth } from "@atproto/xrpc-server"; +import { Context } from "context"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; + +export default function (server: Server, ctx: Context) { + const getApikeys = (params, auth: HandlerAuth) => + pipe( + params, + retrieve, + presentation, + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({}); + }) + ); + server.app.rocksky.apikey.getApikeys({ + auth: ctx.authVerifier, + handler: async ({ params, auth }) => { + const result = await Effect.runPromise(getApikeys(params, auth)); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const retrieve = () => { + // Logic to retrieve API keys + return []; +}; + +const presentation = (apikeys) => { + // Logic to format the API keys for presentation + return Effect.sync(() => ({ + apikeys: [], + })); +}; diff --git a/apps/api/src/xrpc/app/rocksky/apikey/removeApikey.ts b/apps/api/src/xrpc/app/rocksky/apikey/removeApikey.ts new file mode 100644 index 00000000..7ae5b4cc --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/apikey/removeApikey.ts @@ -0,0 +1,63 @@ +import { HandlerAuth } from "@atproto/xrpc-server"; +import { Context } from "context"; +import { eq } from "drizzle-orm"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { QueryParams } from "lexicon/types/app/rocksky/apikey/removeApikey"; +import tables from "schema"; + +export default function (server: Server, ctx: Context) { + const removeApikey = (params, auth: HandlerAuth) => + pipe( + params, + remove, + presentation, + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({}); + }) + ); + server.app.rocksky.apikey.removeApikey({ + auth: ctx.authVerifier, + handler: async ({ params, auth }) => { + const result = await Effect.runPromise(removeApikey(params, auth)); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const withUser = ({ + params, + ctx, + did, +}: { + params: QueryParams; + ctx: Context; + did?: string; +}) => { + return Effect.tryPromise({ + try: async () => + ctx.db + .select() + .from(tables.users) + .where(eq(tables.users.did, did)) + .execute() + .then((users) => ({ user: users[0], ctx, params })), + catch: (error) => new Error(`Failed to retrieve current user: ${error}`), + }); +}; + +const remove = () => { + // Logic to remove the API key + return {}; +}; + +const presentation = () => { + // Logic to format the response for presentation + return Effect.sync(() => ({})); +}; diff --git a/apps/api/src/xrpc/app/rocksky/apikey/updateApikey.ts b/apps/api/src/xrpc/app/rocksky/apikey/updateApikey.ts new file mode 100644 index 00000000..2a8a6cb4 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/apikey/updateApikey.ts @@ -0,0 +1,62 @@ +import { Context } from "context"; +import { eq } from "drizzle-orm"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { InputSchema } from "lexicon/types/app/rocksky/apikey/updateApikey"; +import tables from "schema"; + +export default function (server: Server, ctx: Context) { + const updateApikey = (input: InputSchema, auth) => + pipe( + input, + update, + presentation, + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({}); + }) + ); + server.app.rocksky.apikey.updateApikey({ + auth: ctx.authVerifier, + handler: async ({ input, auth }) => { + const result = await Effect.runPromise(updateApikey(input.body, auth)); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const withUser = ({ + params, + ctx, + did, +}: { + params: InputSchema; + ctx: Context; + did?: string; +}) => { + return Effect.tryPromise({ + try: async () => + ctx.db + .select() + .from(tables.users) + .where(eq(tables.users.did, did)) + .execute() + .then((users) => ({ user: users[0], ctx, params })), + catch: (error) => new Error(`Failed to retrieve current user: ${error}`), + }); +}; + +const update = () => { + // Logic to update the API key + return {}; +}; + +const presentation = () => { + // Logic to format the updated API key for presentation + return Effect.sync(() => ({})); +}; diff --git a/apps/api/src/xrpc/app/rocksky/artist/getArtist.ts b/apps/api/src/xrpc/app/rocksky/artist/getArtist.ts new file mode 100644 index 00000000..457c3db5 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/artist/getArtist.ts @@ -0,0 +1,86 @@ +import { Context } from "context"; +import { count, eq, or } from "drizzle-orm"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { ArtistViewDetailed } from "lexicon/types/app/rocksky/artist/defs"; +import { QueryParams } from "lexicon/types/app/rocksky/artist/getArtist"; +import tables from "schema"; +import { SelectArtist } from "schema/artists"; + +export default function (server: Server, ctx: Context) { + const getArtist = (params) => + pipe( + { params, ctx }, + retrieve, + Effect.flatMap(presentation), + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({}); + }) + ); + server.app.rocksky.artist.getArtist({ + handler: async ({ params }) => { + const result = await Effect.runPromise(getArtist(params)); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const retrieve = ({ params, ctx }: { params: QueryParams; ctx: Context }) => { + return Effect.tryPromise({ + try: async () => { + const artist = await ctx.db + .select() + .from(tables.userArtists) + .leftJoin( + tables.artists, + eq(tables.userArtists.artistId, tables.artists.id) + ) + .where( + or( + eq(tables.userArtists.uri, params.uri), + eq(tables.artists.uri, params.uri) + ) + ) + .execute() + .then(([row]) => row?.artists); + return Promise.all([ + Promise.resolve(artist), + ctx.db + .select({ + count: count(), + }) + .from(tables.userArtists) + .where(eq(tables.userArtists.artistId, artist?.id)) + .execute() + .then((rows) => rows[0]?.count || 0), + ctx.db + .select({ count: count() }) + .from(tables.scrobbles) + .where(eq(tables.scrobbles.artistId, artist?.id)) + .execute() + .then((rows) => rows[0]?.count || 0), + ]); + }, + catch: (error) => new Error(`Failed to retrieve artist: ${error}`), + }); +}; + +const presentation = ([artist, uniqueListeners, playCount]: [ + SelectArtist, + number, + number, +]): Effect.Effect => { + return Effect.sync(() => ({ + ...artist, + playCount, + uniqueListeners, + createdAt: artist.createdAt.toISOString(), + updatedAt: artist.updatedAt.toISOString(), + })); +}; diff --git a/apps/api/src/xrpc/app/rocksky/artist/getArtistAlbums.ts b/apps/api/src/xrpc/app/rocksky/artist/getArtistAlbums.ts new file mode 100644 index 00000000..28b03f14 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/artist/getArtistAlbums.ts @@ -0,0 +1,68 @@ +import { Context } from "context"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { AlbumViewBasic } from "lexicon/types/app/rocksky/album/defs"; +import { QueryParams } from "lexicon/types/app/rocksky/artist/getArtistAlbums"; +import { deepCamelCaseKeys } from "lib"; + +export default function (server: Server, ctx: Context) { + const getArtistAlbums = (params) => + pipe( + { params, ctx }, + retrieve, + Effect.flatMap(presentation), + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({ albums: [] }); + }) + ); + server.app.rocksky.artist.getArtistAlbums({ + handler: async ({ params }) => { + const result = await Effect.runPromise(getArtistAlbums(params)); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const retrieve = ({ + params, + ctx, +}: { + params: QueryParams; + ctx: Context; +}): Effect.Effect<{ data: Album[] }, Error> => { + return Effect.tryPromise({ + try: () => + ctx.analytics.post("library.getArtistAlbums", { + artist_id: params.uri, + }), + catch: (error) => new Error(`Failed to retrieve artist's albums: ${error}`), + }); +}; + +const presentation = ({ + data, +}: { + data: Album[]; +}): Effect.Effect<{ albums: AlbumViewBasic[] }, never> => { + return Effect.sync(() => ({ albums: deepCamelCaseKeys(data) })); +}; + +type Album = { + id: string; + uri: string; + title: string; + artist: string; + artist_uri: string; + year: number; + album_art: string; + release_date: string; + sha256: string; + play_count: number; + unique_listeners: number; +}; diff --git a/apps/api/src/xrpc/app/rocksky/artist/getArtistTracks.ts b/apps/api/src/xrpc/app/rocksky/artist/getArtistTracks.ts new file mode 100644 index 00000000..d3cde319 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/artist/getArtistTracks.ts @@ -0,0 +1,78 @@ +import { Context } from "context"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { QueryParams } from "lexicon/types/app/rocksky/artist/getArtistTracks"; +import { SongViewBasic } from "lexicon/types/app/rocksky/song/defs"; +import { deepCamelCaseKeys } from "lib"; + +export default function (server: Server, ctx: Context) { + const getArtistTracks = (params) => + pipe( + { params, ctx }, + retrieve, + Effect.flatMap(presentation), + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({ tracks: [] }); + }) + ); + server.app.rocksky.artist.getArtistTracks({ + handler: async ({ params }) => { + const result = await Effect.runPromise(getArtistTracks(params)); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const retrieve = ({ + params, + ctx, +}: { + params: QueryParams; + ctx: Context; +}): Effect.Effect<{ data: Track[] }, Error> => { + return Effect.tryPromise({ + try: () => + ctx.analytics.post("library.getArtistTracks", { + artist_id: params.uri, + pagination: { + skip: params.offset || 0, + take: params.limit || 100, + }, + }), + catch: (error) => new Error(`Failed to retrieve artist's tracks: ${error}`), + }); +}; + +const presentation = ({ + data, +}: { + data: Track[]; +}): Effect.Effect<{ tracks: SongViewBasic[] }, never> => { + return Effect.sync(() => ({ tracks: deepCamelCaseKeys(data) })); +}; + +type Track = { + id: string; + uri: string; + unique_listeners: number; + play_count: number; + title: string; + artist: string; + artist_uri: string; + album: string; + album_uri: string; + album_art: string; + album_artist: string; + copyright_message: string; + disc_number: number; + duration: number; + sha256: string; + track_number: number; + created_at: string; +}; diff --git a/apps/api/src/xrpc/app/rocksky/artist/getArtists.ts b/apps/api/src/xrpc/app/rocksky/artist/getArtists.ts new file mode 100644 index 00000000..4ac98e69 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/artist/getArtists.ts @@ -0,0 +1,67 @@ +import { Context } from "context"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { ArtistViewBasic } from "lexicon/types/app/rocksky/artist/defs"; +import { QueryParams } from "lexicon/types/app/rocksky/artist/getArtists"; +import { deepCamelCaseKeys } from "lib"; + +export default function (server: Server, ctx: Context) { + const getArtists = (params) => + pipe( + { params, ctx }, + retrieve, + Effect.flatMap(presentation), + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({ artists: [] }); + }) + ); + server.app.rocksky.artist.getArtists({ + handler: async ({ params }) => { + const result = await Effect.runPromise(getArtists(params)); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const retrieve = ({ + params, + ctx, +}: { + params: QueryParams; + ctx: Context; +}): Effect.Effect<{ data: Artist[] }, Error> => { + return Effect.tryPromise({ + try: () => + ctx.analytics.post("library.getArtists", { + pagination: { + skip: params.offset || 0, + take: params.limit || 100, + }, + }), + catch: (error) => new Error(`Failed to retrieve artists: ${error}`), + }); +}; + +const presentation = ({ + data, +}: { + data: Artist[]; +}): Effect.Effect<{ artists: ArtistViewBasic[] }, never> => { + return Effect.sync(() => ({ artists: deepCamelCaseKeys(data) })); +}; + +type Artist = { + id: string; + name: string; + picture: string; + play_count: number; + sha256: string; + unique_listeners: number; + uri: string; +}; diff --git a/apps/api/src/xrpc/app/rocksky/charts/getScrobblesChart.ts b/apps/api/src/xrpc/app/rocksky/charts/getScrobblesChart.ts new file mode 100644 index 00000000..a76f4905 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/charts/getScrobblesChart.ts @@ -0,0 +1,91 @@ +import { Context } from "context"; +import { eq } from "drizzle-orm"; +import { Effect, Match, pipe } from "effect"; +import { Server } from "lexicon"; +import { ChartsView } from "lexicon/types/app/rocksky/charts/defs"; +import { QueryParams } from "lexicon/types/app/rocksky/charts/getScrobblesChart"; +import tables from "schema"; + +export default function (server: Server, ctx: Context) { + const getScrobblesChart = (params) => + pipe( + { params, ctx }, + retrieve, + Effect.flatMap(presentation), + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({ scrobbles: [] }); + }) + ); + server.app.rocksky.charts.getScrobblesChart({ + handler: async ({ params }) => { + const result = await Effect.runPromise(getScrobblesChart(params)); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const retrieve = ({ params, ctx }: { params: QueryParams; ctx: Context }) => { + return Effect.tryPromise({ + try: async () => { + const match = Match.type().pipe( + Match.when({ did: (did) => !!did }, ({ did }) => + ctx.analytics.post("library.getScrobblesPerDay", { + user_did: did, + }) + ), + Match.when({ artisturi: (uri) => !!uri }, ({ artisturi }) => + ctx.analytics.post("library.getArtistScrobbles", { + artist_id: artisturi, + }) + ), + Match.when({ albumuri: (uri) => !!uri }, ({ albumuri }) => + ctx.analytics.post("library.getAlbumScrobbles", { + album_id: albumuri, + }) + ), + Match.when( + { songuri: (uri) => !!uri && uri.includes("app.rocksky.scrobble") }, + ({ songuri }) => + ctx.db + .select() + .from(tables.scrobbles) + .leftJoin( + tables.tracks, + eq(tables.scrobbles.trackId, tables.tracks.id) + ) + .where(eq(tables.scrobbles.uri, songuri)) + .execute() + .then(([row]) => row?.tracks?.uri) + .then((uri) => + ctx.analytics.post("library.getTrackScrobbles", { + track_id: uri, + }) + ) + ), + Match.when( + { songuri: (uri) => !!uri && !uri.includes("app.rocksky.scrobble") }, + ({ songuri }) => + ctx.analytics.post("library.getTrackScrobbles", { + track_id: songuri, + }) + ), + Match.orElse(() => ctx.analytics.post("library.getScrobblesPerDay", {})) + ); + + return match(params); + }, + catch: (error) => new Error(`Failed to retrieve scrobbles chart: ${error}`), + }); +}; + +const presentation = ({ data }): Effect.Effect => { + return Effect.sync(() => ({ + scrobbles: data, + })); +}; diff --git a/apps/api/src/xrpc/app/rocksky/dropbox/downloadFile.ts b/apps/api/src/xrpc/app/rocksky/dropbox/downloadFile.ts new file mode 100644 index 00000000..7b64c1e6 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/dropbox/downloadFile.ts @@ -0,0 +1,42 @@ +import { Context } from "context"; +import { eq } from "drizzle-orm"; +import { Effect } from "effect"; +import { Server } from "lexicon"; +import { QueryParams } from "lexicon/types/app/rocksky/dropbox/downloadFile"; +import tables from "schema"; + +export default function (server: Server, ctx: Context) { + server.app.rocksky.dropbox.downloadFile({ + auth: ctx.authVerifier, + handler: async ({ params, auth }) => { + download(); + throw new Error("Not implemented yet"); + }, + }); +} + +const getCurrentUser = ({ + params, + ctx, + did, +}: { + params: QueryParams; + ctx: Context; + did?: string; +}) => { + return Effect.tryPromise({ + try: async () => + ctx.db + .select() + .from(tables.users) + .where(eq(tables.users.did, did)) + .execute() + .then((users) => ({ user: users[0], ctx, params })), + catch: (error) => new Error(`Failed to retrieve current user: ${error}`), + }); +}; + +const download = () => { + // Logic to download a file from Dropbox + return {}; +}; diff --git a/apps/api/src/xrpc/app/rocksky/dropbox/getFiles.ts b/apps/api/src/xrpc/app/rocksky/dropbox/getFiles.ts new file mode 100644 index 00000000..86c37779 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/dropbox/getFiles.ts @@ -0,0 +1,53 @@ +import { HandlerAuth } from "@atproto/xrpc-server"; +import { Context } from "context"; +import { eq } from "drizzle-orm"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { QueryParams } from "lexicon/types/app/rocksky/dropbox/getFiles"; +import tables from "schema"; + +export default function (server: Server, ctx: Context) { + const getFiles = (params, auth: HandlerAuth) => + pipe(params, retrieve, presentation); + server.app.rocksky.dropbox.getFiles({ + auth: ctx.authVerifier, + handler: async ({ params, auth }) => { + const result = getFiles(params, auth); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const getCurrentUser = ({ + params, + ctx, + did, +}: { + params: QueryParams; + ctx: Context; + did?: string; +}) => { + return Effect.tryPromise({ + try: async () => + ctx.db + .select() + .from(tables.users) + .where(eq(tables.users.did, did)) + .execute() + .then((users) => ({ user: users[0], ctx, params })), + catch: (error) => new Error(`Failed to retrieve current user: ${error}`), + }); +}; + +const retrieve = () => { + // Logic to retrieve files from Dropbox + return []; +}; + +const presentation = (files) => { + // Logic to format the files for presentation + return {}; +}; diff --git a/apps/api/src/xrpc/app/rocksky/dropbox/getMetadata.ts b/apps/api/src/xrpc/app/rocksky/dropbox/getMetadata.ts new file mode 100644 index 00000000..3cb137cd --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/dropbox/getMetadata.ts @@ -0,0 +1,55 @@ +import { HandlerAuth } from "@atproto/xrpc-server"; +import { Context } from "context"; +import { eq } from "drizzle-orm"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { QueryParams } from "lexicon/types/app/rocksky/dropbox/getMetadata"; +import tables from "schema"; + +export default function (server: Server, ctx: Context) { + const getMetadata = (params, auth: HandlerAuth) => + pipe(params, retrieve, presentation); + server.app.rocksky.dropbox.getMetadata({ + auth: ctx.authVerifier, + handler: async ({ params, auth }) => { + const result = getMetadata(params, auth); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const getCurrentUser = ({ + params, + ctx, + did, +}: { + params: QueryParams; + ctx: Context; + did?: string; +}) => { + return Effect.tryPromise({ + try: async () => + ctx.db + .select() + .from(tables.users) + .where(eq(tables.users.did, did)) + .execute() + .then((users) => ({ user: users[0], ctx, params })), + catch: (error) => new Error(`Failed to retrieve current user: ${error}`), + }); +}; + +const retrieve = () => { + // Logic to retrieve metadata from Dropbox + return {}; +}; + +const presentation = (metadata) => { + // Logic to format the metadata for presentation + return { + metadata: {}, + }; +}; diff --git a/apps/api/src/xrpc/app/rocksky/dropbox/getTemporaryLink.ts b/apps/api/src/xrpc/app/rocksky/dropbox/getTemporaryLink.ts new file mode 100644 index 00000000..b4aeeb12 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/dropbox/getTemporaryLink.ts @@ -0,0 +1,51 @@ +import { HandlerAuth } from "@atproto/xrpc-server"; +import { Context } from "context"; +import { eq } from "drizzle-orm"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { QueryParams } from "lexicon/types/app/rocksky/dropbox/getTemporaryLink"; +import tables from "schema"; + +export default function (server: Server, ctx: Context) { + const getTemporaryLink = (params, auth: HandlerAuth) => + pipe(params, retrieve, presentation); + server.app.rocksky.dropbox.getTemporaryLink({ + auth: ctx.authVerifier, + handler: async ({ params, auth }) => { + const result = getTemporaryLink(params, auth); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const getCurrentUser = ({ + params, + ctx, + did, +}: { + params: QueryParams; + ctx: Context; + did?: string; +}) => { + return Effect.tryPromise({ + try: async () => + ctx.db + .select() + .from(tables.users) + .where(eq(tables.users.did, did)) + .execute() + .then((users) => ({ user: users[0], ctx, params })), + catch: (error) => new Error(`Failed to retrieve current user: ${error}`), + }); +}; + +const retrieve = () => { + return {}; +}; + +const presentation = () => { + return {}; +}; diff --git a/apps/api/src/xrpc/app/rocksky/feed/getNowPlayings.ts b/apps/api/src/xrpc/app/rocksky/feed/getNowPlayings.ts new file mode 100644 index 00000000..1bf77c5e --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/feed/getNowPlayings.ts @@ -0,0 +1,52 @@ +import { Context } from "context"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { NowPlayingView } from "lexicon/types/app/rocksky/feed/defs"; +import { QueryParams } from "lexicon/types/app/rocksky/feed/getNowPlayings"; +import { deepCamelCaseKeys } from "lib"; + +export default function (server: Server, ctx: Context) { + const getNowPlayings = (params) => + pipe( + { params, ctx }, + retrieve, + Effect.flatMap(presentation), + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({}); + }) + ); + server.app.rocksky.feed.getNowPlayings({ + handler: async ({ params }) => { + const result = await Effect.runPromise(getNowPlayings(params)); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const retrieve = ({ params, ctx }: { params: QueryParams; ctx: Context }) => { + return Effect.tryPromise({ + try: () => + ctx.analytics.post("library.getDistinctScrobbles", { + pagination: { + skip: 0, + take: params.size, + }, + }), + catch: (error) => + new Error(`Failed to retrieve now playing songs: ${error}`), + }); +}; + +const presentation = ({ + data, +}): Effect.Effect<{ nowPlayings: NowPlayingView[] }, never> => { + return Effect.sync(() => ({ + nowPlayings: deepCamelCaseKeys(data), + })); +}; diff --git a/apps/api/src/xrpc/app/rocksky/feed/search.ts b/apps/api/src/xrpc/app/rocksky/feed/search.ts new file mode 100644 index 00000000..eff06741 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/feed/search.ts @@ -0,0 +1,72 @@ +import { Context } from "context"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { ProfileViewBasic } from "lexicon/types/app/rocksky/actor/defs"; +import { AlbumViewBasic } from "lexicon/types/app/rocksky/album/defs"; +import { ArtistViewBasic } from "lexicon/types/app/rocksky/artist/defs"; +import { SearchResultsView } from "lexicon/types/app/rocksky/feed/defs"; +import { QueryParams } from "lexicon/types/app/rocksky/feed/search"; +import { PlaylistViewBasic } from "lexicon/types/app/rocksky/playlist/defs"; +import { SongViewBasic } from "lexicon/types/app/rocksky/song/defs"; + +export default function (server: Server, ctx: Context) { + const search = (params) => + pipe({ params, ctx }, retrieve, Effect.flatMap(presentation)); + server.app.rocksky.feed.search({ + handler: async ({ params }) => { + const result = await Effect.runPromise(search(params)); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const retrieve = ({ params, ctx }: { params: QueryParams; ctx: Context }) => { + return Effect.tryPromise(async () => + ctx.meilisearch + .post("multi-search", { + federation: {}, + queries: [ + { + indexUid: "albums", + q: params.query, + }, + { + indexUid: "artists", + q: params.query, + }, + { + indexUid: "tracks", + q: params.query, + }, + { + indexUid: "playlists", + q: params.query, + }, + { + indexUid: "users", + q: params.query, + }, + ], + }) + .then((res) => res.data) + ); +}; + +const presentation = ( + results: SearchResults +): Effect.Effect => { + return Effect.succeed(results); +}; + +type SearchResults = { + hits: Array< + | SongViewBasic + | ArtistViewBasic + | AlbumViewBasic + | PlaylistViewBasic + | ProfileViewBasic + >; +}; diff --git a/apps/api/src/xrpc/app/rocksky/googledrive/downloadFile.ts b/apps/api/src/xrpc/app/rocksky/googledrive/downloadFile.ts new file mode 100644 index 00000000..607f00bd --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/googledrive/downloadFile.ts @@ -0,0 +1,16 @@ +import { Context } from "context"; +import { Server } from "lexicon"; + +export default function (server: Server, ctx: Context) { + server.app.rocksky.googledrive.downloadFile({ + auth: ctx.authVerifier, + handler: async ({ params }) => { + download(); + throw new Error("Not implemented yet"); + }, + }); +} + +const download = () => { + // Logic to download a file from Google Drive +}; diff --git a/apps/api/src/xrpc/app/rocksky/googledrive/getFile.ts b/apps/api/src/xrpc/app/rocksky/googledrive/getFile.ts new file mode 100644 index 00000000..c286d9d9 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/googledrive/getFile.ts @@ -0,0 +1,27 @@ +import { Context } from "context"; +import { pipe } from "effect"; +import { Server } from "lexicon"; + +export default function (server: Server, ctx: Context) { + const getFile = (params) => pipe(params, retrieve, presentation); + server.app.rocksky.googledrive.getFile({ + auth: ctx.authVerifier, + handler: async ({ params }) => { + const result = getFile(params); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const retrieve = () => { + // Logic to retrieve the file from Google Drive + return {}; +}; + +const presentation = () => { + // Logic to format the file for presentation + return {}; +}; diff --git a/apps/api/src/xrpc/app/rocksky/googledrive/getFiles.ts b/apps/api/src/xrpc/app/rocksky/googledrive/getFiles.ts new file mode 100644 index 00000000..29fbb3d7 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/googledrive/getFiles.ts @@ -0,0 +1,29 @@ +import { Context } from "context"; +import { pipe } from "effect"; +import { Server } from "lexicon"; + +export default function (server: Server, ctx: Context) { + const getFiles = (params) => pipe(params, retrieve, presentation); + server.app.rocksky.googledrive.getFiles({ + auth: ctx.authVerifier, + handler: async ({ params }) => { + const result = getFiles(params); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const retrieve = () => { + // Logic to retrieve files from Google Drive + return []; +}; + +const presentation = (files) => { + // Logic to format the files for presentation + return { + files: files, + }; +}; diff --git a/apps/api/src/xrpc/app/rocksky/like/dislikeShout.ts b/apps/api/src/xrpc/app/rocksky/like/dislikeShout.ts new file mode 100644 index 00000000..75696dc5 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/like/dislikeShout.ts @@ -0,0 +1,53 @@ +import { HandlerAuth } from "@atproto/xrpc-server"; +import { Context } from "context"; +import { eq } from "drizzle-orm"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { QueryParams } from "lexicon/types/app/rocksky/like/dislikeShout"; +import tables from "schema"; + +export default function (server: Server, ctx: Context) { + const dislikeShout = (params, auth: HandlerAuth) => + pipe(params, dislike, presentation); + server.app.rocksky.like.dislikeShout({ + auth: ctx.authVerifier, + handler: async ({ params, auth }) => { + const result = dislikeShout(params, auth); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const getCurrentUser = ({ + params, + ctx, + did, +}: { + params: QueryParams; + ctx: Context; + did?: string; +}) => { + return Effect.tryPromise({ + try: async () => + ctx.db + .select() + .from(tables.users) + .where(eq(tables.users.did, did)) + .execute() + .then((users) => ({ user: users[0], ctx, params })), + catch: (error) => new Error(`Failed to retrieve current user: ${error}`), + }); +}; + +const dislike = () => { + // Logic to dislike a shout + return {}; +}; + +const presentation = () => { + // Logic to format the response for presentation + return {}; +}; diff --git a/apps/api/src/xrpc/app/rocksky/like/dislikeSong.ts b/apps/api/src/xrpc/app/rocksky/like/dislikeSong.ts new file mode 100644 index 00000000..ba1f8f02 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/like/dislikeSong.ts @@ -0,0 +1,53 @@ +import { HandlerAuth } from "@atproto/xrpc-server"; +import { Context } from "context"; +import { eq } from "drizzle-orm"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { QueryParams } from "lexicon/types/app/rocksky/like/dislikeSong"; +import tables from "schema"; + +export default function (server: Server, ctx: Context) { + const dislikeSong = (params, auth: HandlerAuth) => + pipe(params, dislike, presentation); + server.app.rocksky.like.dislikeSong({ + auth: ctx.authVerifier, + handler: async ({ params, auth }) => { + const result = dislikeSong(params, auth); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const getCurrentUser = ({ + params, + ctx, + did, +}: { + params: QueryParams; + ctx: Context; + did?: string; +}) => { + return Effect.tryPromise({ + try: async () => + ctx.db + .select() + .from(tables.users) + .where(eq(tables.users.did, did)) + .execute() + .then((users) => ({ user: users[0], ctx, params })), + catch: (error) => new Error(`Failed to retrieve current user: ${error}`), + }); +}; + +const dislike = () => { + // Logic to dislike a song + return {}; +}; + +const presentation = () => { + // Logic to format the response for presentation + return {}; +}; diff --git a/apps/api/src/xrpc/app/rocksky/like/likeShout.ts b/apps/api/src/xrpc/app/rocksky/like/likeShout.ts new file mode 100644 index 00000000..e8950c76 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/like/likeShout.ts @@ -0,0 +1,53 @@ +import { HandlerAuth } from "@atproto/xrpc-server"; +import { Context } from "context"; +import { eq } from "drizzle-orm"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { QueryParams } from "lexicon/types/app/rocksky/like/likeShout"; +import tables from "schema"; + +export default function (server: Server, ctx: Context) { + const likeShout = (params, auth: HandlerAuth) => + pipe(params, like, presentation); + server.app.rocksky.like.likeShout({ + auth: ctx.authVerifier, + handler: async ({ params, auth }) => { + const result = likeShout(params, auth); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const getCurrentUser = ({ + params, + ctx, + did, +}: { + params: QueryParams; + ctx: Context; + did?: string; +}) => { + return Effect.tryPromise({ + try: async () => + ctx.db + .select() + .from(tables.users) + .where(eq(tables.users.did, did)) + .execute() + .then((users) => ({ user: users[0], ctx, params })), + catch: (error) => new Error(`Failed to retrieve current user: ${error}`), + }); +}; + +const like = () => { + // Logic to like a shout + return {}; +}; + +const presentation = () => { + // Logic to format the response for presentation + return {}; +}; diff --git a/apps/api/src/xrpc/app/rocksky/like/likeSong.ts b/apps/api/src/xrpc/app/rocksky/like/likeSong.ts new file mode 100644 index 00000000..b97dbf80 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/like/likeSong.ts @@ -0,0 +1,53 @@ +import { HandlerAuth } from "@atproto/xrpc-server"; +import { Context } from "context"; +import { eq } from "drizzle-orm"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { QueryParams } from "lexicon/types/app/rocksky/like/likeSong"; +import tables from "schema"; + +export default function (server: Server, ctx: Context) { + const likeSong = (params, auth: HandlerAuth) => + pipe(params, like, presentation); + server.app.rocksky.like.likeSong({ + auth: ctx.authVerifier, + handler: async ({ params, auth }) => { + const result = likeSong(params, auth); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const getCurrentUser = ({ + params, + ctx, + did, +}: { + params: QueryParams; + ctx: Context; + did?: string; +}) => { + return Effect.tryPromise({ + try: async () => + ctx.db + .select() + .from(tables.users) + .where(eq(tables.users.did, did)) + .execute() + .then((users) => ({ user: users[0], ctx, params })), + catch: (error) => new Error(`Failed to retrieve current user: ${error}`), + }); +}; + +const like = () => { + // Logic to like a song + return {}; +}; + +const presentation = () => { + // Logic to format the response for presentation + return {}; +}; diff --git a/apps/api/src/xrpc/app/rocksky/player/getCurrentlyPlaying.ts b/apps/api/src/xrpc/app/rocksky/player/getCurrentlyPlaying.ts new file mode 100644 index 00000000..dde8f572 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/player/getCurrentlyPlaying.ts @@ -0,0 +1,63 @@ +import { HandlerAuth } from "@atproto/xrpc-server"; +import { Context } from "context"; +import { eq } from "drizzle-orm"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { QueryParams } from "lexicon/types/app/rocksky/player/getCurrentlyPlaying"; +import tables from "schema"; + +export default function (server: Server, ctx: Context) { + const getCurrentlyPlaying = (params, auth: HandlerAuth) => + pipe( + params, + retrieve, + presentation, + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({}); + }) + ); + server.app.rocksky.player.getCurrentlyPlaying({ + auth: ctx.authVerifier, + handler: async ({ params, auth }) => { + const result = await Effect.runPromise(getCurrentlyPlaying(params, auth)); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const withUser = ({ + params, + ctx, + did, +}: { + params: QueryParams; + ctx: Context; + did?: string; +}) => { + return Effect.tryPromise({ + try: async () => + ctx.db + .select() + .from(tables.users) + .where(eq(tables.users.did, did)) + .execute() + .then((users) => ({ user: users[0], ctx, params })), + catch: (error) => new Error(`Failed to retrieve current user: ${error}`), + }); +}; + +const retrieve = () => { + // Logic to retrieve currently playing track + return {}; +}; + +const presentation = (currentlyPlaying) => { + // Logic to format the currently playing track for presentation + return Effect.sync(() => ({})); +}; diff --git a/apps/api/src/xrpc/app/rocksky/player/next.ts b/apps/api/src/xrpc/app/rocksky/player/next.ts new file mode 100644 index 00000000..f07b3f31 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/player/next.ts @@ -0,0 +1,55 @@ +import { HandlerAuth } from "@atproto/xrpc-server"; +import { Context } from "context"; +import { eq } from "drizzle-orm"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { QueryParams } from "lexicon/types/app/rocksky/player/next"; +import tables from "schema"; + +export default function (server: Server, ctx: Context) { + const next = (params, auth: HandlerAuth) => + pipe( + params, + handleNext, + presentation, + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({}); + }) + ); + server.app.rocksky.player.next({ + auth: ctx.authVerifier, + handler: async ({ params, auth }) => { + const result = await Effect.runPromise(next(params, auth)); + }, + }); +} + +const withUser = ({ + params, + ctx, + did, +}: { + params: QueryParams; + ctx: Context; + did?: string; +}) => { + return Effect.tryPromise({ + try: async () => + ctx.db + .select() + .from(tables.users) + .where(eq(tables.users.did, did)) + .execute() + .then((users) => ({ user: users[0], ctx, params })), + catch: (error) => new Error(`Failed to retrieve current user: ${error}`), + }); +}; + +const handleNext = (params) => {}; + +const presentation = () => { + return Effect.sync(() => ({})); +}; diff --git a/apps/api/src/xrpc/app/rocksky/player/pause.ts b/apps/api/src/xrpc/app/rocksky/player/pause.ts new file mode 100644 index 00000000..b0b1e2c2 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/player/pause.ts @@ -0,0 +1,55 @@ +import { HandlerAuth } from "@atproto/xrpc-server"; +import { Context } from "context"; +import { eq } from "drizzle-orm"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { QueryParams } from "lexicon/types/app/rocksky/player/pause"; +import tables from "schema"; + +export default function (server: Server, ctx: Context) { + const pause = (params, auth: HandlerAuth) => + pipe( + params, + handlePause, + presentation, + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({}); + }) + ); + server.app.rocksky.player.pause({ + auth: ctx.authVerifier, + handler: async ({ params, auth }) => { + const result = await Effect.runPromise(pause(params, auth)); + }, + }); +} + +const withUser = ({ + params, + ctx, + did, +}: { + params: QueryParams; + ctx: Context; + did?: string; +}) => { + return Effect.tryPromise({ + try: async () => + ctx.db + .select() + .from(tables.users) + .where(eq(tables.users.did, did)) + .execute() + .then((users) => ({ user: users[0], ctx, params })), + catch: (error) => new Error(`Failed to retrieve current user: ${error}`), + }); +}; + +const handlePause = (params) => {}; + +const presentation = () => { + return Effect.sync(() => ({})); +}; diff --git a/apps/api/src/xrpc/app/rocksky/player/play.ts b/apps/api/src/xrpc/app/rocksky/player/play.ts new file mode 100644 index 00000000..2407fdd4 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/player/play.ts @@ -0,0 +1,58 @@ +import { HandlerAuth } from "@atproto/xrpc-server"; +import { Context } from "context"; +import { eq } from "drizzle-orm"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { QueryParams } from "lexicon/types/app/rocksky/player/play"; +import tables from "schema"; + +export default function (server: Server, ctx: Context) { + const play = (params, auth: HandlerAuth) => + pipe( + params, + handlePlay, + presentation, + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({}); + }) + ); + server.app.rocksky.player.play({ + auth: ctx.authVerifier, + handler: async ({ params, auth }) => { + const result = await Effect.runPromise(play(params, auth)); + }, + }); +} + +const withUser = ({ + params, + ctx, + did, +}: { + params: QueryParams; + ctx: Context; + did?: string; +}) => { + return Effect.tryPromise({ + try: async () => + ctx.db + .select() + .from(tables.users) + .where(eq(tables.users.did, did)) + .execute() + .then((users) => ({ user: users[0], ctx, params })), + catch: (error) => new Error(`Failed to retrieve current user: ${error}`), + }); +}; + +const handlePlay = (params) => { + // Logic to handle play action +}; + +const presentation = () => { + // Logic to format the response for play action + return Effect.sync(() => ({})); +}; diff --git a/apps/api/src/xrpc/app/rocksky/player/previous.ts b/apps/api/src/xrpc/app/rocksky/player/previous.ts new file mode 100644 index 00000000..a5ce7a3d --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/player/previous.ts @@ -0,0 +1,58 @@ +import { HandlerAuth } from "@atproto/xrpc-server"; +import { Context } from "context"; +import { eq } from "drizzle-orm"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { QueryParams } from "lexicon/types/app/rocksky/player/previous"; +import tables from "schema"; + +export default function (server: Server, ctx: Context) { + const previous = (params, auth: HandlerAuth) => + pipe( + params, + handlePrevious, + presentation, + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({}); + }) + ); + server.app.rocksky.player.previous({ + auth: ctx.authVerifier, + handler: async ({ params, auth }) => { + const result = await Effect.runPromise(previous(params, auth)); + }, + }); +} + +const withUser = ({ + params, + ctx, + did, +}: { + params: QueryParams; + ctx: Context; + did?: string; +}) => { + return Effect.tryPromise({ + try: async () => + ctx.db + .select() + .from(tables.users) + .where(eq(tables.users.did, did)) + .execute() + .then((users) => ({ user: users[0], ctx, params })), + catch: (error) => new Error(`Failed to retrieve current user: ${error}`), + }); +}; + +const handlePrevious = (params) => { + // Logic to handle previous action +}; + +const presentation = () => { + // Logic to format the response for previous action + return Effect.sync(() => ({})); +}; diff --git a/apps/api/src/xrpc/app/rocksky/player/seek.ts b/apps/api/src/xrpc/app/rocksky/player/seek.ts new file mode 100644 index 00000000..3b25e3f9 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/player/seek.ts @@ -0,0 +1,61 @@ +import { HandlerAuth } from "@atproto/xrpc-server"; +import { Context } from "context"; +import { eq } from "drizzle-orm"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { QueryParams } from "lexicon/types/app/rocksky/player/seek"; +import tables from "schema"; + +export default function (server: Server, ctx: Context) { + const seek = (params, auth: HandlerAuth) => + pipe( + params, + handleSeek, + presentation, + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({}); + }) + ); + server.app.rocksky.player.seek({ + auth: ctx.authVerifier, + handler: async ({ params, auth }) => { + const result = seek(params, auth); + }, + }); +} + +const withUser = ({ + params, + ctx, + did, +}: { + params: QueryParams; + ctx: Context; + did?: string; +}) => { + return Effect.tryPromise({ + try: async () => + ctx.db + .select() + .from(tables.users) + .where(eq(tables.users.did, did)) + .execute() + .then((users) => ({ user: users[0], ctx, params })), + catch: (error) => new Error(`Failed to retrieve current user: ${error}`), + }); +}; + +const handleSeek = (params) => { + // Logic to handle seek action + // This could involve updating the current playback position + // based on the provided parameters. +}; + +const presentation = () => { + // Logic to format the response for seek action + // This could return the updated playback position or any relevant information. + return Effect.sync(() => ({})); +}; diff --git a/apps/api/src/xrpc/app/rocksky/playlist/getPlaylist.ts b/apps/api/src/xrpc/app/rocksky/playlist/getPlaylist.ts new file mode 100644 index 00000000..282eb1f9 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/playlist/getPlaylist.ts @@ -0,0 +1,116 @@ +import { Context } from "context"; +import { asc, eq, sql } from "drizzle-orm"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { PlaylistViewDetailed } from "lexicon/types/app/rocksky/playlist/defs"; +import { QueryParams } from "lexicon/types/app/rocksky/playlist/getPlaylist"; +import * as R from "ramda"; +import tables from "schema"; +import { SelectPlaylist } from "schema/playlists"; +import { SelectTrack } from "schema/tracks"; +import { SelectUser } from "schema/users"; + +export default function (server: Server, ctx: Context) { + const getPlaylist = (params) => + pipe( + { params, ctx }, + retrieve, + Effect.flatMap(presentation), + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({}); + }) + ); + server.app.rocksky.playlist.getPlaylist({ + handler: async ({ params }) => { + const result = await Effect.runPromise(getPlaylist(params)); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const retrieve = ({ + params, + ctx, +}: { + params: QueryParams; + ctx: Context; +}): Effect.Effect<[Playlist, SelectTrack[]], Error> => { + return Effect.tryPromise({ + try: async () => + Promise.all([ + ctx.db + .select({ + playlists: tables.playlists, + users: tables.users, + trackCount: sql` + (SELECT COUNT(*) + FROM ${tables.playlistTracks} + WHERE ${tables.playlistTracks.playlistId} = ${tables.playlists.id} + )`.as("trackCount"), + }) + .from(tables.userPlaylists) + .leftJoin( + tables.playlists, + eq(tables.userPlaylists.playlistId, tables.playlists.id) + ) + .leftJoin( + tables.users, + eq(tables.userPlaylists.userId, tables.users.id) + ) + .where(eq(tables.playlists.uri, params.uri)) + .execute() + .then(([row]) => row), + ctx.db + .select() + .from(tables.playlistTracks) + .leftJoin( + tables.tracks, + eq(tables.playlistTracks.trackId, tables.tracks.id) + ) + .leftJoin( + tables.playlists, + eq(tables.playlistTracks.playlistId, tables.playlists.id) + ) + .where(eq(tables.playlists.uri, params.uri)) + .orderBy(asc(tables.playlistTracks.createdAt)) + .execute() + .then((rows) => rows.map((row) => row.tracks)), + ]), + catch: (error) => new Error(`Failed to retrieve playlist: ${error}`), + }); +}; + +const presentation = ([playlist, tracks]: [ + Playlist, + SelectTrack[], +]): Effect.Effect => { + return Effect.sync(() => ({ + ...R.omit(["name", "picture"], playlist.playlists), + tracks: tracks.map((track) => ({ + ...R.omit(["lyrics"], track), + createdAt: track.createdAt.toISOString(), + updatedAt: track.updatedAt.toISOString(), + })), + title: playlist.playlists.name, + coverImageUrl: playlist.playlists.picture, + curatorDId: playlist.users.did, + curatorName: playlist.users.displayName, + curatorAvatarUrl: playlist.users.avatar, + curatorHandle: playlist.users.handle, + createdAt: playlist.playlists.createdAt.toISOString(), + updatedAt: playlist.playlists.updatedAt.toISOString(), + trackCount: playlist.trackCount, + })); +}; + +type Playlist = { + playlists: SelectPlaylist; + users: SelectUser; + trackCount: number; +}; diff --git a/apps/api/src/xrpc/app/rocksky/playlist/getPlaylists.ts b/apps/api/src/xrpc/app/rocksky/playlist/getPlaylists.ts new file mode 100644 index 00000000..3851fd11 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/playlist/getPlaylists.ts @@ -0,0 +1,95 @@ +import { Context } from "context"; +import { desc, eq, sql } from "drizzle-orm"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { PlaylistViewBasic } from "lexicon/types/app/rocksky/playlist/defs"; +import { QueryParams } from "lexicon/types/app/rocksky/playlist/getPlaylists"; +import * as R from "ramda"; +import tables from "schema"; +import { SelectPlaylist } from "schema/playlists"; +import { SelectUser } from "schema/users"; + +export default function (server: Server, ctx: Context) { + const getPlaylists = (params) => + pipe( + { params, ctx }, + retrieve, + Effect.flatMap(presentation), + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({ playlists: [] }); + }) + ); + server.app.rocksky.playlist.getPlaylists({ + handler: async ({ params }) => { + const result = await Effect.runPromise(getPlaylists(params)); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const retrieve = ({ + params, + ctx, +}: { + params: QueryParams; + ctx: Context; +}): Effect.Effect => { + return Effect.tryPromise({ + try: async () => + ctx.db + .select({ + playlists: tables.playlists, + users: tables.users, + trackCount: sql` + (SELECT COUNT(*) + FROM ${tables.playlistTracks} + WHERE ${tables.playlistTracks.playlistId} = ${tables.playlists.id} + )`.as("trackCount"), + }) + .from(tables.userPlaylists) + .leftJoin( + tables.playlists, + eq(tables.userPlaylists.playlistId, tables.playlists.id) + ) + .leftJoin( + tables.users, + eq(tables.userPlaylists.userId, tables.users.id) + ) + .orderBy(desc(tables.playlists.createdAt)) + .limit(params.limit || 20) + .offset(params.offset || 0) + .execute(), + catch: (error) => new Error(`Failed to retrieve playlists: ${error}`), + }); +}; + +const presentation = ( + data: Playlists +): Effect.Effect<{ playlists: PlaylistViewBasic[] }, never> => { + return Effect.sync(() => ({ + playlists: data.map((playlist) => ({ + ...R.omit(["picture", "name"], playlist.playlists), + title: playlist.playlists.name, + coverImageUrl: playlist.playlists.picture, + curatorDId: playlist.users.did, + curatorName: playlist.users.displayName, + curatorAvatarUrl: playlist.users.avatar, + curatorHandle: playlist.users.handle, + createdAt: playlist.playlists.createdAt.toISOString(), + updatedAt: playlist.playlists.updatedAt.toISOString(), + trackCount: playlist.trackCount, + })), + })); +}; + +type Playlists = { + playlists: SelectPlaylist; + users: SelectUser; + trackCount: number; +}[]; diff --git a/apps/api/src/xrpc/app/rocksky/scrobble/createScrobble.ts b/apps/api/src/xrpc/app/rocksky/scrobble/createScrobble.ts new file mode 100644 index 00000000..81cde6e9 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/scrobble/createScrobble.ts @@ -0,0 +1,1228 @@ +import { Agent, BlobRef } from "@atproto/api"; +import { TID } from "@atproto/common"; +import { HandlerAuth } from "@atproto/xrpc-server"; +import chalk from "chalk"; +import { Context } from "context"; +import dayjs from "dayjs"; +import { and, eq } from "drizzle-orm"; +import { Effect, Match, Option, pipe } from "effect"; +import { Server } from "lexicon"; +import * as Album from "lexicon/types/app/rocksky/album"; +import * as Artist from "lexicon/types/app/rocksky/artist"; +import * as Scrobble from "lexicon/types/app/rocksky/scrobble"; +import { InputSchema } from "lexicon/types/app/rocksky/scrobble/createScrobble"; +import { ScrobbleViewBasic } from "lexicon/types/app/rocksky/scrobble/defs"; +import * as Song from "lexicon/types/app/rocksky/song"; +import { deepSnakeCaseKeys } from "lib"; +import { createAgent } from "lib/agent"; +import downloadImage from "lib/downloadImage"; +import { createHash } from "node:crypto"; +import tables from "schema"; +import { SelectAlbum } from "schema/albums"; +import { SelectArtist } from "schema/artists"; +import { SelectScrobble } from "schema/scrobbles"; +import { SelectTrack } from "schema/tracks"; +import { InsertUserAlbum } from "schema/user-albums"; +import { InsertUserArtist } from "schema/user-artists"; +import { InsertUserTrack } from "schema/user-tracks"; +import { SelectUser } from "schema/users"; +import { Track, trackSchema } from "types/track"; + +export default function (server: Server, ctx: Context) { + const createScrobble = (input, auth: HandlerAuth) => + pipe( + { input, ctx, did: auth.credentials?.did }, + withAgent, + Effect.flatMap(validateInput), + Effect.flatMap(({ track, ctx, did, agent }) => + pipe( + scrobbleTrack(ctx, track, agent, did), + Effect.tap(() => + Effect.logInfo(`Scrobble created for ${chalk.cyan(track.title)}`) + ) + ) + ), + Effect.flatMap(presentation), + Effect.retry({ times: 3 }), + Effect.timeout("600 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({}); + }) + ); + server.app.rocksky.scrobble.createScrobble({ + auth: ctx.authVerifier, + handler: async ({ input, auth }) => { + const result = await Effect.runPromise(createScrobble(input.body, auth)); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const withAgent = ({ + input, + ctx, + did, +}: { + input: InputSchema; + ctx: Context; + did: string; +}): Effect.Effect => { + return Effect.tryPromise({ + try: async () => + Match.value(did).pipe( + Match.when( + (value) => !!value, + () => + createAgent(ctx.oauthClient, did).then((agent) => ({ + agent, + ctx, + did, + input, + })) + ), + Match.orElse(() => { + throw new Error("Authentication required to create a scrobble"); + }) + ), + catch: (error) => new Error(`Failed to create agent: ${error}`), + }); +}; + +const validateInput = ({ + input, + ...params +}: InputWithAgent): Effect.Effect => + Effect.try(() => ({ + ...params, + track: trackSchema.safeParse(input).data, + })); + +const presentation = (): Effect.Effect => { + return Effect.sync(() => ({})); +}; + +type InputWithAgent = { + input: InputSchema; + ctx: Context; + did: string; + agent: Agent; +}; + +type ValidatedInput = { + track: Track; + ctx: Context; + did: string; + agent: Agent; +}; + +const generateRkey = Effect.succeed(TID.nextStr()); + +const uploadImage = (url: string, agent: Agent) => + pipe( + Effect.tryPromise(() => downloadImage(url)), + Effect.map< + Buffer, + [Buffer, { encoding: string } | undefined] + >((imageBuffer) => { + if (url.endsWith(".jpeg") || url.endsWith(".jpg")) { + return [imageBuffer, { encoding: "image/jpeg" }]; + } else if (url.endsWith(".png")) { + return [imageBuffer, { encoding: "image/png" }]; + } + return [imageBuffer, undefined]; + }), + Effect.flatMap(([imageBuffer, options]) => + pipe( + Effect.tryPromise(() => agent.uploadBlob(imageBuffer, options)), + Effect.map((uploadResponse) => uploadResponse.data.blob) + ) + ), + Effect.catchAll(() => Effect.succeed(undefined as BlobRef | undefined)) + ); + +const putRecord = ( + agent: Agent, + collection: string, + record: T, + validate: (record: T) => { success: boolean } +) => + pipe( + Effect.succeed(record), + Effect.filterOrFail( + (rec) => validate(rec).success, + () => new Error("Invalid record") + ), + Effect.flatMap(() => + pipe( + generateRkey, + Effect.flatMap((rkey) => + Effect.tryPromise(() => + agent.com.atproto.repo.putRecord({ + repo: agent.assertDid, + collection, + rkey, + record, + validate: false, + }) + ) + ), + Effect.tap((res) => + Effect.logInfo(`Record created at ${res.data.uri}`) + ), + Effect.map((res) => res.data.uri) + ) + ), + Effect.catchAll((error) => { + console.error(`Error creating ${collection} record`, error); + return Effect.succeed(null); + }) + ); + +const putArtistRecord = (track: Track, agent: Agent) => + pipe( + track.artistPicture + ? uploadImage(track.artistPicture, agent) + : Effect.succeed(undefined), + Effect.map((picture) => ({ + $type: "app.rocksky.artist", + name: track.albumArtist, + createdAt: new Date().toISOString(), + picture, + })), + Effect.flatMap((record) => + putRecord(agent, "app.rocksky.artist", record, Artist.validateRecord) + ) + ); + +const putAlbumRecord = (track: Track, agent: Agent) => + pipe( + Match.value(track.albumArt).pipe( + Match.when( + (url) => !!url, + (url) => uploadImage(url, agent) + ), + Match.orElse(() => Effect.succeed(undefined as BlobRef | undefined)) + ), + Effect.map((albumArt) => ({ + $type: "app.rocksky.album", + title: track.album, + artist: track.albumArtist, + year: track.year, + releaseDate: track.releaseDate + ? track.releaseDate.toISOString() + : undefined, + createdAt: new Date().toISOString(), + albumArt, + })), + Effect.flatMap((record) => + putRecord(agent, "app.rocksky.album", record, Album.validateRecord) + ) + ); + +const putSongRecord = (track: Track, agent: Agent) => + pipe( + Match.value(track.albumArt).pipe( + Match.when( + (url) => !!url, + (url) => uploadImage(url, agent) + ), + Match.orElse(() => Effect.succeed(undefined as BlobRef | undefined)) + ), + Effect.map((albumArt) => ({ + $type: "app.rocksky.song", + title: track.title, + artist: track.artist, + album: track.album, + albumArtist: track.albumArtist, + duration: track.duration, + releaseDate: track.releaseDate + ? track.releaseDate.toISOString() + : undefined, + year: track.year, + albumArt, + composer: track.composer ?? undefined, + lyrics: track.lyrics ?? undefined, + trackNumber: track.trackNumber, + discNumber: track.discNumber === 0 ? 1 : track.discNumber, + copyrightMessage: track.copyrightMessage ?? undefined, + createdAt: new Date().toISOString(), + spotifyLink: track.spotifyLink ?? undefined, + })), + Effect.flatMap((record) => + putRecord(agent, "app.rocksky.song", record, Song.validateRecord) + ) + ); + +const putScrobbleRecord = (track: Track, agent: Agent) => + pipe( + Match.value(track.albumArt).pipe( + Match.when( + (url) => !!url, + (url) => uploadImage(url, agent) + ), + Match.orElse(() => Effect.succeed(undefined as BlobRef | undefined)) + ), + Effect.map((albumArt) => ({ + $type: "app.rocksky.scrobble", + title: track.title, + albumArtist: track.albumArtist, + albumArt, + artist: track.artist, + album: track.album, + duration: track.duration, + trackNumber: track.trackNumber, + discNumber: track.discNumber === 0 ? 1 : track.discNumber, + releaseDate: track.releaseDate + ? track.releaseDate.toISOString() + : undefined, + year: track.year, + composer: track.composer ?? undefined, + lyrics: track.lyrics ?? undefined, + copyrightMessage: track.copyrightMessage ?? undefined, + createdAt: track.timestamp + ? dayjs.unix(track.timestamp).toISOString() + : new Date().toISOString(), + spotifyLink: track.spotifyLink ?? undefined, + })), + Effect.flatMap((record) => + putRecord(agent, "app.rocksky.scrobble", record, Scrobble.validateRecord) + ) + ); + +const getScrobble = ({ ctx, id }: { ctx: Context; id: string }) => + Effect.tryPromise(() => + ctx.db + .select() + .from(tables.scrobbles) + .leftJoin(tables.tracks, eq(tables.tracks.id, tables.scrobbles.trackId)) + .leftJoin(tables.albums, eq(tables.albums.id, tables.scrobbles.albumId)) + .leftJoin( + tables.artists, + eq(tables.artists.id, tables.scrobbles.artistId) + ) + .leftJoin(tables.users, eq(tables.users.id, tables.scrobbles.userId)) + .where(eq(tables.scrobbles.id, id)) + .execute() + .then(([row]) => row) + ); + +const getUserAlbum = ( + ctx: Context, + scrobble: { + albums: SelectAlbum; + artists: SelectArtist; + users: SelectUser; + tracks: SelectTrack; + } +) => + Effect.tryPromise(() => + ctx.db + .select() + .from(tables.userAlbums) + .where(eq(tables.userAlbums.albumId, scrobble.albums.id)) + .execute() + .then(([row]) => row) + ); + +const getUserArtist = ( + ctx: Context, + scrobble: { + albums: SelectAlbum; + artists: SelectArtist; + users: SelectUser; + tracks: SelectTrack; + } +) => + Effect.tryPromise(() => + ctx.db + .select() + .from(tables.userArtists) + .where(eq(tables.userArtists.id, scrobble.artists.id)) + .execute() + .then(([row]) => row) + ); + +const getUserTrack = ( + ctx: Context, + scrobble: { + albums: SelectAlbum; + artists: SelectArtist; + users: SelectUser; + tracks: SelectTrack; + } +) => + Effect.tryPromise(() => + ctx.db + .select() + .from(tables.userTracks) + .where(eq(tables.userTracks.id, scrobble.tracks.id)) + .execute() + .then(([row]) => row) + ); + +const getAlbumTrack = ( + ctx: Context, + scrobble: { + albums: SelectAlbum; + artists: SelectArtist; + users: SelectUser; + tracks: SelectTrack; + } +) => + Effect.tryPromise(() => + ctx.db + .select() + .from(tables.albumTracks) + .where(eq(tables.albumTracks.trackId, scrobble.tracks.id)) + .execute() + .then(([row]) => row) + ); + +const getArtistTrack = ( + ctx: Context, + scrobble: { + albums: SelectAlbum; + artists: SelectArtist; + users: SelectUser; + tracks: SelectTrack; + } +) => + Effect.tryPromise(() => + ctx.db + .select() + .from(tables.artistTracks) + .where(eq(tables.artistTracks.trackId, scrobble.tracks.id)) + .execute() + .then(([row]) => row) + ); + +const getArtistAlbum = ( + ctx: Context, + scrobble: { + albums: SelectAlbum; + artists: SelectArtist; + users: SelectUser; + tracks: SelectTrack; + } +) => + Effect.tryPromise(() => + ctx.db + .select() + .from(tables.artistAlbums) + .where( + and( + eq(tables.artistAlbums.albumId, scrobble.albums.id), + eq(tables.artistAlbums.artistId, scrobble.artists.id) + ) + ) + .then(([row]) => row) + ); + +const createUserArtist = ( + ctx: Context, + scrobble: { + albums: SelectAlbum; + artists: SelectArtist; + users: SelectUser; + tracks: SelectTrack; + } +) => + pipe( + Effect.tryPromise(() => + ctx.db + .insert(tables.userArtists) + .values({ + userId: scrobble.users.id, + artistId: scrobble.artists.id, + uri: scrobble.artists.uri, + scrobbles: 1, + } as InsertUserArtist) + .execute() + ), + Effect.flatMap(() => + Effect.tryPromise(() => + ctx.db + .select() + .from(tables.userArtists) + .where(eq(tables.userArtists.artistId, scrobble.artists.id)) + .execute() + .then(([row]) => row) + ) + ) + ); + +const createUserAlbum = ( + ctx: Context, + scrobble: { + albums: SelectAlbum; + artists: SelectArtist; + users: SelectUser; + tracks: SelectTrack; + } +) => + pipe( + Effect.tryPromise(() => + ctx.db + .insert(tables.userAlbums) + .values({ + userId: scrobble.users.id, + albumId: scrobble.albums.id, + uri: scrobble.albums.uri, + scrobbles: 1, + } as InsertUserAlbum) + .execute() + ), + Effect.flatMap(() => + Effect.tryPromise(() => + ctx.db + .select() + .from(tables.userAlbums) + .where(eq(tables.userAlbums.albumId, scrobble.albums.id)) + .execute() + .then(([row]) => row) + ) + ) + ); + +const createUserTrack = ( + ctx: Context, + scrobble: { + albums: SelectAlbum; + artists: SelectArtist; + users: SelectUser; + tracks: SelectTrack; + } +) => + pipe( + Effect.tryPromise(() => + ctx.db + .insert(tables.userTracks) + .values({ + userId: scrobble.users.id, + trackId: scrobble.tracks.id, + uri: scrobble.tracks.uri, + scrobbles: 1, + } as InsertUserTrack) + .execute() + ), + Effect.flatMap(() => + Effect.tryPromise(() => + ctx.db + .select() + .from(tables.userTracks) + .where(eq(tables.userTracks.trackId, scrobble.tracks.id)) + .then(([row]) => row) + ) + ) + ); + +const publishScrobble = (ctx: Context, id: string) => + pipe( + { ctx, id }, + getScrobble, + Effect.flatMap((scrobble) => + pipe( + Effect.all([ + getUserAlbum(ctx, scrobble), + getUserArtist(ctx, scrobble), + getUserTrack(ctx, scrobble), + getAlbumTrack(ctx, scrobble), + getArtistTrack(ctx, scrobble), + getArtistAlbum(ctx, scrobble), + ]), + Effect.flatMap( + ([ + userAlbum, + userArtist, + userTrack, + albumTrack, + artistTrack, + artistAlbum, + ]) => + pipe( + Option.fromNullable(userArtist), + Effect.orElse(() => createUserArtist(ctx, scrobble)), + Effect.flatMap((finalUserArtist) => + pipe( + Option.fromNullable(userAlbum), + Effect.orElse(() => createUserAlbum(ctx, scrobble)), + Effect.flatMap((finalUserAlbum) => + pipe( + Option.fromNullable(userTrack), + Effect.orElse(() => createUserTrack(ctx, scrobble)), + Effect.map((finalUserTrack) => + deepSnakeCaseKeys({ + scrobble: { + album_id: { + ...scrobble.albums, + xata_createdat: + scrobble.albums.createdAt.toISOString(), + xata_id: scrobble.albums.id, + xata_updatedat: + scrobble.albums.updatedAt.toISOString(), + xata_version: scrobble.albums.xataVersion, + }, + artist_id: { + ...scrobble.artists, + xata_createdat: + scrobble.artists.createdAt.toISOString(), + xata_id: scrobble.artists.id, + xata_updatedat: + scrobble.artists.updatedAt.toISOString(), + xata_version: scrobble.artists.xataVersion, + }, + track_id: { + ...scrobble.tracks, + xata_createdat: + scrobble.tracks.createdAt.toISOString(), + xata_id: scrobble.tracks.id, + xata_updatedat: + scrobble.tracks.updatedAt.toISOString(), + xata_version: scrobble.tracks.xataVersion, + }, + uri: scrobble.scrobbles.uri, + user_id: { + avatar: scrobble.users.avatar, + did: scrobble.users.did, + display_name: scrobble.users.displayName, + handle: scrobble.users.handle, + xata_createdat: + scrobble.users.createdAt.toISOString(), + xata_id: scrobble.users.id, + xata_updatedat: + scrobble.users.updatedAt.toISOString(), + xata_version: scrobble.users.xataVersion, + }, + xata_createdat: + scrobble.scrobbles.createdAt.toISOString(), + xata_id: scrobble.scrobbles.id, + xata_updatedat: + scrobble.scrobbles.updatedAt.toISOString(), + xata_version: scrobble.scrobbles.xataVersion, + timestamp: + scrobble.scrobbles.timestamp.toISOString(), + }, + user_album: { + album_id: { xata_id: finalUserAlbum.albumId }, + scrobbles: finalUserAlbum.scrobbles, + uri: finalUserAlbum.uri, + user_id: { + xata_id: finalUserAlbum.userId, + }, + xata_createdat: + finalUserAlbum.createdAt.toISOString(), + xata_id: finalUserAlbum.id, + xata_updatedat: + finalUserAlbum.updatedAt.toISOString(), + xata_version: finalUserAlbum.xataVersion, + }, + user_artist: { + artist_id: { + xata_id: finalUserArtist.artistId, + }, + scrobbles: finalUserArtist.scrobbles, + uri: finalUserArtist.uri, + user_id: { + xata_id: finalUserArtist.userId, + }, + xata_createdat: + finalUserArtist.createdAt.toISOString(), + xata_id: finalUserArtist.id, + xata_updatedat: + finalUserArtist.updatedAt.toISOString(), + xata_version: finalUserArtist.xataVersion, + }, + user_track: { + scrobbles: finalUserTrack.scrobbles, + track_id: { + xata_id: finalUserTrack.trackId, + }, + uri: finalUserTrack.uri, + user_id: { + xata_id: finalUserTrack.userId, + }, + xata_createdat: + finalUserTrack.createdAt.toISOString(), + xata_id: finalUserTrack.id, + xata_updatedat: + finalUserTrack.updatedAt.toISOString(), + xata_version: finalUserTrack.xataVersion, + }, + album_track: { + xata_id: albumTrack.id, + album_id: { + xata_id: albumTrack.albumId, + }, + track_id: { + xata_id: albumTrack.trackId, + }, + xata_createdat: albumTrack.createdAt.toISOString(), + xata_updatedat: albumTrack.updatedAt.toISOString(), + xata_version: albumTrack.xataVersion, + }, + artist_track: { + xata_id: artistTrack.id, + artist_id: { + xata_id: artistTrack.artistId, + }, + track_id: { + xata_id: artistTrack.trackId, + }, + xata_createdat: artistTrack.createdAt.toISOString(), + xata_updatedat: artistTrack.updatedAt.toISOString(), + xata_version: artistTrack.xataVersion, + }, + artist_album: { + xata_id: artistAlbum.id, + artist_id: { + xata_id: artistAlbum.artistId, + }, + album_id: { + xata_id: artistAlbum.albumId, + }, + xata_createdat: artistAlbum.createdAt.toISOString(), + xata_updatedat: artistAlbum.updatedAt.toISOString(), + xata_version: artistAlbum.xataVersion, + }, + }) + ) + ) + ) + ) + ), + Effect.flatMap((data) => + Effect.try(() => + ctx.nc.publish( + "rocksky.scrobble", + Buffer.from( + JSON.stringify(data).replaceAll("sha_256", "sha256") + ) + ) + ) + ) + ) + ) + ) + ) + ); + +const computeTrackHash = (track: Track): Effect.Effect => + Effect.succeed( + createHash("sha256") + .update(`${track.title} - ${track.artist} - ${track.album}`.toLowerCase()) + .digest("hex") + ); + +const computeAlbumHash = (track: Track): Effect.Effect => + Effect.succeed( + createHash("sha256") + .update(`${track.album} - ${track.albumArtist}`.toLowerCase()) + .digest("hex") + ); + +const computeArtistHash = (track: Track): Effect.Effect => + Effect.succeed( + createHash("sha256").update(track.albumArtist.toLowerCase()).digest("hex") + ); + +const fetchExistingTrack = ( + ctx: Context, + trackHash: string +): Effect.Effect => + Effect.tryPromise(() => + ctx.db + .select() + .from(tables.tracks) + .where(eq(tables.tracks.sha256, trackHash)) + .execute() + .then(([row]) => row) + ); + +// Update track metadata (album_uri and artist_uri) +const updateTrackMetadata = ( + ctx: Context, + track: Track, + trackRecord: SelectTrack +) => + pipe( + Effect.succeed(trackRecord), + Effect.tap((trackRecord) => + !trackRecord.albumUri + ? pipe( + computeAlbumHash(track), + Effect.flatMap((albumHash) => + Effect.tryPromise(() => + ctx.db + .select() + .from(tables.albums) + .where(eq(tables.albums.sha256, albumHash)) + .execute() + .then(([row]) => row) + ) + ), + Effect.flatMap((album) => + album + ? Effect.tryPromise(() => + ctx.db + .update(tables.tracks) + .set({ + albumUri: album.uri, + }) + .where(eq(tables.tracks.id, trackRecord.id)) + .execute() + ) + : Effect.succeed(undefined) + ) + ) + : Effect.succeed(undefined) + ), + Effect.tap((trackRecord) => + !trackRecord.artistUri + ? pipe( + computeArtistHash(track), + Effect.flatMap((artistHash) => + Effect.tryPromise(() => + ctx.db + .select() + .from(tables.artists) + .where(eq(tables.artists.sha256, artistHash)) + .execute() + .then(([row]) => row) + ) + ), + Effect.flatMap((artist) => + artist + ? Effect.tryPromise(() => + ctx.db + .update(tables.tracks) + .set({ + artistUri: artist.uri, + }) + .where(eq(tables.tracks.id, trackRecord.id)) + .execute() + ) + : Effect.succeed(undefined) + ) + ) + : Effect.succeed(undefined) + ) + ); + +// Ensure track exists or create it +const ensureTrack = ( + ctx: Context, + track: Track, + agent: Agent, + userDid: string, + existingTrack: SelectTrack | undefined +) => + pipe( + Effect.succeed(existingTrack), + Effect.tap((trackOpt) => + Match.value(trackOpt).pipe( + Match.when( + (value) => !!value, + () => updateTrackMetadata(ctx, track, trackOpt) + ), + Match.orElse(() => Effect.succeed(undefined)) + ) + ), + Effect.flatMap((trackOpt) => + pipe( + Effect.tryPromise(() => + ctx.db + .select() + .from(tables.userTracks) + .leftJoin( + tables.tracks, + eq(tables.userTracks.trackId, tables.tracks.id) + ) + .leftJoin( + tables.users, + eq(tables.userTracks.userId, tables.users.id) + ) + .where( + and( + eq(tables.tracks.id, trackOpt?.id), + eq(tables.users.did, userDid) + ) + ) + .execute() + .then(([row]) => row.user_tracks) + ), + Effect.flatMap((userTrack) => + Option.isNone(Option.fromNullable(userTrack)) || + !userTrack?.uri?.includes(userDid) + ? putSongRecord(track, agent) + : Effect.succeed(null) + ) + ) + ) + ); + +// Ensure album exists or create it +const ensureAlbum = ( + ctx: Context, + track: Track, + agent: Agent, + userDid: string +) => + pipe( + computeAlbumHash(track), + Effect.flatMap((albumHash) => + Effect.tryPromise(() => + ctx.db + .select() + .from(tables.albums) + .where(eq(tables.albums.sha256, albumHash)) + .execute() + .then(([row]) => row) + ) + ), + Effect.flatMap((existingAlbum) => + pipe( + Option.fromNullable(existingAlbum), + Effect.flatMap((album) => + Effect.tryPromise(() => + ctx.db + .select() + .from(tables.userAlbums) + .leftJoin( + tables.albums, + eq(tables.userAlbums.albumId, tables.albums.id) + ) + .leftJoin( + tables.users, + eq(tables.userAlbums.userId, tables.users.id) + ) + .where( + and( + eq(tables.albums.id, album.id), + eq(tables.users.did, userDid) + ) + ) + .execute() + .then(([row]) => row.user_albums) + ) + ), + Effect.flatMap((userAlbum) => + Option.isNone(Option.fromNullable(existingAlbum)) || + Option.isNone(Option.fromNullable(userAlbum)) || + !userAlbum?.uri?.includes(userDid) + ? putAlbumRecord(track, agent) + : Effect.succeed(null) + ) + ) + ) + ); + +// Ensure artist exists or create it +const ensureArtist = ( + ctx: Context, + track: Track, + agent: Agent, + userDid: string +) => + pipe( + computeArtistHash(track), + Effect.flatMap((artistHash) => + Effect.tryPromise(() => + ctx.db + .select() + .from(tables.artists) + .where(eq(tables.artists.sha256, artistHash)) + .execute() + .then(([row]) => row) + ) + ), + Effect.flatMap((existingArtist) => + pipe( + Option.fromNullable(existingArtist), + Effect.flatMap((artist) => + Effect.tryPromise(() => + ctx.db + .select() + .from(tables.userArtists) + .leftJoin( + tables.artists, + eq(tables.userArtists.artistId, tables.artists.id) + ) + .leftJoin( + tables.users, + eq(tables.userArtists.userId, tables.users.id) + ) + .where( + and( + eq(tables.artists.id, artist.id), + eq(tables.users.did, userDid) + ) + ) + .execute() + .then(([row]) => row.user_artists) + ) + ), + Effect.flatMap((userArtist) => + Effect.if( + Option.isNone(Option.fromNullable(existingArtist)) || + Option.isNone(Option.fromNullable(userArtist)) || + !userArtist?.uri?.includes(userDid), + { + onTrue: () => putArtistRecord(track, agent), + onFalse: () => Effect.succeed(null), + } + ) + ) + ) + ) + ); + +// Retry fetching track until metadata is ready +const retryFetchTrack = ( + ctx: Context, + trackHash: string, + initialTrack: SelectTrack | undefined +) => + pipe( + Effect.iterate( + { tries: 0, track: initialTrack }, + { + while: ({ tries, track }) => + tries < 30 && !(track?.artistUri && track?.albumUri), + body: ({ tries, track }) => + pipe( + Effect.tryPromise(() => + ctx.db + .select() + .from(tables.tracks) + .where(eq(tables.tracks.sha256, trackHash)) + .execute() + .then(([row]) => row) + ), + Effect.flatMap((trackRecord) => + Option.fromNullable(trackRecord).pipe( + Effect.flatMap((track) => + updateTrackMetadata(ctx, track, trackRecord) + ) + ) + ), + Effect.tap((trackRecord) => + Effect.logInfo( + trackRecord + ? `Track metadata ready: ${chalk.cyan(trackRecord.id)} - ${track.title}, after ${chalk.magenta(tries + 1)} tries` + : `Retrying track fetch: ${chalk.magenta(tries + 1)}` + ) + ), + Effect.map((trackRecord) => ({ + tries: tries + 1, + track: trackRecord, + })), + Effect.delay("1 second") + ), + } + ), + Effect.tap(({ tries, track }) => + tries >= 30 && !(track?.artistUri && track?.albumUri) + ? Effect.logError( + `Track metadata not ready after ${chalk.magenta("30 tries")}` + ) + : Effect.succeed(undefined) + ), + Effect.map(({ track }) => track) + ); + +// Retry fetching scrobble until complete +const retryFetchScrobble = (ctx: Context, scrobbleUri: string) => + pipe( + Effect.iterate( + { + tries: 0, + scrobble: null as { + tracks?: SelectTrack; + albums?: SelectAlbum; + artists?: SelectArtist; + users?: SelectUser; + scrobbles?: SelectScrobble; + } | null, + }, + { + while: ({ tries, scrobble }) => + tries < 30 && + !( + scrobble && + scrobble.tracks && + scrobble.albums && + scrobble.artists && + scrobble.albums.artistUri && + scrobble.tracks.artistUri && + scrobble.tracks.albumUri && + scrobble.scrobbles + ), + body: ({ tries }) => + pipe( + Effect.tryPromise(() => + ctx.db + .select() + .from(tables.scrobbles) + .leftJoin( + tables.tracks, + eq(tables.scrobbles.trackId, tables.tracks.id) + ) + .leftJoin( + tables.albums, + eq(tables.scrobbles.albumId, tables.albums.id) + ) + .leftJoin( + tables.artists, + eq(tables.scrobbles.artistId, tables.artists.id) + ) + .leftJoin( + tables.users, + eq(tables.scrobbles.userId, tables.users.id) + ) + .where(eq(tables.scrobbles.uri, scrobbleUri)) + .execute() + .then(([row]) => row) + ), + Effect.tap((scrobble) => + Effect.if( + !!scrobble && + !!scrobble.albums && + !scrobble.albums.artistUri && + !!scrobble.artists.uri, + { + onTrue: () => + Effect.tryPromise(() => + ctx.db + .update(tables.albums) + .set({ + artistUri: scrobble.artists.uri, + }) + .where(eq(tables.albums.id, scrobble.albums.id)) + .execute() + ), + onFalse: () => Effect.succeed(undefined), + } + ) + ), + Effect.flatMap(() => + Effect.tryPromise(() => + ctx.db + .select() + .from(tables.scrobbles) + .leftJoin( + tables.tracks, + eq(tables.scrobbles.trackId, tables.tracks.id) + ) + .leftJoin( + tables.albums, + eq(tables.scrobbles.albumId, tables.albums.id) + ) + .leftJoin( + tables.artists, + eq(tables.scrobbles.artistId, tables.artists.id) + ) + .leftJoin( + tables.users, + eq(tables.scrobbles.userId, tables.users.id) + ) + .where(eq(tables.scrobbles.uri, scrobbleUri)) + .execute() + .then(([row]) => row) + ) + ), + Effect.map((scrobble) => ({ + tries: tries + 1, + scrobble, + })), + Effect.tap(({ scrobble, tries }) => + Effect.logInfo( + scrobble && + scrobble.tracks && + scrobble.albums && + scrobble.artists && + scrobble.albums.artistUri && + scrobble.tracks.artistUri && + scrobble.tracks.albumUri && + scrobble.scrobbles + ? `Scrobble found after ${chalk.magenta(tries + 1)} tries` + : `Scrobble not found, trying again: ${chalk.magenta(tries + 1)}` + ) + ), + Effect.delay("1 second") + ), + } + ), + Effect.tap(({ tries, scrobble }) => + tries >= 30 && + !( + scrobble && + scrobble.tracks && + scrobble.albums && + scrobble.artists && + scrobble.albums.artistUri && + scrobble.tracks.artistUri && + scrobble.tracks.albumUri + ) + ? Effect.logError( + `Scrobble not found after ${chalk.magenta("30 tries")}` + ) + : Effect.succeed(undefined) + ), + Effect.map(({ scrobble }) => scrobble) + ); + +export const scrobbleTrack = ( + ctx: Context, + track: Track, + agent: Agent, + userDid: string +) => + pipe( + computeTrackHash(track), + Effect.flatMap((trackHash) => + pipe( + fetchExistingTrack(ctx, trackHash), + Effect.flatMap((existingTrack) => + pipe( + ensureTrack(ctx, track, agent, userDid, existingTrack), + Effect.flatMap(() => ensureAlbum(ctx, track, agent, userDid)), + Effect.flatMap(() => ensureArtist(ctx, track, agent, userDid)), + Effect.flatMap(() => + retryFetchTrack(ctx, trackHash, existingTrack) + ), + Effect.flatMap(() => + pipe( + putScrobbleRecord(track, agent), + Effect.flatMap((scrobbleUri) => + pipe( + retryFetchScrobble(ctx, scrobbleUri), + Effect.flatMap((scrobble) => + scrobble && + scrobble.tracks && + scrobble.albums && + scrobble.artists && + scrobble.albums.artistUri && + scrobble.tracks.artistUri && + scrobble.tracks.albumUri && + scrobble.scrobbles + ? pipe( + publishScrobble(ctx, scrobble.scrobbles.id), + Effect.tap(() => + Effect.logInfo("Scrobble published") + ) + ) + : Effect.succeed(undefined) + ) + ) + ) + ) + ) + ) + ) + ) + ) + ); diff --git a/apps/api/src/xrpc/app/rocksky/scrobble/getScrobble.ts b/apps/api/src/xrpc/app/rocksky/scrobble/getScrobble.ts new file mode 100644 index 00000000..a2366f40 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/scrobble/getScrobble.ts @@ -0,0 +1,112 @@ +import { Context } from "context"; +import { count, countDistinct, eq } from "drizzle-orm"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { ScrobbleViewDetailed } from "lexicon/types/app/rocksky/scrobble/defs"; +import { QueryParams } from "lexicon/types/app/rocksky/scrobble/getScrobble"; +import * as R from "ramda"; +import tables from "schema"; +import { SelectScrobble } from "schema/scrobbles"; +import { SelectTrack } from "schema/tracks"; +import { SelectUser } from "schema/users"; + +export default function (server: Server, ctx: Context) { + const getScrobble = (params) => + pipe( + { params, ctx }, + retrieve, + Effect.flatMap(presentation), + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error("Error retrieving scrobble:", err); + return Effect.succeed({}); + }) + ); + server.app.rocksky.scrobble.getScrobble({ + handler: async ({ params }) => { + const result = await Effect.runPromise(getScrobble(params)); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const retrieve = ({ + params, + ctx, +}: { + params: QueryParams; + ctx: Context; +}): Effect.Effect<[Scrobble | undefined, number, number], Error> => { + return Effect.tryPromise({ + try: async () => { + const scrobble = await ctx.db + .select() + .from(tables.scrobbles) + .leftJoin(tables.tracks, eq(tables.scrobbles.trackId, tables.tracks.id)) + .leftJoin(tables.users, eq(tables.scrobbles.userId, tables.users.id)) + .where(eq(tables.scrobbles.uri, params.uri)) + .execute() + .then((rows) => rows[0]); + return Promise.all([ + Promise.resolve(scrobble), + // count the number of listeners + ctx.db + .select({ + count: countDistinct(tables.scrobbles.userId), + }) + .from(tables.scrobbles) + .leftJoin( + tables.tracks, + eq(tables.tracks.id, tables.scrobbles.trackId) + ) + .leftJoin(tables.users, eq(tables.scrobbles.userId, tables.users.id)) + .where(eq(tables.scrobbles.trackId, scrobble?.tracks.id)) + .execute() + .then((rows) => rows[0]?.count || 0), + // count the number of scrobbles + ctx.db + .select({ count: count() }) + .from(tables.scrobbles) + .leftJoin( + tables.tracks, + eq(tables.scrobbles.trackId, tables.tracks.id) + ) + .where(eq(tables.scrobbles.trackId, scrobble?.tracks.id)) + .execute() + .then((rows) => rows[0]?.count || 0), + ]); + }, + catch: (error) => new Error(`Failed to retrieve scrobble: ${error}`), + }); +}; + +const presentation = ([ + { scrobbles, tracks, users }, + listeners, + scrobblesCount, +]: [Scrobble | undefined, number, number]): Effect.Effect< + ScrobbleViewDetailed, + never +> => { + return Effect.sync(() => ({ + ...R.omit(["albumArt", "id"], tracks), + cover: tracks.albumArt, + date: scrobbles.timestamp.toISOString(), + user: users.handle, + uri: scrobbles.uri, + tags: [], + listeners, + scrobbles: scrobblesCount, + id: scrobbles.id, + })); +}; + +type Scrobble = { + scrobbles: SelectScrobble; + tracks: SelectTrack; + users: SelectUser; +}; diff --git a/apps/api/src/xrpc/app/rocksky/scrobble/getScrobbles.ts b/apps/api/src/xrpc/app/rocksky/scrobble/getScrobbles.ts new file mode 100644 index 00000000..059bc127 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/scrobble/getScrobbles.ts @@ -0,0 +1,80 @@ +import { Context } from "context"; +import { desc, eq } from "drizzle-orm"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { ScrobbleViewBasic } from "lexicon/types/app/rocksky/scrobble/defs"; +import { QueryParams } from "lexicon/types/app/rocksky/scrobble/getScrobbles"; +import * as R from "ramda"; +import tables from "schema"; +import { SelectScrobble } from "schema/scrobbles"; +import { SelectTrack } from "schema/tracks"; +import { SelectUser } from "schema/users"; + +export default function (server: Server, ctx: Context) { + const getScrobbles = (params) => + pipe( + { params, ctx }, + retrieve, + Effect.flatMap(presentation), + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error("Error retrieving scrobbles:", err); + return Effect.succeed({ scrobbles: [] }); + }) + ); + server.app.rocksky.scrobble.getScrobbles({ + handler: async ({ params }) => { + const result = await Effect.runPromise(getScrobbles(params)); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const retrieve = ({ + params, + ctx, +}: { + params: QueryParams; + ctx: Context; +}): Effect.Effect => { + return Effect.tryPromise({ + try: () => + ctx.db + .select() + .from(tables.scrobbles) + .leftJoin(tables.tracks, eq(tables.scrobbles.trackId, tables.tracks.id)) + .leftJoin(tables.users, eq(tables.scrobbles.userId, tables.users.id)) + .orderBy(desc(tables.scrobbles.timestamp)) + .offset(params.offset || 0) + .limit(params.limit || 20) + .execute(), + + catch: (error) => new Error(`Failed to retrieve scrobbles: ${error}`), + }); +}; + +const presentation = ( + data: Scrobbles +): Effect.Effect<{ scrobbles: ScrobbleViewBasic[] }, never> => { + return Effect.sync(() => ({ + scrobbles: data.map(({ scrobbles, tracks, users }) => ({ + ...R.omit(["albumArt", "id", "lyrics"])(tracks), + cover: tracks.albumArt, + date: scrobbles.timestamp.toISOString(), + user: users.handle, + uri: scrobbles.uri, + tags: [], + id: scrobbles.id, + })), + })); +}; + +type Scrobbles = { + scrobbles: SelectScrobble; + tracks: SelectTrack; + users: SelectUser; +}[]; diff --git a/apps/api/src/xrpc/app/rocksky/shout/createShout.ts b/apps/api/src/xrpc/app/rocksky/shout/createShout.ts new file mode 100644 index 00000000..c6eb62dc --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/shout/createShout.ts @@ -0,0 +1,122 @@ +import { Agent } from "@atproto/api"; +import { HandlerAuth } from "@atproto/xrpc-server"; +import { Context } from "context"; +import { eq } from "drizzle-orm"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { InputSchema } from "lexicon/types/app/rocksky/shout/createShout"; +import { createAgent } from "lib/agent"; +import tables from "schema"; +import { SelectUser } from "schema/users"; + +export default function (server: Server, ctx: Context) { + const createShout = (input, auth: HandlerAuth) => + pipe( + { input, ctx, did: auth.credentials?.did }, + withAgent, + Effect.flatMap(withUser), + Effect.flatMap(putRecord), + Effect.flatMap(saveIntoDatabase), + Effect.flatMap(presentation), + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({}); + }) + ); + server.app.rocksky.shout.createShout({ + auth: ctx.authVerifier, + handler: async ({ input, auth }) => { + const result = await Effect.runPromise(createShout(input.body, auth)); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const withAgent = ({ + input, + ctx, + did, +}: { + input: InputSchema; + ctx: Context; + did: string; +}): Effect.Effect< + { + agent: Agent; + ctx: Context; + did: string; + input: InputSchema; + }, + Error +> => { + return Effect.tryPromise({ + try: async () => + createAgent(ctx.oauthClient, did).then((agent) => ({ + agent, + ctx, + did, + input, + })), + catch: (error) => new Error(`Failed to create agent: ${error}`), + }); +}; + +const withUser = ({ + input, + ctx, + did, + agent, +}: { + input: InputSchema; + ctx: Context; + did?: string; + agent: Agent; +}) => { + return Effect.tryPromise({ + try: async () => + ctx.db + .select() + .from(tables.users) + .where(eq(tables.users.did, did)) + .execute() + .then((users) => ({ user: users[0], ctx, input, agent })), + catch: (error) => new Error(`Failed to retrieve current user: ${error}`), + }); +}; + +const putRecord = ({ + input, + ctx, + did, + user, + agent, +}: { + input: InputSchema; + ctx: Context; + did?: string; + user: SelectUser; + agent: Agent; +}) => { + return Effect.tryPromise({ + try: async () => {}, + catch: (error) => new Error(`Failed to put shout record: ${error}`), + }); +}; + +const saveIntoDatabase = () => { + return Effect.tryPromise({ + try: async () => {}, + catch: (error) => new Error(`Failed to create shout: ${error}`), + }); +}; + +const presentation = () => { + return Effect.sync(() => ({ + shouts: [], + })); +}; diff --git a/apps/api/src/xrpc/app/rocksky/shout/getAlbumShouts.ts b/apps/api/src/xrpc/app/rocksky/shout/getAlbumShouts.ts new file mode 100644 index 00000000..db5f2244 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/shout/getAlbumShouts.ts @@ -0,0 +1,161 @@ +import { HandlerAuth } from "@atproto/xrpc-server"; +import { Context } from "context"; +import { count, desc, eq } from "drizzle-orm"; +import { sql } from "drizzle-orm/sql"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { ShoutView } from "lexicon/types/app/rocksky/shout/defs"; +import { QueryParams } from "lexicon/types/app/rocksky/shout/getAlbumShouts"; +import tables from "schema"; +import { SelectUser } from "schema/users"; + +export default function (server: Server, ctx: Context) { + const getAlbumShouts = (params, auth: HandlerAuth) => + pipe( + { params, ctx, did: auth.credentials?.did }, + getCurrentUser, + Effect.flatMap(retrieve), + Effect.flatMap(presentation), + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({ shouts: [] }); + }) + ); + server.app.rocksky.shout.getAlbumShouts({ + auth: ctx.authVerifier, + handler: async ({ params, auth }) => { + const result = await Effect.runPromise(getAlbumShouts(params, auth)); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const getCurrentUser = ({ + params, + ctx, + did, +}: { + params: QueryParams; + ctx: Context; + did?: string; +}) => { + return Effect.tryPromise({ + try: async () => + ctx.db + .select() + .from(tables.users) + .where(eq(tables.users.did, did)) + .execute() + .then((users) => ({ user: users[0], ctx, params })), + catch: (error) => new Error(`Failed to retrieve current user: ${error}`), + }); +}; + +const retrieve = ({ + user, + params, + ctx, +}: { + user?: SelectUser; + params: QueryParams; + ctx: Context; +}): Effect.Effect<{ shouts: Shouts; users: Users }[], Error> => { + return Effect.tryPromise({ + try: async () => + ctx.db + .select({ + shouts: user + ? { + id: tables.shouts.id, + content: tables.shouts.content, + createdAt: tables.shouts.createdAt, + parent: tables.shouts.parentId, + uri: tables.shouts.uri, + likes: count(tables.shoutLikes.id).as("likes"), + liked: sql` + EXISTS ( + SELECT 1 + FROM ${tables.shoutLikes} + WHERE ${tables.shoutLikes}.shout_id = ${tables.shouts}.xata_id + AND ${tables.shoutLikes}.user_id = ${user.id} + )`.as("liked"), + } + : { + id: tables.shouts.id, + content: tables.shouts.content, + createdAt: tables.shouts.createdAt, + parent: tables.shouts.parentId, + uri: tables.shouts.uri, + likes: count(tables.shoutLikes.id).as("likes"), + }, + users: { + id: tables.users.id, + did: tables.users.did, + handle: tables.users.handle, + displayName: tables.users.displayName, + avatar: tables.users.avatar, + }, + }) + .from(tables.shouts) + .leftJoin(tables.users, eq(tables.shouts.authorId, tables.users.id)) + .leftJoin(tables.albums, eq(tables.shouts.albumId, tables.albums.id)) + .leftJoin( + tables.shoutLikes, + eq(tables.shouts.id, tables.shoutLikes.shoutId) + ) + .where(eq(tables.albums.uri, params.uri)) + .groupBy( + tables.shouts.id, + tables.shouts.content, + tables.shouts.createdAt, + tables.shouts.uri, + tables.shouts.parentId, + tables.users.id, + tables.users.did, + tables.users.handle, + tables.users.displayName, + tables.users.avatar + ) + .orderBy(desc(tables.shouts.createdAt)) + .execute(), + catch: (error) => new Error(`Failed to retrieve album shouts: ${error}`), + }); +}; + +const presentation = ( + data: { + shouts: Shouts; + users: Users; + }[] +): Effect.Effect => { + return Effect.sync(() => ({ + shouts: data.map((item) => ({ + ...item.shouts, + createdAt: item.shouts.createdAt.toISOString(), + author: item.users, + })), + })); +}; + +type Shouts = { + id: string; + content: string; + createdAt: Date; + parent?: string; + uri: string; + likes: number; + liked?: boolean; +}; + +type Users = { + id: string; + did: string; + handle: string; + displayName: string; + avatar: string; +}; diff --git a/apps/api/src/xrpc/app/rocksky/shout/getArtistShouts.ts b/apps/api/src/xrpc/app/rocksky/shout/getArtistShouts.ts new file mode 100644 index 00000000..84c820d6 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/shout/getArtistShouts.ts @@ -0,0 +1,160 @@ +import { HandlerAuth } from "@atproto/xrpc-server"; +import { Context } from "context"; +import { count, desc, eq, sql } from "drizzle-orm"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { ShoutView } from "lexicon/types/app/rocksky/shout/defs"; +import { QueryParams } from "lexicon/types/app/rocksky/shout/getArtistShouts"; +import tables from "schema"; +import { SelectUser } from "schema/users"; + +export default function (server: Server, ctx: Context) { + const getArtistShouts = (params, auth: HandlerAuth) => + pipe( + { params, ctx, did: auth.credentials?.did }, + getCurrentUser, + Effect.flatMap(retrieve), + Effect.flatMap(presentation), + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({ shouts: [] }); + }) + ); + server.app.rocksky.shout.getArtistShouts({ + auth: ctx.authVerifier, + handler: async ({ params, auth }) => { + const result = await Effect.runPromise(getArtistShouts(params, auth)); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const getCurrentUser = ({ + params, + ctx, + did, +}: { + params: QueryParams; + ctx: Context; + did?: string; +}) => { + return Effect.tryPromise({ + try: async () => + ctx.db + .select() + .from(tables.users) + .where(eq(tables.users.did, did)) + .execute() + .then((users) => ({ user: users[0], ctx, params })), + catch: (error) => new Error(`Failed to retrieve current user: ${error}`), + }); +}; + +const retrieve = ({ + user, + params, + ctx, +}: { + user?: SelectUser; + params: QueryParams; + ctx: Context; +}): Effect.Effect<{ shouts: Shouts; users: Users }[], Error> => { + return Effect.tryPromise({ + try: async () => + ctx.db + .select({ + shouts: user + ? { + id: tables.shouts.id, + content: tables.shouts.content, + createdAt: tables.shouts.createdAt, + uri: tables.shouts.uri, + parent: tables.shouts.parentId, + likes: count(tables.shoutLikes.id).as("likes"), + liked: sql` + EXISTS ( + SELECT 1 + FROM ${tables.shoutLikes} + WHERE ${tables.shoutLikes}.shout_id = ${tables.shouts}.xata_id + AND ${tables.shoutLikes}.user_id = ${user.id} + )`.as("liked"), + } + : { + id: tables.shouts.id, + content: tables.shouts.content, + createdAt: tables.shouts.createdAt, + parent: tables.shouts.parentId, + uri: tables.shouts.uri, + likes: count(tables.shoutLikes.id).as("likes"), + }, + users: { + id: tables.users.id, + did: tables.users.did, + handle: tables.users.handle, + displayName: tables.users.displayName, + avatar: tables.users.avatar, + }, + }) + .from(tables.shouts) + .leftJoin(tables.users, eq(tables.shouts.authorId, tables.users.id)) + .leftJoin(tables.artists, eq(tables.shouts.artistId, tables.artists.id)) + .leftJoin( + tables.shoutLikes, + eq(tables.shouts.id, tables.shoutLikes.shoutId) + ) + .where(eq(tables.artists.uri, params.uri)) + .groupBy( + tables.shouts.id, + tables.shouts.content, + tables.shouts.createdAt, + tables.shouts.uri, + tables.shouts.parentId, + tables.users.id, + tables.users.did, + tables.users.handle, + tables.users.displayName, + tables.users.avatar + ) + .orderBy(desc(tables.shouts.createdAt)) + .execute(), + catch: (error) => new Error(`Failed to retrieve artist shouts: ${error}`), + }); +}; + +const presentation = ( + data: { + shouts: Shouts; + users: Users; + }[] +): Effect.Effect => { + return Effect.sync(() => ({ + shouts: data.map((item) => ({ + ...item.shouts, + createdAt: item.shouts.createdAt.toISOString(), + author: item.users, + })), + })); +}; + +type Shouts = { + id: string; + content: string; + createdAt: Date; + parent?: string; + uri: string; + likes: number; + liked?: boolean; +}; + +type Users = { + id: string; + did: string; + handle: string; + displayName: string; + avatar: string; +}; diff --git a/apps/api/src/xrpc/app/rocksky/shout/getProfileShouts.ts b/apps/api/src/xrpc/app/rocksky/shout/getProfileShouts.ts new file mode 100644 index 00000000..df63119e --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/shout/getProfileShouts.ts @@ -0,0 +1,178 @@ +import { Context } from "context"; +import { aliasedTable, count, desc, eq, or, sql } from "drizzle-orm"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { ShoutView } from "lexicon/types/app/rocksky/shout/defs"; +import { QueryParams } from "lexicon/types/app/rocksky/shout/getProfileShouts"; +import tables from "schema"; + +export default function (server: Server, ctx: Context) { + const getProfileShouts = (params) => + pipe( + { params, ctx }, + retrieve, + Effect.flatMap(presentation), + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({ shouts: [] }); + }) + ); + server.app.rocksky.shout.getProfileShouts({ + auth: ctx.authVerifier, + handler: async ({ params }) => { + const result = await Effect.runPromise(getProfileShouts(params)); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const retrieve = ({ + params, + ctx, +}: { + params: QueryParams; + ctx: Context; +}): Effect.Effect<{ shouts: Shouts; users: Users }[], Error> => { + return Effect.tryPromise({ + try: async () => { + const [user] = await ctx.db + .select() + .from(tables.users) + .where( + or( + eq(tables.users.did, params.did), + eq(tables.users.handle, params.did) + ) + ) + .execute(); + return ctx.db + .select({ + profileShouts: { + id: tables.profileShouts.id, + createdAt: tables.profileShouts.createdAt, + }, + shouts: user + ? { + id: tables.shouts.id, + content: tables.shouts.content, + createdAt: tables.shouts.createdAt, + uri: tables.shouts.uri, + parent: tables.shouts.parentId, + likes: count(tables.shoutLikes.id).as("likes"), + liked: sql` + EXISTS ( + SELECT 1 + FROM ${tables.shoutLikes} + WHERE ${tables.shoutLikes}.shout_id = ${tables.shouts}.xata_id + AND ${tables.shoutLikes}.user_id = ${user.id} + )`.as("liked"), + reported: sql` + EXISTS ( + SELECT 1 + FROM ${tables.shoutReports} + WHERE ${tables.shoutReports}.shout_id = ${tables.shouts}.xata_id + AND ${tables.shoutReports}.user_id = ${user.id} + )`.as("reported"), + } + : { + id: tables.shouts.id, + content: tables.shouts.content, + createdAt: tables.shouts.createdAt, + uri: tables.shouts.uri, + parent: tables.shouts.parentId, + likes: count(tables.shoutLikes.id).as("likes"), + }, + users: { + id: aliasedTable(tables.users, "authors").id, + did: aliasedTable(tables.users, "authors").did, + handle: aliasedTable(tables.users, "authors").handle, + displayName: aliasedTable(tables.users, "authors").displayName, + avatar: aliasedTable(tables.users, "authors").avatar, + }, + }) + .from(tables.profileShouts) + .where( + or( + eq(tables.users.did, params.did), + eq(tables.users.handle, params.did) + ) + ) + .leftJoin( + tables.shouts, + eq(tables.profileShouts.shoutId, tables.shouts.id) + ) + .leftJoin( + aliasedTable(tables.users, "authors"), + eq(tables.shouts.authorId, aliasedTable(tables.users, "authors").id) + ) + .leftJoin( + tables.users, + eq(tables.profileShouts.userId, tables.users.id) + ) + .leftJoin( + tables.shoutLikes, + eq(tables.shouts.id, tables.shoutLikes.shoutId) + ) + .groupBy( + tables.profileShouts.id, + tables.profileShouts.createdAt, + tables.shouts.id, + tables.shouts.uri, + tables.shouts.content, + tables.shouts.createdAt, + tables.shouts.parentId, + tables.users.id, + tables.users.did, + tables.users.handle, + tables.users.displayName, + tables.users.avatar, + aliasedTable(tables.users, "authors").id, + aliasedTable(tables.users, "authors").did, + aliasedTable(tables.users, "authors").handle, + aliasedTable(tables.users, "authors").displayName, + aliasedTable(tables.users, "authors").avatar + ) + .orderBy(desc(tables.profileShouts.createdAt)) + .execute(); + }, + catch: (error) => new Error(`Failed to retrieve profile shouts: ${error}`), + }); +}; + +const presentation = ( + data: { + shouts: Shouts; + users: Users; + }[] +): Effect.Effect => { + return Effect.sync(() => ({ + shouts: data.map((item) => ({ + ...item.shouts, + createdAt: item.shouts.createdAt.toISOString(), + author: item.users, + })), + })); +}; + +type Shouts = { + id: string; + content: string; + createdAt: Date; + parent?: string; + uri: string; + likes: number; + liked?: boolean; +}; + +type Users = { + id: string; + did: string; + handle: string; + displayName: string; + avatar: string; +}; diff --git a/apps/api/src/xrpc/app/rocksky/shout/getShoutReplies.ts b/apps/api/src/xrpc/app/rocksky/shout/getShoutReplies.ts new file mode 100644 index 00000000..6be60eef --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/shout/getShoutReplies.ts @@ -0,0 +1,78 @@ +import { Context } from "context"; +import { asc, eq } from "drizzle-orm"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { ShoutView } from "lexicon/types/app/rocksky/shout/defs"; +import { QueryParams } from "lexicon/types/app/rocksky/shout/getShoutReplies"; +import tables from "schema"; +import { SelectShout } from "schema/shouts"; +import { SelectUser } from "schema/users"; + +export default function (server: Server, ctx: Context) { + const getShoutReplies = (params) => + pipe( + { params, ctx }, + retrieve, + Effect.flatMap(presentation), + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({ shouts: [] }); + }) + ); + server.app.rocksky.shout.getShoutReplies({ + auth: ctx.authVerifier, + handler: async ({ params }) => { + const result = await Effect.runPromise(getShoutReplies(params)); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const retrieve = ({ + params, + ctx, +}: { + params: QueryParams; + ctx: Context; +}): Effect.Effect<{ shouts: SelectShout; users: SelectUser }[], Error> => { + return Effect.tryPromise({ + try: async () => + ctx.db + .select({ + shouts: tables.shouts, + users: tables.users, + }) + .from(tables.shouts) + .leftJoin(tables.users, eq(tables.shouts.authorId, tables.users.id)) + .where(eq(tables.shouts.parentId, params.uri)) + .orderBy(asc(tables.shouts.createdAt)) + .execute(), + catch: (error) => new Error(`Failed to retrieve shout replies: ${error}`), + }); +}; + +const presentation = ( + data: { shouts: SelectShout; users: SelectUser }[] +): Effect.Effect => { + return Effect.sync(() => ({ + shouts: data.map((item) => ({ + id: item.shouts.id, + content: item.shouts.content, + parent: item.shouts.parentId, + uri: item.shouts.uri, + createdAt: item.shouts.createdAt.toISOString(), + author: { + id: item.users.id, + did: item.users.did, + handle: item.users.handle, + displayName: item.users.displayName, + avatar: item.users.avatar, + }, + })), + })); +}; diff --git a/apps/api/src/xrpc/app/rocksky/shout/getTrackShouts.ts b/apps/api/src/xrpc/app/rocksky/shout/getTrackShouts.ts new file mode 100644 index 00000000..18c3fa1d --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/shout/getTrackShouts.ts @@ -0,0 +1,140 @@ +import { Context } from "context"; +import { count, desc, eq, sql } from "drizzle-orm"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { ShoutView } from "lexicon/types/app/rocksky/shout/defs"; +import { QueryParams } from "lexicon/types/app/rocksky/shout/getTrackShouts"; +import tables from "schema"; + +export default function (server: Server, ctx: Context) { + const getTrackShouts = (params) => + pipe( + { params, ctx }, + retrieve, + Effect.flatMap(presentation), + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({ shouts: [] }); + }) + ); + server.app.rocksky.shout.getTrackShouts({ + auth: ctx.authVerifier, + handler: async ({ params }) => { + const result = await Effect.runPromise(getTrackShouts(params)); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const retrieve = ({ + params, + ctx, +}: { + params: QueryParams; + ctx: Context; +}): Effect.Effect<{ shouts: Shouts; users: Users }[], Error> => { + return Effect.tryPromise({ + try: async () => { + const [user] = await ctx.db + .select() + .from(tables.users) + .where(eq(tables.users.did, "did")) + .execute(); + return ctx.db + .select({ + shouts: user + ? { + id: tables.shouts.id, + content: tables.shouts.content, + createdAt: tables.shouts.createdAt, + uri: tables.shouts.uri, + parent: tables.shouts.parentId, + likes: count(tables.shoutLikes.id).as("likes"), + liked: sql` + EXISTS ( + SELECT 1 + FROM ${tables.shoutLikes} + WHERE ${tables.shoutLikes}.shout_id = ${tables.shouts}.xata_id + AND ${tables.shoutLikes}.user_id = ${user.id} + )`.as("liked"), + } + : { + id: tables.shouts.id, + content: tables.shouts.content, + createdAt: tables.shouts.createdAt, + uri: tables.shouts.uri, + parent: tables.shouts.parentId, + likes: count(tables.shoutLikes.id).as("likes"), + }, + users: { + id: tables.users.id, + did: tables.users.did, + handle: tables.users.handle, + displayName: tables.users.displayName, + avatar: tables.users.avatar, + }, + }) + .from(tables.shouts) + .leftJoin(tables.users, eq(tables.shouts.authorId, tables.users.id)) + .leftJoin(tables.tracks, eq(tables.shouts.trackId, tables.tracks.id)) + .leftJoin( + tables.shoutLikes, + eq(tables.shouts.id, tables.shoutLikes.shoutId) + ) + .where(eq(tables.tracks.uri, params.uri)) + .groupBy( + tables.shouts.id, + tables.shouts.content, + tables.shouts.createdAt, + tables.shouts.uri, + tables.shouts.parentId, + tables.users.id, + tables.users.did, + tables.users.handle, + tables.users.displayName, + tables.users.avatar + ) + .orderBy(desc(tables.shouts.createdAt)) + .execute(); + }, + catch: (error) => new Error(`Failed to retrieve track shouts: ${error}`), + }); +}; + +const presentation = ( + data: { + shouts: Shouts; + users: Users; + }[] +): Effect.Effect => { + return Effect.sync(() => ({ + shouts: data.map((item) => ({ + ...item.shouts, + createdAt: item.shouts.createdAt.toISOString(), + author: item.users, + })), + })); +}; + +type Shouts = { + id: string; + content: string; + createdAt: Date; + parent?: string; + uri: string; + likes: number; + liked?: boolean; +}; + +type Users = { + id: string; + did: string; + handle: string; + displayName: string; + avatar: string; +}; diff --git a/apps/api/src/xrpc/app/rocksky/shout/removeShout.ts b/apps/api/src/xrpc/app/rocksky/shout/removeShout.ts new file mode 100644 index 00000000..cb96d3f4 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/shout/removeShout.ts @@ -0,0 +1,74 @@ +import { Agent } from "@atproto/api"; +import { HandlerAuth } from "@atproto/xrpc-server"; +import { Context } from "context"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { QueryParams } from "lexicon/types/app/rocksky/shout/removeShout"; +import { createAgent } from "lib/agent"; + +export default function (server: Server, ctx: Context) { + const removeShout = (params, auth: HandlerAuth) => + pipe( + { params, ctx }, + remove, + Effect.flatMap(presentation), + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({}); + }) + ); + server.app.rocksky.shout.removeShout({ + auth: ctx.authVerifier, + handler: async ({ params, auth }) => { + const result = await Effect.runPromise(removeShout(params, auth)); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const withAgent = ({ + params, + ctx, + did, +}: { + params: QueryParams; + ctx: Context; + did: string; +}): Effect.Effect< + { + agent: Agent; + ctx: Context; + did: string; + params: QueryParams; + }, + Error +> => { + return Effect.tryPromise({ + try: async () => + createAgent(ctx.oauthClient, did).then((agent) => ({ + agent, + ctx, + did, + params, + })), + catch: (error) => new Error(`Failed to create agent: ${error}`), + }); +}; + +const remove = () => { + return Effect.tryPromise({ + try: async () => {}, + catch: (error) => new Error(`Failed to remove shout: ${error}`), + }); +}; + +const presentation = () => { + return Effect.sync(() => ({ + shouts: [], + })); +}; diff --git a/apps/api/src/xrpc/app/rocksky/shout/replyShout.ts b/apps/api/src/xrpc/app/rocksky/shout/replyShout.ts new file mode 100644 index 00000000..537f207d --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/shout/replyShout.ts @@ -0,0 +1,74 @@ +import { Agent } from "@atproto/api"; +import { HandlerAuth } from "@atproto/xrpc-server"; +import { Context } from "context"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { QueryParams } from "lexicon/types/app/rocksky/shout/replyShout"; +import { createAgent } from "lib/agent"; + +export default function (server: Server, ctx: Context) { + const replyShout = (params, auth: HandlerAuth) => + pipe( + { params, ctx }, + reply, + Effect.flatMap(presentation), + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({ albums: [] }); + }) + ); + server.app.rocksky.shout.replyShout({ + auth: ctx.authVerifier, + handler: async ({ params, auth }) => { + const result = await Effect.runPromise(replyShout(params, auth)); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const withAgent = ({ + params, + ctx, + did, +}: { + params: QueryParams; + ctx: Context; + did: string; +}): Effect.Effect< + { + agent: Agent; + ctx: Context; + did: string; + params: QueryParams; + }, + Error +> => { + return Effect.tryPromise({ + try: async () => + createAgent(ctx.oauthClient, did).then((agent) => ({ + agent, + ctx, + did, + params, + })), + catch: (error) => new Error(`Failed to create agent: ${error}`), + }); +}; + +const reply = () => { + return Effect.tryPromise({ + try: async () => {}, + catch: (error) => new Error(`Failed to reply to shout: ${error}`), + }); +}; + +const presentation = () => { + return Effect.sync(() => ({ + shouts: [], + })); +}; diff --git a/apps/api/src/xrpc/app/rocksky/shout/reportShout.ts b/apps/api/src/xrpc/app/rocksky/shout/reportShout.ts new file mode 100644 index 00000000..eb744d73 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/shout/reportShout.ts @@ -0,0 +1,42 @@ +import { HandlerAuth } from "@atproto/xrpc-server"; +import { Context } from "context"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; + +export default function (server: Server, ctx: Context) { + const reportShout = (params, auth: HandlerAuth) => + pipe( + { params, ctx }, + report, + Effect.flatMap(presentation), + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({}); + }) + ); + server.app.rocksky.shout.reportShout({ + auth: ctx.authVerifier, + handler: async ({ params, auth }) => { + const result = await Effect.runPromise(reportShout(params, auth)); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const report = () => { + return Effect.tryPromise({ + try: async () => {}, + catch: (error) => new Error(`Failed to report shout: ${error}`), + }); +}; + +const presentation = () => { + return Effect.sync(() => ({ + shouts: [], + })); +}; diff --git a/apps/api/src/xrpc/app/rocksky/song/createSong.ts b/apps/api/src/xrpc/app/rocksky/song/createSong.ts new file mode 100644 index 00000000..d228e7fc --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/song/createSong.ts @@ -0,0 +1,869 @@ +import { Agent, BlobRef } from "@atproto/api"; +import { TID } from "@atproto/common"; +import { HandlerAuth } from "@atproto/xrpc-server"; +import chalk from "chalk"; +import { Context } from "context"; +import { and, eq } from "drizzle-orm"; +import { Effect, Match, Option, pipe } from "effect"; +import { NoSuchElementException, UnknownException } from "effect/Cause"; +import { Server } from "lexicon"; +import * as Album from "lexicon/types/app/rocksky/album"; +import * as Artist from "lexicon/types/app/rocksky/artist"; +import * as Song from "lexicon/types/app/rocksky/song"; +import { InputSchema } from "lexicon/types/app/rocksky/song/createSong"; +import { SongViewDetailed } from "lexicon/types/app/rocksky/song/defs"; +import { deepSnakeCaseKeys } from "lib"; +import { createAgent } from "lib/agent"; +import downloadImage from "lib/downloadImage"; +import { createHash } from "node:crypto"; +import tables from "schema"; +import { InsertAlbumTrack, SelectAlbumTrack } from "schema/album-tracks"; +import { SelectAlbum } from "schema/albums"; +import { InsertArtistAlbum, SelectArtistAlbum } from "schema/artist-albums"; +import { InsertArtistTrack, SelectArtistTrack } from "schema/artist-tracks"; +import { SelectArtist } from "schema/artists"; +import { SelectTrack } from "schema/tracks"; +import { Track, trackSchema } from "types/track"; + +export default function (server: Server, ctx: Context) { + const createSong = (input: InputSchema, auth: HandlerAuth) => + pipe( + { input, ctx, did: auth.credentials?.did }, + withAgent, + Effect.flatMap(validateInput), + Effect.flatMap(create), + Effect.flatMap(presentation), + Effect.retry({ times: 3 }), + Effect.timeout("120 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({}); + }) + ); + server.app.rocksky.song.createSong({ + auth: ctx.authVerifier, + handler: async ({ input, auth }) => { + const result = await Effect.runPromise(createSong(input.body, auth)); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const withAgent = ({ + input, + ctx, + did, +}: { + input: InputSchema; + ctx: Context; + did: string; +}): Effect.Effect => { + return Effect.tryPromise({ + try: () => + Match.value(did).pipe( + Match.when( + (value) => !!value, + () => + createAgent(ctx.oauthClient, did).then((agent) => ({ + agent, + ctx, + did, + input, + })) + ), + Match.orElse(() => { + throw new Error("Authentication required to create a song"); + }) + ), + catch: (error) => new Error(`Failed to create agent: ${error}`), + }); +}; + +const validateInput = ({ + input, + ...params +}: InputWithAgent): Effect.Effect => + Effect.try(() => ({ + ...params, + track: trackSchema.safeParse(input).data, + })); + +const create = ({ + ctx, + agent, + track, +}: ValidatedInput): Effect.Effect< + { + tries: number; + track: SelectTrack; + album: SelectAlbum; + artist: SelectArtist; + albumTrack: SelectAlbumTrack; + artistTrack: SelectArtistTrack; + artistAlbum: SelectArtistAlbum; + }, + Error | UnknownException | NoSuchElementException, + never +> => { + return saveTrack(ctx, track, agent); +}; + +const presentation = ({ + track, +}: { + tries: number; + track: SelectTrack; + album: SelectAlbum; + artist: SelectArtist; + albumTrack: SelectAlbumTrack; + artistTrack: SelectArtistTrack; + artistAlbum: SelectArtistAlbum; +}): Effect.Effect => { + return Effect.sync(() => ({ + ...track, + createdAt: track.createdAt.toISOString(), + updatedAt: track.updatedAt.toISOString(), + })); +}; + +type InputWithAgent = { + agent: Agent; + ctx: Context; + input: InputSchema; +}; + +type ValidatedInput = { + ctx: Context; + agent: Agent; + track: Track; +}; + +const computeTrackHash = (track: Track): Effect.Effect => + Effect.succeed( + createHash("sha256") + .update(`${track.title} - ${track.artist} - ${track.album}`.toLowerCase()) + .digest("hex") + ); + +const computeAlbumHash = (track: Track): Effect.Effect => + Effect.succeed( + createHash("sha256") + .update(`${track.album} - ${track.albumArtist}`.toLowerCase()) + .digest("hex") + ); + +const computeArtistHash = (track: Track): Effect.Effect => + Effect.succeed( + createHash("sha256").update(track.albumArtist.toLowerCase()).digest("hex") + ); + +const fetchExistingTrack = ( + ctx: Context, + trackHash: string +): Effect.Effect => + Effect.tryPromise(() => + ctx.db + .select() + .from(tables.tracks) + .where(eq(tables.tracks.sha256, trackHash)) + .execute() + .then(([row]) => row) + ); + +const uploadImage = (url: string, agent: Agent) => + pipe( + Effect.tryPromise(() => downloadImage(url)), + Effect.map< + Buffer, + [Buffer, { encoding: string } | undefined] + >((imageBuffer) => { + if (url.endsWith(".jpeg") || url.endsWith(".jpg")) { + return [imageBuffer, { encoding: "image/jpeg" }]; + } else if (url.endsWith(".png")) { + return [imageBuffer, { encoding: "image/png" }]; + } + return [imageBuffer, undefined]; + }), + Effect.flatMap(([imageBuffer, options]) => + pipe( + Effect.tryPromise(() => agent.uploadBlob(imageBuffer, options)), + Effect.map((uploadResponse) => uploadResponse.data.blob) + ) + ), + Effect.catchAll(() => Effect.succeed(undefined as BlobRef | undefined)) + ); + +const generateRkey = Effect.succeed(TID.nextStr()); + +const putRecord = ( + agent: Agent, + collection: string, + record: T, + validate: (record: T) => { success: boolean } +): Effect.Effect => + pipe( + Effect.succeed(record), + Effect.filterOrFail( + (rec) => validate(rec).success, + () => new Error("Invalid record") + ), + Effect.flatMap(() => + pipe( + generateRkey, + Effect.flatMap((rkey) => + Effect.tryPromise(() => + agent.com.atproto.repo.putRecord({ + repo: agent.assertDid, + collection, + rkey, + record, + validate: false, + }) + ) + ), + Effect.tap((res) => + Effect.logInfo(`Record created at ${res.data.uri}`) + ), + Effect.map((res) => res.data.uri) + ) + ), + Effect.catchAll((error) => { + console.error(`Error creating ${collection} record`, error); + return Effect.fail(error); + }) + ); + +const putArtistRecord = (track: Track, agent: Agent) => + pipe( + track.artistPicture + ? uploadImage(track.artistPicture, agent) + : Effect.succeed(undefined), + Effect.map((picture) => ({ + $type: "app.rocksky.artist", + name: track.albumArtist, + createdAt: new Date().toISOString(), + picture, + })), + Effect.flatMap((record) => + putRecord(agent, "app.rocksky.artist", record, Artist.validateRecord) + ) + ); + +const putAlbumRecord = (track: Track, agent: Agent) => + pipe( + Match.value(track.albumArt).pipe( + Match.when( + (url) => !!url, + (url) => uploadImage(url, agent) + ), + Match.orElse(() => Effect.succeed(undefined as BlobRef | undefined)) + ), + Effect.map((albumArt) => ({ + $type: "app.rocksky.album", + title: track.album, + artist: track.albumArtist, + year: track.year, + releaseDate: track.releaseDate + ? track.releaseDate.toISOString() + : undefined, + createdAt: new Date().toISOString(), + albumArt, + })), + Effect.flatMap((record) => + putRecord(agent, "app.rocksky.album", record, Album.validateRecord) + ) + ); + +const putSongRecord = (track: Track, agent: Agent) => + pipe( + Match.value(track.albumArt).pipe( + Match.when( + (url) => !!url, + (url) => uploadImage(url, agent) + ), + Match.orElse(() => Effect.succeed(undefined as BlobRef | undefined)) + ), + Effect.map((albumArt) => ({ + $type: "app.rocksky.song", + title: track.title, + artist: track.artist, + album: track.album, + albumArtist: track.albumArtist, + duration: track.duration, + releaseDate: track.releaseDate + ? track.releaseDate.toISOString() + : undefined, + year: track.year, + albumArt, + composer: track.composer ?? undefined, + lyrics: track.lyrics ?? undefined, + trackNumber: track.trackNumber, + discNumber: track.discNumber === 0 ? 1 : track.discNumber, + copyrightMessage: track.copyrightMessage ?? undefined, + createdAt: new Date().toISOString(), + spotifyLink: track.spotifyLink ?? undefined, + })), + Effect.flatMap((record) => + putRecord(agent, "app.rocksky.song", record, Song.validateRecord) + ) + ); + +const ensureTrack = (ctx: Context, track: Track, agent: Agent) => + pipe( + computeTrackHash(track), + Effect.flatMap((trackHash) => + pipe( + fetchExistingTrack(ctx, trackHash), + Effect.flatMap((existingTrack) => + pipe( + Option.fromNullable(existingTrack), + Effect.tap((trackOpt) => + trackOpt + ? updateTrackMetadata(ctx, track, trackOpt) + : Effect.succeed(undefined) + ), + Effect.flatMap((trackOpt) => + trackOpt.uri + ? Effect.succeed(trackOpt.uri) + : putSongRecord(track, agent) + ) + ) + ) + ) + ) + ); + +// Update track metadata (album_uri and artist_uri) +const updateTrackMetadata = ( + ctx: Context, + track: Track, + trackRecord: SelectTrack +) => + pipe( + Effect.succeed(trackRecord), + Effect.tap((trackRecord) => + !trackRecord.albumUri + ? pipe( + computeAlbumHash(track), + Effect.flatMap((albumHash) => + Effect.tryPromise(() => + ctx.db + .select() + .from(tables.albums) + .where(eq(tables.albums.sha256, albumHash)) + .execute() + .then(([row]) => row) + ) + ), + Effect.flatMap((album) => + Option.fromNullable(album).pipe( + Effect.flatMap((album) => + Effect.tryPromise(() => + ctx.db + .update(tables.tracks) + .set({ albumUri: album.uri }) + .where(eq(tables.tracks.id, trackRecord.id)) + .execute() + ) + ), + Effect.catchAll(() => Effect.succeed(undefined)) + ) + ) + ) + : Effect.succeed(undefined) + ), + Effect.tap((trackRecord) => + !trackRecord.artistUri + ? pipe( + computeArtistHash(track), + Effect.flatMap((artistHash) => + Effect.tryPromise(() => + ctx.db + .select() + .from(tables.artists) + .where(eq(tables.artists.sha256, artistHash)) + .execute() + .then(([row]) => row) + ) + ), + Effect.flatMap((artist) => + Option.fromNullable(artist).pipe( + Effect.flatMap((artist) => + Effect.tryPromise(() => + ctx.db + .update(tables.tracks) + .set({ artistUri: artist.uri }) + .where(eq(tables.tracks.id, trackRecord.id)) + .execute() + ) + ), + Effect.catchAll(() => Effect.succeed(undefined)) + ) + ) + ) + : Effect.succeed(undefined) + ) + ); + +// Ensure artist exists or create it +const ensureArtist = (ctx: Context, track: Track, agent: Agent) => + pipe( + computeArtistHash(track), + Effect.flatMap((artistHash) => + pipe( + Effect.tryPromise(() => + ctx.db + .select() + .from(tables.artists) + .where(eq(tables.artists.sha256, artistHash)) + .execute() + .then(([row]) => row) + ), + Effect.flatMap((existingArtist) => + pipe( + Option.fromNullable(existingArtist), + Effect.flatMap((artistOpt) => + artistOpt.uri + ? Effect.succeed(artistOpt.uri) + : putArtistRecord(track, agent) + ) + ) + ) + ) + ) + ); + +// Ensure album exists or create it +const ensureAlbum = (ctx: Context, track: Track, agent: Agent) => + pipe( + computeAlbumHash(track), + Effect.flatMap((albumHash) => + pipe( + Effect.tryPromise(() => + ctx.db + .select() + .from(tables.albums) + .where(eq(tables.albums.sha256, albumHash)) + .execute() + .then(([row]) => row) + ), + Effect.flatMap((existingAlbum) => + pipe( + Option.fromNullable(existingAlbum), + Effect.flatMap((albumOpt) => + albumOpt.uri + ? Effect.succeed(albumOpt.uri) + : putAlbumRecord(track, agent) + ) + ) + ) + ) + ) + ); + +// Fetch track, album, and artist by URIs +const fetchRecordsByUris = ( + ctx: Context, + trackUri: string, + albumUri: string, + artistUri: string +): Effect.Effect< + { + track: SelectTrack | null; + album: SelectAlbum | null; + artist: SelectArtist | null; + }, + Error +> => + Effect.all({ + track: Effect.tryPromise(() => + ctx.db + .select() + .from(tables.tracks) + .where(eq(tables.tracks.uri, trackUri)) + .execute() + .then(([row]) => row) + ), + album: Effect.tryPromise(() => + ctx.db + .select() + .from(tables.albums) + .where(eq(tables.albums.uri, albumUri)) + .execute() + .then(([row]) => row) + ), + artist: Effect.tryPromise(() => + ctx.db + .select() + .from(tables.artists) + .where(eq(tables.artists.uri, artistUri)) + .execute() + .then(([row]) => row) + ), + }); + +// Ensure relationships (album_track, artist_track, artist_album) +const ensureRelationships = ( + ctx: Context, + track: SelectTrack, + album: SelectAlbum, + artist: SelectArtist +) => + pipe( + Effect.all({ + albumTrack: Effect.tryPromise(() => + ctx.db + .select() + .from(tables.albumTracks) + .where( + and( + eq(tables.albumTracks.albumId, album.id), + eq(tables.albumTracks.trackId, track.id) + ) + ) + .execute() + .then(([row]) => row) + ), + + artistTrack: Effect.tryPromise(() => + ctx.db + .select() + .from(tables.artistTracks) + .where( + and( + eq(tables.artistTracks.artistId, artist.id), + eq(tables.artistTracks.trackId, track.id) + ) + ) + .execute() + .then(([row]) => row) + ), + artistAlbum: Effect.tryPromise(() => + ctx.db + .select() + .from(tables.artistAlbums) + .where( + and( + eq(tables.artistAlbums.artistId, artist.id), + eq(tables.artistAlbums.albumId, album.id) + ) + ) + .execute() + .then(([row]) => row) + ), + }), + Effect.flatMap(({ albumTrack, artistTrack, artistAlbum }) => + pipe( + Effect.all([ + pipe( + Option.fromNullable(albumTrack), + Effect.orElse(() => + Effect.tryPromise(() => + ctx.db + .insert(tables.albumTracks) + .values({ + albumId: album.id, + trackId: track.id, + } as InsertAlbumTrack) + .returning() + .execute() + .then(([row]) => row) + ) + ) + ), + pipe( + Option.fromNullable(artistTrack), + Effect.orElse(() => + Effect.tryPromise(() => + ctx.db + .insert(tables.artistTracks) + .values({ + artistId: artist.id, + trackId: track.id, + } as InsertArtistTrack) + .returning() + .execute() + .then(([row]) => row) + ) + ) + ), + pipe( + Option.fromNullable(artistAlbum), + Effect.orElse(() => + Effect.tryPromise(() => + ctx.db + .insert(tables.artistAlbums) + .values({ + artistId: artist.id, + albumId: album.id, + } as InsertArtistAlbum) + .returning() + .execute() + .then(([row]) => row) + ) + ) + ), + ]), + Effect.map(([albumTrack, artistTrack, artistAlbum]) => ({ + albumTrack, + artistTrack, + artistAlbum, + })) + ) + ) + ); + +// Update track with album and artist URIs if missing +const updateTrackUris = ( + ctx: Context, + track: SelectTrack, + album: SelectAlbum, + artist: SelectArtist +) => + pipe( + Effect.succeed(track), + Effect.tap((trackRecord) => + !trackRecord.albumUri + ? Effect.tryPromise(() => + ctx.db + .update(tables.tracks) + .set({ + albumUri: album.uri, + }) + .where(eq(tables.tracks.id, trackRecord.id)) + .execute() + ) + : Effect.succeed(undefined) + ), + Effect.tap((trackRecord) => + !trackRecord.artistUri + ? Effect.tryPromise(() => + ctx.db + .update(tables.tracks) + .set({ + artistUri: artist.uri, + }) + .where(eq(tables.tracks.id, trackRecord.id)) + .execute() + ) + : Effect.succeed(undefined) + ) + ); + +const publishTrack = ( + ctx: Context, + track: SelectTrack, + albumTrack: SelectAlbumTrack, + artistTrack: SelectArtistTrack, + artistAlbum: SelectArtistAlbum +) => + pipe( + Effect.succeed( + deepSnakeCaseKeys({ + track: { + ...track, + sha256: track.sha256, + uri: track.uri, + xata_createdat: track.createdAt.toISOString(), + xata_id: track.id, + xata_updatedat: track.updatedAt.toISOString(), + xata_version: track.xataVersion, + }, + album_track: { + xata_id: albumTrack.id, + album_id: { + xata_id: albumTrack.albumId, + }, + track_id: { + xata_id: albumTrack.trackId, + }, + xata_createdat: albumTrack.createdAt.toISOString(), + xata_updatedat: albumTrack.updatedAt.toISOString(), + xata_version: albumTrack.xataVersion, + }, + artist_track: { + xata_id: artistTrack.id, + artist_id: { + xata_id: artistTrack.artistId, + }, + track_id: { + xata_id: artistTrack.trackId, + }, + xata_createdat: artistTrack.createdAt.toISOString(), + xata_updatedat: artistTrack.updatedAt.toISOString(), + xata_version: artistTrack.xataVersion, + }, + artist_album: { + xata_id: artistAlbum.id, + artist_id: { + xata_id: artistAlbum.artistId, + }, + album_id: { + xata_id: artistAlbum.albumId, + }, + xata_createdat: artistAlbum.createdAt.toISOString(), + xata_updatedat: artistAlbum.updatedAt.toISOString(), + xata_version: artistAlbum.xataVersion, + }, + }) + ), + Effect.flatMap((message) => + Effect.try(() => + ctx.nc.publish( + "rocksky.track", + Buffer.from(JSON.stringify(message).replaceAll("sha_256", "sha256")) + ) + ) + ) + ); + +export const saveTrack = (ctx: Context, track: Track, agent: Agent) => + pipe( + Effect.all({ + trackUri: ensureTrack(ctx, track, agent), + albumUri: ensureAlbum(ctx, track, agent), + artistUri: ensureArtist(ctx, track, agent), + }), + Effect.flatMap(({ trackUri, albumUri, artistUri }) => + pipe( + Effect.iterate( + { + tries: 0, + track: null, + album: null, + artist: null, + albumTrack: null, + artistTrack: null, + artistAlbum: null, + }, + { + while: ({ + tries, + track, + album, + artist, + albumTrack, + artistTrack, + artistAlbum, + }) => + tries < 15 && + !( + track && + album && + artist && + albumTrack && + artistTrack && + artistAlbum && + track.albumUri && + track.artistUri + ), + body: ({ tries }) => + pipe( + fetchRecordsByUris(ctx, trackUri, albumUri, artistUri), + Effect.flatMap(({ track, album, artist }) => + pipe( + Effect.all([ + Option.fromNullable(track).pipe( + Effect.filterOrFail( + () => !!track, + () => + new Error(`Track not found for uri: ${trackUri}`) + ) + ), + Option.fromNullable(album).pipe( + Effect.filterOrFail( + () => !!album, + () => + new Error(`Album not found for uri: ${albumUri}`) + ) + ), + Option.fromNullable(artist).pipe( + Effect.filterOrFail( + () => !!artist, + () => + new Error(`Artist not found for uri: ${artistUri}`) + ) + ), + ]), + Effect.flatMap(([track, album, artist]) => + pipe( + updateTrackUris(ctx, track, album, artist), + Effect.flatMap(() => + ensureRelationships(ctx, track, album, artist) + ), + Effect.map( + ({ albumTrack, artistTrack, artistAlbum }) => ({ + tries: tries + 1, + track, + album, + artist, + albumTrack, + artistTrack, + artistAlbum, + }) + ) + ) + ) + ) + ), + Effect.tap( + ({ + tries, + track, + album, + artist, + albumTrack, + artistTrack, + artistAlbum, + }) => + Effect.logInfo( + track && + album && + artist && + albumTrack && + artistTrack && + artistAlbum && + track.albumUri && + track.artistUri + ? `Track saved successfully after ${chalk.magenta(tries + 1)} tries` + : `Track not yet saved, retrying... ${chalk.magenta(tries + 1)}` + ) + ), + Effect.tap( + ({ + tries, + track, + album, + artist, + albumTrack, + artistTrack, + artistAlbum, + }) => + tries === 15 + ? pipe( + Effect.logError( + "Failed to save track after 15 tries" + ), + Effect.tap(() => + Effect.logDebug( + `Debug info: track=${JSON.stringify(track)}, album=${JSON.stringify(album)}, artist=${JSON.stringify(artist)}, albumTrack=${JSON.stringify(albumTrack)}, artistTrack=${JSON.stringify(artistTrack)}, artistAlbum=${JSON.stringify(artistAlbum)}` + ) + ) + ) + : Effect.succeed(undefined) + ), + Effect.delay("1 second") + ), + } + ), + Effect.tap(({ tries, track, albumTrack, artistTrack, artistAlbum }) => + tries < 15 && track && albumTrack && artistTrack && artistAlbum + ? publishTrack(ctx, track, albumTrack, artistTrack, artistAlbum) + : Effect.succeed(undefined) + ) + ) + ) + ); diff --git a/apps/api/src/xrpc/app/rocksky/song/getSong.ts b/apps/api/src/xrpc/app/rocksky/song/getSong.ts new file mode 100644 index 00000000..fb8355d0 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/song/getSong.ts @@ -0,0 +1,86 @@ +import { Context } from "context"; +import { count, eq, or } from "drizzle-orm"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { SongViewDetailed } from "lexicon/types/app/rocksky/song/defs"; +import { QueryParams } from "lexicon/types/app/rocksky/song/getSong"; +import tables from "schema"; +import { SelectTrack } from "schema/tracks"; + +export default function (server: Server, ctx: Context) { + const getSong = (params) => + pipe( + { params, ctx }, + retrieve, + Effect.flatMap(presentation), + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({}); + }) + ); + server.app.rocksky.song.getSong({ + handler: async ({ params }) => { + const result = await Effect.runPromise(getSong(params)); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const retrieve = ({ params, ctx }: { params: QueryParams; ctx: Context }) => { + return Effect.tryPromise({ + try: async () => { + const track = await ctx.db + .select() + .from(tables.userTracks) + .leftJoin( + tables.tracks, + eq(tables.userTracks.trackId, tables.tracks.id) + ) + .where( + or( + eq(tables.userTracks.uri, params.uri), + eq(tables.tracks.uri, params.uri) + ) + ) + .execute() + .then(([row]) => row?.tracks); + return Promise.all([ + Promise.resolve(track), + ctx.db + .select({ + count: count(), + }) + .from(tables.userTracks) + .where(eq(tables.userTracks.trackId, track?.id)) + .execute() + .then((rows) => rows[0]?.count || 0), + ctx.db + .select({ count: count() }) + .from(tables.scrobbles) + .where(eq(tables.scrobbles.trackId, track?.id)) + .execute() + .then((rows) => rows[0]?.count || 0), + ]); + }, + catch: (error) => new Error(`Failed to retrieve artist: ${error}`), + }); +}; + +const presentation = ([track, uniqueListeners, playCount]: [ + SelectTrack, + number, + number, +]): Effect.Effect => { + return Effect.sync(() => ({ + ...track, + playCount, + uniqueListeners, + createdAt: track.createdAt.toISOString(), + updatedAt: track.updatedAt.toISOString(), + })); +}; diff --git a/apps/api/src/xrpc/app/rocksky/song/getSongs.ts b/apps/api/src/xrpc/app/rocksky/song/getSongs.ts new file mode 100644 index 00000000..bf977174 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/song/getSongs.ts @@ -0,0 +1,77 @@ +import { Context } from "context"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { SongViewBasic } from "lexicon/types/app/rocksky/song/defs"; +import { QueryParams } from "lexicon/types/app/rocksky/song/getSongs"; +import { deepCamelCaseKeys } from "lib"; + +export default function (server: Server, ctx: Context) { + const getSongs = (params) => + pipe( + { params, ctx }, + retrieve, + Effect.flatMap(presentation), + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({ songs: [] }); + }) + ); + server.app.rocksky.song.getSongs({ + handler: async ({ params }) => { + const result = await Effect.runPromise(getSongs(params)); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const retrieve = ({ + params, + ctx, +}: { + params: QueryParams; + ctx: Context; +}): Effect.Effect<{ data: Track[] }, Error> => { + return Effect.tryPromise({ + try: () => + ctx.analytics.post("library.getTracks", { + pagination: { + skip: params.offset || 0, + take: params.limit || 100, + }, + }), + catch: (error) => new Error(`Failed to retrieve tracks: ${error}`), + }); +}; + +const presentation = ({ + data, +}: { + data: Track[]; +}): Effect.Effect<{ tracks: SongViewBasic[] }, never> => { + return Effect.sync(() => ({ tracks: deepCamelCaseKeys(data) })); +}; + +type Track = { + id: string; + uri: string; + unique_listeners: number; + play_count: number; + title: string; + artist: string; + artist_uri: string; + album: string; + album_uri: string; + album_art: string; + album_artist: string; + copyright_message: string; + disc_number: number; + duration: number; + sha256: string; + track_number: number; + created_at: string; +}; diff --git a/apps/api/src/xrpc/app/rocksky/spotify/getCurrentlyPlaying.ts b/apps/api/src/xrpc/app/rocksky/spotify/getCurrentlyPlaying.ts new file mode 100644 index 00000000..4ff0d61d --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/spotify/getCurrentlyPlaying.ts @@ -0,0 +1,188 @@ +import { HandlerAuth } from "@atproto/xrpc-server"; +import { Context } from "context"; +import { and, eq, or } from "drizzle-orm"; +import { Effect, Match, pipe } from "effect"; +import { Server } from "lexicon"; +import { QueryParams } from "lexicon/types/app/rocksky/spotify/getCurrentlyPlaying"; +import { createHash } from "node:crypto"; +import tables from "schema"; +import { SelectSpotifyAccount } from "schema/spotify-accounts"; +import { SelectUser } from "schema/users"; + +export default function (server: Server, ctx: Context) { + const getCurrentlyPlaying = (params, auth: HandlerAuth) => + pipe( + { params, ctx, did: auth.credentials?.did }, + withUser, + Effect.flatMap(withSpotifyAccount), + Effect.flatMap(retrieve), + Effect.flatMap(withUriAndLikes), + Effect.flatMap(presentation), + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({}); + }) + ); + server.app.rocksky.spotify.getCurrentlyPlaying({ + auth: ctx.authVerifier, + handler: async ({ params, auth }) => { + const result = await Effect.runPromise(getCurrentlyPlaying(params, auth)); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const withUser = ({ + params, + ctx, + did, +}: { + params: QueryParams; + ctx: Context; + did?: string; +}) => { + return Effect.tryPromise({ + try: async () => + ctx.db + .select() + .from(tables.users) + .where( + or( + eq(tables.users.did, params.actor || did), + eq(tables.users.handle, params.actor || did) + ) + ) + .execute() + .then((users) => ({ user: users[0], ctx, params, did })), + catch: (error) => new Error(`Failed to retrieve current user: ${error}`), + }); +}; + +const withSpotifyAccount = ({ + params, + ctx, + did, + user, +}: { + params: QueryParams; + ctx: Context; + did?: string; + user: SelectUser; +}): Effect.Effect< + { + spotifyAccount: SelectSpotifyAccount; + user: SelectUser; + ctx: Context; + params: QueryParams; + did?: string; + }, + Error +> => { + return Effect.tryPromise({ + try: () => + ctx.db + .select() + .from(tables.spotifyAccounts) + .leftJoin( + tables.users, + eq(tables.users.id, tables.spotifyAccounts.userId) + ) + .where( + or( + eq(tables.users.did, params.actor || did), + eq(tables.users.handle, params.actor || did) + ) + ) + .execute() + .then(([results]) => ({ + spotifyAccount: results.spotify_accounts, + user, + ctx, + params, + did, + })), + catch: (error) => new Error(`Failed to retrieve Spotify account: ${error}`), + }); +}; + +const retrieve = ({ + spotifyAccount, + ctx, + user, +}: { + spotifyAccount: SelectSpotifyAccount; + user: SelectUser; + ctx: Context; + params: QueryParams; + did?: string; +}): Effect.Effect => { + return Effect.tryPromise({ + try: () => + ctx.redis + .get(`${spotifyAccount.email}:current`) + .then((cached) => + Match.value(cached).pipe( + Match.when(null, () => ({})), + Match.when(undefined, () => ({})), + Match.orElse(() => JSON.parse(cached)) + ) + ) + .then((cached) => [cached, ctx, user]), + catch: (error) => + new Error(`Failed to retrieve currently playing: ${error}`), + }); +}; + +const withUriAndLikes = ([track, ctx, user]: [any, Context, SelectUser]) => { + return Effect.tryPromise({ + try: async () => { + const sha256 = createHash("sha256") + .update( + `${track.item.name} - ${track.item.artists.map((x) => x.name).join(", ")} - ${track.item.album.name}`.toLowerCase() + ) + .digest("hex"); + const [record] = await ctx.db + .select() + .from(tables.tracks) + .where(eq(tables.tracks.sha256, sha256)) + .execute(); + return ctx.db + .select() + .from(tables.lovedTracks) + .leftJoin( + tables.tracks, + eq(tables.lovedTracks.trackId, tables.tracks.id) + ) + .leftJoin(tables.users, eq(tables.lovedTracks.userId, tables.users.id)) + .where( + and(eq(tables.tracks.sha256, sha256), eq(tables.users.did, user.did)) + ) + .execute() + .then((results) => + Match.value(track).pipe( + Match.when( + (t) => !Object.keys(t).length, + () => ({}) + ), + Match.orElse(() => ({ + ...track, + songUri: record?.uri, + artistUri: record?.artistUri, + albumUri: record?.albumUri, + liked: results.length > 0, + })) + ) + ); + }, + catch: (error) => new Error(`Failed to retrieve URI and likes: ${error}`), + }); +}; + +const presentation = (track): Effect.Effect => { + return Effect.sync(() => track); +}; diff --git a/apps/api/src/xrpc/app/rocksky/spotify/next.ts b/apps/api/src/xrpc/app/rocksky/spotify/next.ts new file mode 100644 index 00000000..f44568ac --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/spotify/next.ts @@ -0,0 +1,131 @@ +import { HandlerAuth } from "@atproto/xrpc-server"; +import { Context } from "context"; +import { eq } from "drizzle-orm"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { QueryParams } from "lexicon/types/app/rocksky/spotify/next"; +import { decrypt } from "lib/crypto"; +import { env } from "lib/env"; +import tables from "schema"; +import { SelectUser } from "schema/users"; + +export default function (server: Server, ctx: Context) { + const next = (params, auth: HandlerAuth) => + pipe( + { params, ctx, did: auth.credentials?.did }, + withUser, + Effect.flatMap(withSpotifyRefreshToken), + Effect.flatMap(withSpotifyToken), + Effect.flatMap(handleNext), + Effect.flatMap(presentation), + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({}); + }) + ); + server.app.rocksky.spotify.next({ + auth: ctx.authVerifier, + handler: async ({ params, auth }) => { + const result = await Effect.runPromise(next(params, auth)); + }, + }); +} + +const withUser = ({ + did, + ctx, +}: { + params: QueryParams; + did: string; + ctx: Context; +}) => { + return Effect.tryPromise({ + try: () => + ctx.db + .select() + .from(tables.users) + .where(eq(tables.users.did, did)) + .execute() + .then(([user]) => ({ + user, + ctx, + did, + })), + catch: (error) => new Error(`Failed to retrieve User: ${error}`), + }); +}; + +const withSpotifyRefreshToken = ({ + user, + ctx, +}: { + user: SelectUser; + ctx: Context; +}) => { + return Effect.tryPromise({ + try: () => + ctx.db + .select() + .from(tables.spotifyTokens) + .where(eq(tables.spotifyTokens.userId, user.id)) + .execute() + .then(([spotifyToken]) => + decrypt(spotifyToken.refreshToken, env.SPOTIFY_ENCRYPTION_KEY) + ) + .then((refreshToken) => ({ + user, + ctx, + refreshToken, + })), + catch: (error) => + new Error(`Failed to retrieve Spotify Refresh token: ${error}`), + }); +}; + +const withSpotifyToken = ({ + refreshToken, + ctx, +}: { + refreshToken: string; + ctx: Context; +}) => { + return Effect.tryPromise({ + try: () => + fetch("https://accounts.spotify.com/api/token", { + method: "POST", + headers: { + "Content-Type": "application/x-www-form-urlencoded", + }, + body: new URLSearchParams({ + grant_type: "refresh_token", + refresh_token: refreshToken, + client_id: env.SPOTIFY_CLIENT_ID, + client_secret: env.SPOTIFY_CLIENT_SECRET, + }), + }) + .then((res) => res.json()) + .then((data) => data.access_token), + catch: (error) => new Error(`Failed to retrieve Spotify token: ${error}`), + }); +}; + +const handleNext = (accessToken: string) => { + return Effect.tryPromise({ + try: () => + fetch("https://api.spotify.com/v1/me/player/next", { + method: "POST", + headers: { + Authorization: `Bearer ${accessToken}`, + }, + }).then((res) => res.status), + catch: (error) => new Error(`Failed to handle next action: ${error}`), + }); +}; + +const presentation = (result): Effect.Effect<{}, never> => { + // Logic to format the result for presentation + console.log("Next action result:", result); + return Effect.sync(() => ({})); +}; diff --git a/apps/api/src/xrpc/app/rocksky/spotify/pause.ts b/apps/api/src/xrpc/app/rocksky/spotify/pause.ts new file mode 100644 index 00000000..1d0b42af --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/spotify/pause.ts @@ -0,0 +1,131 @@ +import { HandlerAuth } from "@atproto/xrpc-server"; +import { Context } from "context"; +import { eq } from "drizzle-orm"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { QueryParams } from "lexicon/types/app/rocksky/spotify/pause"; +import { decrypt } from "lib/crypto"; +import { env } from "lib/env"; +import tables from "schema"; +import { SelectUser } from "schema/users"; + +export default function (server: Server, ctx: Context) { + const pause = (params, auth: HandlerAuth) => + pipe( + { params, ctx, did: auth.credentials?.did }, + withUser, + Effect.flatMap(withSpotifyRefreshToken), + Effect.flatMap(withSpotifyToken), + Effect.flatMap(handlePause), + Effect.flatMap(presentation), + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({}); + }) + ); + server.app.rocksky.spotify.pause({ + auth: ctx.authVerifier, + handler: async ({ params, auth }) => { + const result = await Effect.runPromise(pause(params, auth)); + }, + }); +} + +const withUser = ({ + did, + ctx, +}: { + params: QueryParams; + did: string; + ctx: Context; +}) => { + return Effect.tryPromise({ + try: () => + ctx.db + .select() + .from(tables.users) + .where(eq(tables.users.did, did)) + .execute() + .then(([user]) => ({ + user, + ctx, + did, + })), + catch: (error) => new Error(`Failed to retrieve User: ${error}`), + }); +}; + +const withSpotifyRefreshToken = ({ + user, + ctx, +}: { + user: SelectUser; + ctx: Context; +}) => { + return Effect.tryPromise({ + try: () => + ctx.db + .select() + .from(tables.spotifyTokens) + .where(eq(tables.spotifyTokens.userId, user.id)) + .execute() + .then(([spotifyToken]) => + decrypt(spotifyToken.refreshToken, env.SPOTIFY_ENCRYPTION_KEY) + ) + .then((refreshToken) => ({ + user, + ctx, + refreshToken, + })), + catch: (error) => + new Error(`Failed to retrieve Spotify Refresh token: ${error}`), + }); +}; + +const withSpotifyToken = ({ + refreshToken, + ctx, +}: { + refreshToken: string; + ctx: Context; +}) => { + return Effect.tryPromise({ + try: () => + fetch("https://accounts.spotify.com/api/token", { + method: "POST", + headers: { + "Content-Type": "application/x-www-form-urlencoded", + }, + body: new URLSearchParams({ + grant_type: "refresh_token", + refresh_token: refreshToken, + client_id: env.SPOTIFY_CLIENT_ID, + client_secret: env.SPOTIFY_CLIENT_SECRET, + }), + }) + .then((res) => res.json()) + .then((data) => data.access_token), + catch: (error) => new Error(`Failed to retrieve Spotify token: ${error}`), + }); +}; + +const handlePause = (accessToken: string) => { + return Effect.tryPromise({ + try: () => + fetch("https://api.spotify.com/v1/me/player/pause", { + method: "PUT", + headers: { + Authorization: `Bearer ${accessToken}`, + }, + }).then((res) => res.status), + catch: (error) => new Error(`Failed to handle next action: ${error}`), + }); +}; + +const presentation = (result): Effect.Effect<{}, never> => { + // Logic to format the result for presentation + console.log("Pause action result:", result); + return Effect.sync(() => ({})); +}; diff --git a/apps/api/src/xrpc/app/rocksky/spotify/play.ts b/apps/api/src/xrpc/app/rocksky/spotify/play.ts new file mode 100644 index 00000000..1f080618 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/spotify/play.ts @@ -0,0 +1,130 @@ +import { HandlerAuth } from "@atproto/xrpc-server"; +import { Context } from "context"; +import { eq } from "drizzle-orm"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { QueryParams } from "lexicon/types/app/rocksky/spotify/play"; +import { decrypt } from "lib/crypto"; +import { env } from "lib/env"; +import tables from "schema"; +import { SelectUser } from "schema/users"; + +export default function (server: Server, ctx: Context) { + const play = (params, auth: HandlerAuth) => + pipe( + { params, ctx, did: auth.credentials?.did }, + withUser, + Effect.flatMap(withSpotifyRefreshToken), + Effect.flatMap(withSpotifyToken), + Effect.flatMap(handlePlay), + Effect.flatMap(presentation), + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({}); + }) + ); + server.app.rocksky.spotify.play({ + auth: ctx.authVerifier, + handler: async ({ params, auth }) => { + const result = await Effect.runPromise(play(params, auth)); + }, + }); +} + +const withUser = ({ + did, + ctx, +}: { + params: QueryParams; + did: string; + ctx: Context; +}) => { + return Effect.tryPromise({ + try: () => + ctx.db + .select() + .from(tables.users) + .where(eq(tables.users.did, did)) + .execute() + .then(([user]) => ({ + user, + ctx, + did, + })), + catch: (error) => new Error(`Failed to retrieve User: ${error}`), + }); +}; + +const withSpotifyRefreshToken = ({ + user, + ctx, +}: { + user: SelectUser; + ctx: Context; +}) => { + return Effect.tryPromise({ + try: () => + ctx.db + .select() + .from(tables.spotifyTokens) + .where(eq(tables.spotifyTokens.userId, user.id)) + .execute() + .then(([spotifyToken]) => + decrypt(spotifyToken.refreshToken, env.SPOTIFY_ENCRYPTION_KEY) + ) + .then((refreshToken) => ({ + user, + ctx, + refreshToken, + })), + catch: (error) => + new Error(`Failed to retrieve Spotify Refresh token: ${error}`), + }); +}; + +const withSpotifyToken = ({ + refreshToken, + ctx, +}: { + refreshToken: string; + ctx: Context; +}) => { + return Effect.tryPromise({ + try: () => + fetch("https://accounts.spotify.com/api/token", { + method: "POST", + headers: { + "Content-Type": "application/x-www-form-urlencoded", + }, + body: new URLSearchParams({ + grant_type: "refresh_token", + refresh_token: refreshToken, + client_id: env.SPOTIFY_CLIENT_ID, + client_secret: env.SPOTIFY_CLIENT_SECRET, + }), + }) + .then((res) => res.json()) + .then((data) => data.access_token), + catch: (error) => new Error(`Failed to retrieve Spotify token: ${error}`), + }); +}; + +const handlePlay = (accessToken: string) => { + return Effect.tryPromise({ + try: () => + fetch("https://api.spotify.com/v1/me/player/play", { + method: "PUT", + headers: { + Authorization: `Bearer ${accessToken}`, + }, + }).then((res) => res.status), + catch: (error) => new Error(`Failed to handle next action: ${error}`), + }); +}; + +const presentation = (result) => { + console.log("Play action result:", result); + return Effect.sync(() => ({})); +}; diff --git a/apps/api/src/xrpc/app/rocksky/spotify/previous.ts b/apps/api/src/xrpc/app/rocksky/spotify/previous.ts new file mode 100644 index 00000000..2073bb11 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/spotify/previous.ts @@ -0,0 +1,123 @@ +import { HandlerAuth } from "@atproto/xrpc-server"; +import { Context } from "context"; +import { eq } from "drizzle-orm"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { QueryParams } from "lexicon/types/app/rocksky/spotify/previous"; +import { decrypt } from "lib/crypto"; +import { env } from "lib/env"; +import tables from "schema"; +import { SelectUser } from "schema/users"; + +export default function (server: Server, ctx: Context) { + const previous = (params, auth: HandlerAuth) => + pipe( + { params, ctx, did: auth.credentials?.did }, + withUser, + Effect.flatMap(withSpotifyRefreshToken), + Effect.flatMap(withSpotifyToken), + Effect.flatMap(handlePrevious), + Effect.flatMap(presentation), + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({}); + }) + ); + server.app.rocksky.spotify.previous({ + auth: ctx.authVerifier, + handler: async ({ params, auth }) => { + const result = await Effect.runPromise(previous(params, auth)); + }, + }); +} + +const withUser = ({ + did, + ctx, +}: { + params: QueryParams; + did: string; + ctx: Context; +}) => { + return Effect.tryPromise({ + try: () => + ctx.db + .select() + .from(tables.users) + .where(eq(tables.users.did, did)) + .execute() + .then(([user]) => ({ + user, + ctx, + did, + })), + catch: (error) => new Error(`Failed to retrieve User: ${error}`), + }); +}; + +const withSpotifyRefreshToken = ({ + user, + ctx, +}: { + user: SelectUser; + ctx: Context; +}) => { + return Effect.tryPromise({ + try: () => + ctx.db + .select() + .from(tables.spotifyTokens) + .where(eq(tables.spotifyTokens.userId, user.id)) + .execute() + .then(([spotifyToken]) => + decrypt(spotifyToken.refreshToken, env.SPOTIFY_ENCRYPTION_KEY) + ) + .then((refreshToken) => ({ + refreshToken, + })), + catch: (error) => + new Error(`Failed to retrieve Spotify Refresh token: ${error}`), + }); +}; + +const withSpotifyToken = ({ refreshToken }: { refreshToken: string }) => { + return Effect.tryPromise({ + try: () => + fetch("https://accounts.spotify.com/api/token", { + method: "POST", + headers: { + "Content-Type": "application/x-www-form-urlencoded", + }, + body: new URLSearchParams({ + grant_type: "refresh_token", + refresh_token: refreshToken, + client_id: env.SPOTIFY_CLIENT_ID, + client_secret: env.SPOTIFY_CLIENT_SECRET, + }), + }) + .then((res) => res.json()) + .then((data) => data.access_token), + catch: (error) => new Error(`Failed to retrieve Spotify token: ${error}`), + }); +}; + +const handlePrevious = (accessToken: string) => { + return Effect.tryPromise({ + try: () => + fetch("https://api.spotify.com/v1/me/player/previous", { + method: "POST", + headers: { + Authorization: `Bearer ${accessToken}`, + }, + }).then((res) => res.status), + catch: (error) => new Error(`Failed to handle previous action: ${error}`), + }); +}; + +const presentation = (result) => { + // Logic to format the result for presentation + console.log("Previous action result:", result); + return Effect.sync(() => ({})); +}; diff --git a/apps/api/src/xrpc/app/rocksky/spotify/seek.ts b/apps/api/src/xrpc/app/rocksky/spotify/seek.ts new file mode 100644 index 00000000..20914331 --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/spotify/seek.ts @@ -0,0 +1,145 @@ +import { HandlerAuth } from "@atproto/xrpc-server"; +import { Context } from "context"; +import { eq } from "drizzle-orm"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { QueryParams } from "lexicon/types/app/rocksky/spotify/seek"; +import { decrypt } from "lib/crypto"; +import { env } from "lib/env"; +import tables from "schema"; +import { SelectUser } from "schema/users"; + +export default function (server: Server, ctx: Context) { + const seek = (params, auth: HandlerAuth) => + pipe( + { params, ctx, did: auth.credentials?.did }, + withUser, + Effect.flatMap(withSpotifyRefreshToken), + Effect.flatMap(withSpotifyToken), + Effect.flatMap(handleSeek), + Effect.flatMap(presentation), + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll((err) => { + console.error(err); + return Effect.succeed({}); + }) + ); + server.app.rocksky.spotify.seek({ + auth: ctx.authVerifier, + handler: async ({ params, auth }) => { + const result = await Effect.runPromise(seek(params, auth)); + }, + }); +} + +const withUser = ({ + did, + ctx, + params, +}: { + params: QueryParams; + did: string; + ctx: Context; +}) => { + return Effect.tryPromise({ + try: () => + ctx.db + .select() + .from(tables.users) + .where(eq(tables.users.did, did)) + .execute() + .then(([user]) => ({ + user, + ctx, + params, + })), + catch: (error) => new Error(`Failed to retrieve User: ${error}`), + }); +}; + +const withSpotifyRefreshToken = ({ + user, + ctx, + params, +}: { + user: SelectUser; + ctx: Context; + params: QueryParams; +}) => { + return Effect.tryPromise({ + try: () => + ctx.db + .select() + .from(tables.spotifyTokens) + .where(eq(tables.spotifyTokens.userId, user.id)) + .execute() + .then(([spotifyToken]) => + decrypt(spotifyToken.refreshToken, env.SPOTIFY_ENCRYPTION_KEY) + ) + .then((refreshToken) => ({ + refreshToken, + params, + })), + catch: (error) => + new Error(`Failed to retrieve Spotify Refresh token: ${error}`), + }); +}; + +const withSpotifyToken = ({ + refreshToken, + params, +}: { + refreshToken: string; + params: QueryParams; +}) => { + return Effect.tryPromise({ + try: () => + fetch("https://accounts.spotify.com/api/token", { + method: "POST", + headers: { + "Content-Type": "application/x-www-form-urlencoded", + }, + body: new URLSearchParams({ + grant_type: "refresh_token", + refresh_token: refreshToken, + client_id: env.SPOTIFY_CLIENT_ID, + client_secret: env.SPOTIFY_CLIENT_SECRET, + }), + }) + .then((res) => res.json()) + .then((data) => ({ + accessToken: data.access_token, + position: params.position, + })), + catch: (error) => new Error(`Failed to retrieve Spotify token: ${error}`), + }); +}; + +const handleSeek = ({ + accessToken, + position, +}: { + accessToken: string; + position: number; +}) => { + return Effect.tryPromise({ + try: () => + fetch( + `https://api.spotify.com/v1/me/player/seek?position_ms=${position}`, + { + method: "PUT", + headers: { + Authorization: `Bearer ${accessToken}`, + }, + } + ).then((res) => res.status), + catch: (error) => new Error(`Failed to handle next action: ${error}`), + }); +}; + +const presentation = (result) => { + // Logic to format the result for presentation + console.log("Seek action result:", result); + return Effect.sync(() => ({})); +}; diff --git a/apps/api/src/xrpc/app/rocksky/stats/getStats.ts b/apps/api/src/xrpc/app/rocksky/stats/getStats.ts new file mode 100644 index 00000000..c0338a2e --- /dev/null +++ b/apps/api/src/xrpc/app/rocksky/stats/getStats.ts @@ -0,0 +1,62 @@ +import { Context } from "context"; +import { Effect, pipe } from "effect"; +import { Server } from "lexicon"; +import { StatsView } from "lexicon/types/app/rocksky/stats/defs"; +import { QueryParams } from "lexicon/types/app/rocksky/stats/getStats"; +import { deepCamelCaseKeys } from "lib"; + +export default function (server: Server, ctx: Context) { + const getStats = (params) => + pipe( + { params, ctx }, + retrieve, + Effect.flatMap(presentation), + Effect.retry({ times: 3 }), + Effect.timeout("10 seconds"), + Effect.catchAll(() => Effect.succeed(defaultStats)) + ); + server.app.rocksky.stats.getStats({ + handler: async ({ params }) => { + const result = await Effect.runPromise(getStats(params)); + return { + encoding: "application/json", + body: result, + }; + }, + }); +} + +const retrieve = ({ + params, + ctx, +}: { + params: QueryParams; + ctx: Context; +}): Effect.Effect => { + return Effect.tryPromise({ + try: () => ctx.analytics.post("library.getStats", { user_did: params.did }), + catch: (error) => new Error(`Failed to retrieve stats ${error}`), + }); +}; + +const presentation = ({ data }: Stats): Effect.Effect => { + return Effect.sync(() => deepCamelCaseKeys(data)); +}; + +type Stats = { + data: { + scrobbles: number; + artists: number; + loved_tracks: number; + albums: number; + tracks: number; + }; +}; + +const defaultStats: StatsView = { + scrobbles: 0, + artists: 0, + lovedTracks: 0, + albums: 0, + tracks: 0, +}; diff --git a/apps/api/src/xrpc/index.ts b/apps/api/src/xrpc/index.ts new file mode 100644 index 00000000..4ece4d9c --- /dev/null +++ b/apps/api/src/xrpc/index.ts @@ -0,0 +1,132 @@ +import { Context } from "context"; +import { Server } from "lexicon"; +import spotifyPause from "./app/rocksky//spotify/pause"; +import spotifyPlay from "./app/rocksky//spotify/play"; +import spotifySeek from "./app/rocksky//spotify/seek"; +import getActorAlbums from "./app/rocksky/actor/getActorAlbums"; +import getActorArtists from "./app/rocksky/actor/getActorArtists"; +import getActorLovedSongs from "./app/rocksky/actor/getActorLovedSongs"; +import getActorPlaylists from "./app/rocksky/actor/getActorPlaylists"; +import getActorScrobbles from "./app/rocksky/actor/getActorScrobbles"; +import getActorSongs from "./app/rocksky/actor/getActorSongs"; +import getProfile from "./app/rocksky/actor/getProfile"; +import getAlbum from "./app/rocksky/album/getAlbum"; +import getAlbums from "./app/rocksky/album/getAlbums"; +import getAlbumTracks from "./app/rocksky/album/getAlbumTracks"; +import createApikey from "./app/rocksky/apikey/createApikey"; +import getApikeys from "./app/rocksky/apikey/getApikeys"; +import removeApikey from "./app/rocksky/apikey/removeApikey"; +import updateApikey from "./app/rocksky/apikey/updateApikey"; +import getArtist from "./app/rocksky/artist/getArtist"; +import getArtistAlbums from "./app/rocksky/artist/getArtistAlbums"; +import getArtists from "./app/rocksky/artist/getArtists"; +import getArtistTracks from "./app/rocksky/artist/getArtistTracks"; +import getScrobblesChart from "./app/rocksky/charts/getScrobblesChart"; +import downloadFileFromDropbox from "./app/rocksky/dropbox/downloadFile"; +import getFilesFromDropbox from "./app/rocksky/dropbox/getFiles"; +import getMetadataFromDropbox from "./app/rocksky/dropbox/getMetadata"; +import getTemporaryLinkFromDropbox from "./app/rocksky/dropbox/getTemporaryLink"; +import getNowPlayings from "./app/rocksky/feed/getNowPlayings"; +import search from "./app/rocksky/feed/search"; +import downloadFileFromGoogleDrive from "./app/rocksky/googledrive/downloadFile"; +import getFileFromGoogleDrive from "./app/rocksky/googledrive/getFile"; +import getFilesFromGoogleDrive from "./app/rocksky/googledrive/getFiles"; +import dislikeShout from "./app/rocksky/like/dislikeShout"; +import dislikeSong from "./app/rocksky/like/dislikeSong"; +import likeShout from "./app/rocksky/like/likeShout"; +import likeSong from "./app/rocksky/like/likeSong"; +import getCurrentlyPlaying from "./app/rocksky/player/getCurrentlyPlaying"; +import next from "./app/rocksky/player/next"; +import pause from "./app/rocksky/player/pause"; +import play from "./app/rocksky/player/play"; +import previous from "./app/rocksky/player/previous"; +import seek from "./app/rocksky/player/seek"; +import getPlaylist from "./app/rocksky/playlist/getPlaylist"; +import getPlaylists from "./app/rocksky/playlist/getPlaylists"; +import createScrobble from "./app/rocksky/scrobble/createScrobble"; +import getScrobble from "./app/rocksky/scrobble/getScrobble"; +import getScrobbles from "./app/rocksky/scrobble/getScrobbles"; +import createShout from "./app/rocksky/shout/createShout"; +import getAlbumShouts from "./app/rocksky/shout/getAlbumShouts"; +import getArtistShouts from "./app/rocksky/shout/getArtistShouts"; +import getProfileShouts from "./app/rocksky/shout/getProfileShouts"; +import getShoutReplies from "./app/rocksky/shout/getShoutReplies"; +import getTrackShouts from "./app/rocksky/shout/getTrackShouts"; +import removeShout from "./app/rocksky/shout/removeShout"; +import replyShout from "./app/rocksky/shout/replyShout"; +import reportShout from "./app/rocksky/shout/reportShout"; +import createSong from "./app/rocksky/song/createSong"; +import getSong from "./app/rocksky/song/getSong"; +import getSongs from "./app/rocksky/song/getSongs"; +import spotifyGetCurrentlyPlaying from "./app/rocksky/spotify/getCurrentlyPlaying"; +import spotifyNext from "./app/rocksky/spotify/next"; +import spotifyPrevious from "./app/rocksky/spotify/previous"; +import getStats from "./app/rocksky/stats/getStats"; + +export default function (server: Server, ctx: Context) { + // app.rocksky + getActorAlbums(server, ctx); + getActorArtists(server, ctx); + getActorLovedSongs(server, ctx); + getActorPlaylists(server, ctx); + getActorScrobbles(server, ctx); + getActorSongs(server, ctx); + getProfile(server, ctx); + getAlbum(server, ctx); + getAlbums(server, ctx); + getAlbumTracks(server, ctx); + createApikey(server, ctx); + getApikeys(server, ctx); + removeApikey(server, ctx); + updateApikey(server, ctx); + getArtist(server, ctx); + getArtistAlbums(server, ctx); + getArtists(server, ctx); + getArtistTracks(server, ctx); + getScrobblesChart(server, ctx); + downloadFileFromDropbox(server, ctx); + getFilesFromDropbox(server, ctx); + getMetadataFromDropbox(server, ctx); + getTemporaryLinkFromDropbox(server, ctx); + getNowPlayings(server, ctx); + search(server, ctx); + downloadFileFromGoogleDrive(server, ctx); + getFilesFromGoogleDrive(server, ctx); + getFileFromGoogleDrive(server, ctx); + dislikeShout(server, ctx); + dislikeSong(server, ctx); + likeShout(server, ctx); + likeSong(server, ctx); + getCurrentlyPlaying(server, ctx); + next(server, ctx); + play(server, ctx); + pause(server, ctx); + previous(server, ctx); + seek(server, ctx); + getPlaylist(server, ctx); + getPlaylists(server, ctx); + createScrobble(server, ctx); + getScrobble(server, ctx); + getScrobbles(server, ctx); + createShout(server, ctx); + getAlbumShouts(server, ctx); + getArtistShouts(server, ctx); + getProfileShouts(server, ctx); + getTrackShouts(server, ctx); + getShoutReplies(server, ctx); + removeShout(server, ctx); + replyShout(server, ctx); + reportShout(server, ctx); + getSong(server, ctx); + getSongs(server, ctx); + spotifyGetCurrentlyPlaying(server, ctx); + spotifyNext(server, ctx); + spotifyPause(server, ctx); + spotifyPrevious(server, ctx); + spotifySeek(server, ctx); + spotifyPlay(server, ctx); + getStats(server, ctx); + createSong(server, ctx); + + return server; +} diff --git a/apps/api/tsconfig.json b/apps/api/tsconfig.json new file mode 100644 index 00000000..8beb9616 --- /dev/null +++ b/apps/api/tsconfig.json @@ -0,0 +1,32 @@ +{ + "compilerOptions": { + "allowJs": true, + "allowSyntheticDefaultImports": true, + "baseUrl": "src", + "declaration": true, + "sourceMap": true, + "esModuleInterop": true, + "inlineSourceMap": false, + "lib": ["esnext", "DOM"], + "listEmittedFiles": false, + "listFiles": false, + "moduleResolution": "node", + "noFallthroughCasesInSwitch": true, + "pretty": true, + "resolveJsonModule": true, + "rootDir": ".", + "skipLibCheck": true, + "strict": false, + "traceResolution": false, + "outDir": "", + "target": "esnext", + "module": "esnext", + "types": [ + "@types/node", + "@types/service-worker-mock", + "@cloudflare/workers-types/2023-07-01" + ] + }, + "exclude": ["node_modules", "dist", "tests"], + "include": ["src", "scripts"] +} diff --git a/rockskyapi/rocksky-app-proxy/worker-configuration.d.ts b/apps/api/worker-configuration.d.ts similarity index 100% rename from rockskyapi/rocksky-app-proxy/worker-configuration.d.ts rename to apps/api/worker-configuration.d.ts diff --git a/apps/api/wrangler.json b/apps/api/wrangler.json new file mode 100644 index 00000000..b12edefd --- /dev/null +++ b/apps/api/wrangler.json @@ -0,0 +1,48 @@ +/** + * For more details on how to configure Wrangler, refer to: + * https://developers.cloudflare.com/workers/wrangler/configuration/ + */ +{ + "$schema": "node_modules/wrangler/config-schema.json", + "name": "rocksky-auth", + "main": "src/index.ts", + "compatibility_date": "2025-01-24", + "observability": { + "enabled": true + }, + "node_compat": true + /** + * Smart Placement + * Docs: https://developers.cloudflare.com/workers/configuration/smart-placement/#smart-placement + */ + // "placement": { "mode": "smart" }, + + /** + * Bindings + * Bindings allow your Worker to interact with resources on the Cloudflare Developer Platform, including + * databases, object storage, AI inference, real-time communication and more. + * https://developers.cloudflare.com/workers/runtime-apis/bindings/ + */ + + /** + * Environment Variables + * https://developers.cloudflare.com/workers/wrangler/configuration/#environment-variables + */ + // "vars": { "MY_VARIABLE": "production_value" }, + /** + * Note: Use secrets to store sensitive data. + * https://developers.cloudflare.com/workers/configuration/secrets/ + */ + + /** + * Static Assets + * https://developers.cloudflare.com/workers/static-assets/binding/ + */ + // "assets": { "directory": "./public/", "binding": "ASSETS" }, + + /** + * Service Bindings (communicate between multiple Workers) + * https://developers.cloudflare.com/workers/wrangler/configuration/#service-bindings + */ + // "services": [{ "binding": "MY_SERVICE", "service": "my-service" }] +} diff --git a/rockskyapi/rocksky-app-proxy/.editorconfig b/apps/app-proxy/.editorconfig similarity index 100% rename from rockskyapi/rocksky-app-proxy/.editorconfig rename to apps/app-proxy/.editorconfig diff --git a/rockskyapi/rocksky-app-proxy/.gitignore b/apps/app-proxy/.gitignore similarity index 100% rename from rockskyapi/rocksky-app-proxy/.gitignore rename to apps/app-proxy/.gitignore diff --git a/rockskyapi/rocksky-app-proxy/.prettierrc b/apps/app-proxy/.prettierrc similarity index 100% rename from rockskyapi/rocksky-app-proxy/.prettierrc rename to apps/app-proxy/.prettierrc diff --git a/apps/app-proxy/.xata/version/compatibility.json b/apps/app-proxy/.xata/version/compatibility.json new file mode 100644 index 00000000..762798b5 --- /dev/null +++ b/apps/app-proxy/.xata/version/compatibility.json @@ -0,0 +1 @@ +{"@xata.io/cli":{"latest":"0.16.12","compatibility":[{"range":">=0.0.0"}]},"@xata.io/client":{"latest":"0.30.1","compatibility":[{"range":">=0.0.0"}]}} \ No newline at end of file diff --git a/rockskyapi/rocksky-app-proxy/bun.lock b/apps/app-proxy/bun.lock similarity index 100% rename from rockskyapi/rocksky-app-proxy/bun.lock rename to apps/app-proxy/bun.lock diff --git a/rockskyapi/rocksky-app-proxy/package.json b/apps/app-proxy/package.json similarity index 93% rename from rockskyapi/rocksky-app-proxy/package.json rename to apps/app-proxy/package.json index f859ca95..60a05683 100644 --- a/rockskyapi/rocksky-app-proxy/package.json +++ b/apps/app-proxy/package.json @@ -1,5 +1,5 @@ { - "name": "patient-bar-6c30", + "name": "@rocksky/app-proxy", "version": "0.0.0", "private": true, "scripts": { diff --git a/rockskyapi/rocksky-app-proxy/src/index.ts b/apps/app-proxy/src/index.ts similarity index 100% rename from rockskyapi/rocksky-app-proxy/src/index.ts rename to apps/app-proxy/src/index.ts diff --git a/rockskyapi/rocksky-app-proxy/test/index.spec.ts b/apps/app-proxy/test/index.spec.ts similarity index 100% rename from rockskyapi/rocksky-app-proxy/test/index.spec.ts rename to apps/app-proxy/test/index.spec.ts diff --git a/rockskyapi/rocksky-app-proxy/test/tsconfig.json b/apps/app-proxy/test/tsconfig.json similarity index 100% rename from rockskyapi/rocksky-app-proxy/test/tsconfig.json rename to apps/app-proxy/test/tsconfig.json diff --git a/rockskyapi/rocksky-app-proxy/tsconfig.json b/apps/app-proxy/tsconfig.json similarity index 100% rename from rockskyapi/rocksky-app-proxy/tsconfig.json rename to apps/app-proxy/tsconfig.json diff --git a/rockskyapi/rocksky-app-proxy/vitest.config.mts b/apps/app-proxy/vitest.config.mts similarity index 100% rename from rockskyapi/rocksky-app-proxy/vitest.config.mts rename to apps/app-proxy/vitest.config.mts diff --git a/rockskyapi/rocksky-xata-proxy/worker-configuration.d.ts b/apps/app-proxy/worker-configuration.d.ts similarity index 100% rename from rockskyapi/rocksky-xata-proxy/worker-configuration.d.ts rename to apps/app-proxy/worker-configuration.d.ts diff --git a/rockskyapi/rocksky-app-proxy/wrangler.json b/apps/app-proxy/wrangler.json similarity index 100% rename from rockskyapi/rocksky-app-proxy/wrangler.json rename to apps/app-proxy/wrangler.json diff --git a/rocksky-app/.gitignore b/apps/app/.gitignore similarity index 100% rename from rocksky-app/.gitignore rename to apps/app/.gitignore diff --git a/rocksky-app/.storybook/index.ts b/apps/app/.storybook/index.ts similarity index 100% rename from rocksky-app/.storybook/index.ts rename to apps/app/.storybook/index.ts diff --git a/rocksky-app/.storybook/main.ts b/apps/app/.storybook/main.ts similarity index 100% rename from rocksky-app/.storybook/main.ts rename to apps/app/.storybook/main.ts diff --git a/rocksky-app/.storybook/preview.tsx b/apps/app/.storybook/preview.tsx similarity index 100% rename from rocksky-app/.storybook/preview.tsx rename to apps/app/.storybook/preview.tsx diff --git a/rocksky-app/.storybook/storybook.requires.ts b/apps/app/.storybook/storybook.requires.ts similarity index 100% rename from rocksky-app/.storybook/storybook.requires.ts rename to apps/app/.storybook/storybook.requires.ts diff --git a/rocksky-app/.vscode/settings.json b/apps/app/.vscode/settings.json similarity index 100% rename from rocksky-app/.vscode/settings.json rename to apps/app/.vscode/settings.json diff --git a/rocksky-app/README.md b/apps/app/README.md similarity index 100% rename from rocksky-app/README.md rename to apps/app/README.md diff --git a/rocksky-app/android/.gitignore b/apps/app/android/.gitignore similarity index 100% rename from rocksky-app/android/.gitignore rename to apps/app/android/.gitignore diff --git a/rocksky-app/android/app/build.gradle b/apps/app/android/app/build.gradle similarity index 100% rename from rocksky-app/android/app/build.gradle rename to apps/app/android/app/build.gradle diff --git a/rocksky-app/android/app/debug.keystore b/apps/app/android/app/debug.keystore similarity index 100% rename from rocksky-app/android/app/debug.keystore rename to apps/app/android/app/debug.keystore diff --git a/rocksky-app/android/app/proguard-rules.pro b/apps/app/android/app/proguard-rules.pro similarity index 100% rename from rocksky-app/android/app/proguard-rules.pro rename to apps/app/android/app/proguard-rules.pro diff --git a/rocksky-app/android/app/src/debug/AndroidManifest.xml b/apps/app/android/app/src/debug/AndroidManifest.xml similarity index 100% rename from rocksky-app/android/app/src/debug/AndroidManifest.xml rename to apps/app/android/app/src/debug/AndroidManifest.xml diff --git a/rocksky-app/android/app/src/main/AndroidManifest.xml b/apps/app/android/app/src/main/AndroidManifest.xml similarity index 100% rename from rocksky-app/android/app/src/main/AndroidManifest.xml rename to apps/app/android/app/src/main/AndroidManifest.xml diff --git a/rocksky-app/android/app/src/main/java/com/anonymous/rocksky/MainActivity.kt b/apps/app/android/app/src/main/java/com/anonymous/rocksky/MainActivity.kt similarity index 100% rename from rocksky-app/android/app/src/main/java/com/anonymous/rocksky/MainActivity.kt rename to apps/app/android/app/src/main/java/com/anonymous/rocksky/MainActivity.kt diff --git a/rocksky-app/android/app/src/main/java/com/anonymous/rocksky/MainApplication.kt b/apps/app/android/app/src/main/java/com/anonymous/rocksky/MainApplication.kt similarity index 100% rename from rocksky-app/android/app/src/main/java/com/anonymous/rocksky/MainApplication.kt rename to apps/app/android/app/src/main/java/com/anonymous/rocksky/MainApplication.kt diff --git a/rocksky-app/android/app/src/main/res/drawable-hdpi/splashscreen_logo.png b/apps/app/android/app/src/main/res/drawable-hdpi/splashscreen_logo.png similarity index 100% rename from rocksky-app/android/app/src/main/res/drawable-hdpi/splashscreen_logo.png rename to apps/app/android/app/src/main/res/drawable-hdpi/splashscreen_logo.png diff --git a/rocksky-app/android/app/src/main/res/drawable-mdpi/splashscreen_logo.png b/apps/app/android/app/src/main/res/drawable-mdpi/splashscreen_logo.png similarity index 100% rename from rocksky-app/android/app/src/main/res/drawable-mdpi/splashscreen_logo.png rename to apps/app/android/app/src/main/res/drawable-mdpi/splashscreen_logo.png diff --git a/rocksky-app/android/app/src/main/res/drawable-xhdpi/splashscreen_logo.png b/apps/app/android/app/src/main/res/drawable-xhdpi/splashscreen_logo.png similarity index 100% rename from rocksky-app/android/app/src/main/res/drawable-xhdpi/splashscreen_logo.png rename to apps/app/android/app/src/main/res/drawable-xhdpi/splashscreen_logo.png diff --git a/rocksky-app/android/app/src/main/res/drawable-xxhdpi/splashscreen_logo.png b/apps/app/android/app/src/main/res/drawable-xxhdpi/splashscreen_logo.png similarity index 100% rename from rocksky-app/android/app/src/main/res/drawable-xxhdpi/splashscreen_logo.png rename to apps/app/android/app/src/main/res/drawable-xxhdpi/splashscreen_logo.png diff --git a/rocksky-app/android/app/src/main/res/drawable-xxxhdpi/splashscreen_logo.png b/apps/app/android/app/src/main/res/drawable-xxxhdpi/splashscreen_logo.png similarity index 100% rename from rocksky-app/android/app/src/main/res/drawable-xxxhdpi/splashscreen_logo.png rename to apps/app/android/app/src/main/res/drawable-xxxhdpi/splashscreen_logo.png diff --git a/rocksky-app/android/app/src/main/res/drawable/ic_launcher_background.xml b/apps/app/android/app/src/main/res/drawable/ic_launcher_background.xml similarity index 100% rename from rocksky-app/android/app/src/main/res/drawable/ic_launcher_background.xml rename to apps/app/android/app/src/main/res/drawable/ic_launcher_background.xml diff --git a/rocksky-app/android/app/src/main/res/drawable/rn_edit_text_material.xml b/apps/app/android/app/src/main/res/drawable/rn_edit_text_material.xml similarity index 100% rename from rocksky-app/android/app/src/main/res/drawable/rn_edit_text_material.xml rename to apps/app/android/app/src/main/res/drawable/rn_edit_text_material.xml diff --git a/rocksky-app/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/apps/app/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml similarity index 100% rename from rocksky-app/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml rename to apps/app/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml diff --git a/rocksky-app/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/apps/app/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml similarity index 100% rename from rocksky-app/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml rename to apps/app/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml diff --git a/rocksky-app/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/apps/app/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp similarity index 100% rename from rocksky-app/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp rename to apps/app/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp diff --git a/rocksky-app/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp b/apps/app/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp similarity index 100% rename from rocksky-app/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp rename to apps/app/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp diff --git a/rocksky-app/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/apps/app/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp similarity index 100% rename from rocksky-app/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp rename to apps/app/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp diff --git a/rocksky-app/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/apps/app/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp similarity index 100% rename from rocksky-app/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp rename to apps/app/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp diff --git a/rocksky-app/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp b/apps/app/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp similarity index 100% rename from rocksky-app/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp rename to apps/app/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp diff --git a/rocksky-app/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/apps/app/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp similarity index 100% rename from rocksky-app/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp rename to apps/app/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp diff --git a/rocksky-app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/apps/app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp similarity index 100% rename from rocksky-app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp rename to apps/app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp diff --git a/rocksky-app/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp b/apps/app/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp similarity index 100% rename from rocksky-app/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp rename to apps/app/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp diff --git a/rocksky-app/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/apps/app/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp similarity index 100% rename from rocksky-app/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp rename to apps/app/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp diff --git a/rocksky-app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/apps/app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp similarity index 100% rename from rocksky-app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp rename to apps/app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp diff --git a/rocksky-app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp b/apps/app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp similarity index 100% rename from rocksky-app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp rename to apps/app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp diff --git a/rocksky-app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/apps/app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp similarity index 100% rename from rocksky-app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp rename to apps/app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp diff --git a/rocksky-app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/apps/app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp similarity index 100% rename from rocksky-app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp rename to apps/app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp diff --git a/rocksky-app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp b/apps/app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp similarity index 100% rename from rocksky-app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp rename to apps/app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp diff --git a/rocksky-app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/apps/app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp similarity index 100% rename from rocksky-app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp rename to apps/app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp diff --git a/rocksky-app/android/app/src/main/res/values-night/colors.xml b/apps/app/android/app/src/main/res/values-night/colors.xml similarity index 100% rename from rocksky-app/android/app/src/main/res/values-night/colors.xml rename to apps/app/android/app/src/main/res/values-night/colors.xml diff --git a/rocksky-app/android/app/src/main/res/values/colors.xml b/apps/app/android/app/src/main/res/values/colors.xml similarity index 100% rename from rocksky-app/android/app/src/main/res/values/colors.xml rename to apps/app/android/app/src/main/res/values/colors.xml diff --git a/rocksky-app/android/app/src/main/res/values/strings.xml b/apps/app/android/app/src/main/res/values/strings.xml similarity index 100% rename from rocksky-app/android/app/src/main/res/values/strings.xml rename to apps/app/android/app/src/main/res/values/strings.xml diff --git a/rocksky-app/android/app/src/main/res/values/styles.xml b/apps/app/android/app/src/main/res/values/styles.xml similarity index 100% rename from rocksky-app/android/app/src/main/res/values/styles.xml rename to apps/app/android/app/src/main/res/values/styles.xml diff --git a/rocksky-app/android/build.gradle b/apps/app/android/build.gradle similarity index 100% rename from rocksky-app/android/build.gradle rename to apps/app/android/build.gradle diff --git a/rocksky-app/android/gradle.properties b/apps/app/android/gradle.properties similarity index 100% rename from rocksky-app/android/gradle.properties rename to apps/app/android/gradle.properties diff --git a/rocksky-app/android/gradle/wrapper/gradle-wrapper.jar b/apps/app/android/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from rocksky-app/android/gradle/wrapper/gradle-wrapper.jar rename to apps/app/android/gradle/wrapper/gradle-wrapper.jar diff --git a/rocksky-app/android/gradle/wrapper/gradle-wrapper.properties b/apps/app/android/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from rocksky-app/android/gradle/wrapper/gradle-wrapper.properties rename to apps/app/android/gradle/wrapper/gradle-wrapper.properties diff --git a/rocksky-app/android/gradlew b/apps/app/android/gradlew similarity index 100% rename from rocksky-app/android/gradlew rename to apps/app/android/gradlew diff --git a/rocksky-app/android/gradlew.bat b/apps/app/android/gradlew.bat similarity index 100% rename from rocksky-app/android/gradlew.bat rename to apps/app/android/gradlew.bat diff --git a/rocksky-app/android/settings.gradle b/apps/app/android/settings.gradle similarity index 100% rename from rocksky-app/android/settings.gradle rename to apps/app/android/settings.gradle diff --git a/rocksky-app/app.config.js b/apps/app/app.config.js similarity index 100% rename from rocksky-app/app.config.js rename to apps/app/app.config.js diff --git a/rocksky-app/assets/fonts/RockfordSans-Bold.otf b/apps/app/assets/fonts/RockfordSans-Bold.otf similarity index 100% rename from rocksky-app/assets/fonts/RockfordSans-Bold.otf rename to apps/app/assets/fonts/RockfordSans-Bold.otf diff --git a/rocksky-app/assets/fonts/RockfordSans-BoldItalic.otf b/apps/app/assets/fonts/RockfordSans-BoldItalic.otf similarity index 100% rename from rocksky-app/assets/fonts/RockfordSans-BoldItalic.otf rename to apps/app/assets/fonts/RockfordSans-BoldItalic.otf diff --git a/rocksky-app/assets/fonts/RockfordSans-ExtraBold.otf b/apps/app/assets/fonts/RockfordSans-ExtraBold.otf similarity index 100% rename from rocksky-app/assets/fonts/RockfordSans-ExtraBold.otf rename to apps/app/assets/fonts/RockfordSans-ExtraBold.otf diff --git a/rocksky-app/assets/fonts/RockfordSans-Light.otf b/apps/app/assets/fonts/RockfordSans-Light.otf similarity index 100% rename from rocksky-app/assets/fonts/RockfordSans-Light.otf rename to apps/app/assets/fonts/RockfordSans-Light.otf diff --git a/rocksky-app/assets/fonts/RockfordSans-Medium.otf b/apps/app/assets/fonts/RockfordSans-Medium.otf similarity index 100% rename from rocksky-app/assets/fonts/RockfordSans-Medium.otf rename to apps/app/assets/fonts/RockfordSans-Medium.otf diff --git a/rocksky-app/assets/fonts/RockfordSans-Regular.otf b/apps/app/assets/fonts/RockfordSans-Regular.otf similarity index 100% rename from rocksky-app/assets/fonts/RockfordSans-Regular.otf rename to apps/app/assets/fonts/RockfordSans-Regular.otf diff --git a/rocksky-app/assets/fonts/RockfordSans-RegularItalic.otf b/apps/app/assets/fonts/RockfordSans-RegularItalic.otf similarity index 100% rename from rocksky-app/assets/fonts/RockfordSans-RegularItalic.otf rename to apps/app/assets/fonts/RockfordSans-RegularItalic.otf diff --git a/rocksky-app/assets/fonts/SpaceMono-Regular.ttf b/apps/app/assets/fonts/SpaceMono-Regular.ttf similarity index 100% rename from rocksky-app/assets/fonts/SpaceMono-Regular.ttf rename to apps/app/assets/fonts/SpaceMono-Regular.ttf diff --git a/rocksky-app/assets/images/adaptive-icon.png b/apps/app/assets/images/adaptive-icon.png similarity index 100% rename from rocksky-app/assets/images/adaptive-icon.png rename to apps/app/assets/images/adaptive-icon.png diff --git a/rocksky-app/assets/images/favicon.png b/apps/app/assets/images/favicon.png similarity index 100% rename from rocksky-app/assets/images/favicon.png rename to apps/app/assets/images/favicon.png diff --git a/rocksky-app/assets/images/icon.png b/apps/app/assets/images/icon.png similarity index 100% rename from rocksky-app/assets/images/icon.png rename to apps/app/assets/images/icon.png diff --git a/rocksky-app/assets/images/partial-react-logo.png b/apps/app/assets/images/partial-react-logo.png similarity index 100% rename from rocksky-app/assets/images/partial-react-logo.png rename to apps/app/assets/images/partial-react-logo.png diff --git a/rocksky-app/assets/images/react-logo.png b/apps/app/assets/images/react-logo.png similarity index 100% rename from rocksky-app/assets/images/react-logo.png rename to apps/app/assets/images/react-logo.png diff --git a/rocksky-app/assets/images/react-logo@2x.png b/apps/app/assets/images/react-logo@2x.png similarity index 100% rename from rocksky-app/assets/images/react-logo@2x.png rename to apps/app/assets/images/react-logo@2x.png diff --git a/rocksky-app/assets/images/react-logo@3x.png b/apps/app/assets/images/react-logo@3x.png similarity index 100% rename from rocksky-app/assets/images/react-logo@3x.png rename to apps/app/assets/images/react-logo@3x.png diff --git a/rocksky-app/assets/images/splash-icon.png b/apps/app/assets/images/splash-icon.png similarity index 100% rename from rocksky-app/assets/images/splash-icon.png rename to apps/app/assets/images/splash-icon.png diff --git a/rocksky-app/babel.config.js b/apps/app/babel.config.js similarity index 100% rename from rocksky-app/babel.config.js rename to apps/app/babel.config.js diff --git a/rocksky-app/bun.lock b/apps/app/bun.lock similarity index 100% rename from rocksky-app/bun.lock rename to apps/app/bun.lock diff --git a/rocksky-app/eslint.config.js b/apps/app/eslint.config.js similarity index 100% rename from rocksky-app/eslint.config.js rename to apps/app/eslint.config.js diff --git a/rocksky-app/global.css b/apps/app/global.css similarity index 100% rename from rocksky-app/global.css rename to apps/app/global.css diff --git a/rocksky-app/index.js b/apps/app/index.js similarity index 100% rename from rocksky-app/index.js rename to apps/app/index.js diff --git a/rocksky-app/metro.config.js b/apps/app/metro.config.js similarity index 100% rename from rocksky-app/metro.config.js rename to apps/app/metro.config.js diff --git a/rocksky-app/nativewind-env.d.ts b/apps/app/nativewind-env.d.ts similarity index 100% rename from rocksky-app/nativewind-env.d.ts rename to apps/app/nativewind-env.d.ts diff --git a/rocksky-app/package.json b/apps/app/package.json similarity index 99% rename from rocksky-app/package.json rename to apps/app/package.json index 4364fd3d..bb15880e 100644 --- a/rocksky-app/package.json +++ b/apps/app/package.json @@ -1,5 +1,5 @@ { - "name": "rocksky", + "name": "@rocksky/app", "main": "index.js", "version": "1.0.0", "scripts": { diff --git a/rocksky-app/src/App.tsx b/apps/app/src/App.tsx similarity index 100% rename from rocksky-app/src/App.tsx rename to apps/app/src/App.tsx diff --git a/rocksky-app/src/Navigation.tsx b/apps/app/src/Navigation.tsx similarity index 100% rename from rocksky-app/src/Navigation.tsx rename to apps/app/src/Navigation.tsx diff --git a/rocksky-app/src/api/charts.ts b/apps/app/src/api/charts.ts similarity index 100% rename from rocksky-app/src/api/charts.ts rename to apps/app/src/api/charts.ts diff --git a/rocksky-app/src/api/feed.ts b/apps/app/src/api/feed.ts similarity index 100% rename from rocksky-app/src/api/feed.ts rename to apps/app/src/api/feed.ts diff --git a/rocksky-app/src/api/library.ts b/apps/app/src/api/library.ts similarity index 100% rename from rocksky-app/src/api/library.ts rename to apps/app/src/api/library.ts diff --git a/rocksky-app/src/api/playlists.ts b/apps/app/src/api/playlists.ts similarity index 100% rename from rocksky-app/src/api/playlists.ts rename to apps/app/src/api/playlists.ts diff --git a/rocksky-app/src/api/profile.ts b/apps/app/src/api/profile.ts similarity index 100% rename from rocksky-app/src/api/profile.ts rename to apps/app/src/api/profile.ts diff --git a/rocksky-app/src/api/search.ts b/apps/app/src/api/search.ts similarity index 100% rename from rocksky-app/src/api/search.ts rename to apps/app/src/api/search.ts diff --git a/rocksky-app/src/api/spotify.ts b/apps/app/src/api/spotify.ts similarity index 100% rename from rocksky-app/src/api/spotify.ts rename to apps/app/src/api/spotify.ts diff --git a/rocksky-app/src/atoms/did.ts b/apps/app/src/atoms/did.ts similarity index 100% rename from rocksky-app/src/atoms/did.ts rename to apps/app/src/atoms/did.ts diff --git a/rocksky-app/src/atoms/handle.ts b/apps/app/src/atoms/handle.ts similarity index 100% rename from rocksky-app/src/atoms/handle.ts rename to apps/app/src/atoms/handle.ts diff --git a/rocksky-app/src/atoms/nowplaying.ts b/apps/app/src/atoms/nowplaying.ts similarity index 100% rename from rocksky-app/src/atoms/nowplaying.ts rename to apps/app/src/atoms/nowplaying.ts diff --git a/rocksky-app/src/components/Album/Album.stories.tsx b/apps/app/src/components/Album/Album.stories.tsx similarity index 100% rename from rocksky-app/src/components/Album/Album.stories.tsx rename to apps/app/src/components/Album/Album.stories.tsx diff --git a/rocksky-app/src/components/Album/Album.tsx b/apps/app/src/components/Album/Album.tsx similarity index 100% rename from rocksky-app/src/components/Album/Album.tsx rename to apps/app/src/components/Album/Album.tsx diff --git a/rocksky-app/src/components/Album/index.tsx b/apps/app/src/components/Album/index.tsx similarity index 100% rename from rocksky-app/src/components/Album/index.tsx rename to apps/app/src/components/Album/index.tsx diff --git a/rocksky-app/src/components/Artist/Artist.stories.tsx b/apps/app/src/components/Artist/Artist.stories.tsx similarity index 100% rename from rocksky-app/src/components/Artist/Artist.stories.tsx rename to apps/app/src/components/Artist/Artist.stories.tsx diff --git a/rocksky-app/src/components/Artist/Artist.tsx b/apps/app/src/components/Artist/Artist.tsx similarity index 100% rename from rocksky-app/src/components/Artist/Artist.tsx rename to apps/app/src/components/Artist/Artist.tsx diff --git a/rocksky-app/src/components/Artist/index.tsx b/apps/app/src/components/Artist/index.tsx similarity index 100% rename from rocksky-app/src/components/Artist/index.tsx rename to apps/app/src/components/Artist/index.tsx diff --git a/rocksky-app/src/components/Avatar/Avatar.stories.tsx b/apps/app/src/components/Avatar/Avatar.stories.tsx similarity index 100% rename from rocksky-app/src/components/Avatar/Avatar.stories.tsx rename to apps/app/src/components/Avatar/Avatar.stories.tsx diff --git a/rocksky-app/src/components/Avatar/Avatar.tsx b/apps/app/src/components/Avatar/Avatar.tsx similarity index 100% rename from rocksky-app/src/components/Avatar/Avatar.tsx rename to apps/app/src/components/Avatar/Avatar.tsx diff --git a/rocksky-app/src/components/Avatar/AvatarWithData.tsx b/apps/app/src/components/Avatar/AvatarWithData.tsx similarity index 100% rename from rocksky-app/src/components/Avatar/AvatarWithData.tsx rename to apps/app/src/components/Avatar/AvatarWithData.tsx diff --git a/rocksky-app/src/components/Avatar/index.tsx b/apps/app/src/components/Avatar/index.tsx similarity index 100% rename from rocksky-app/src/components/Avatar/index.tsx rename to apps/app/src/components/Avatar/index.tsx diff --git a/rocksky-app/src/components/Chips/Chips.tsx b/apps/app/src/components/Chips/Chips.tsx similarity index 100% rename from rocksky-app/src/components/Chips/Chips.tsx rename to apps/app/src/components/Chips/Chips.tsx diff --git a/rocksky-app/src/components/Chips/index.tsx b/apps/app/src/components/Chips/index.tsx similarity index 100% rename from rocksky-app/src/components/Chips/index.tsx rename to apps/app/src/components/Chips/index.tsx diff --git a/rocksky-app/src/components/Cover/Cover.tsx b/apps/app/src/components/Cover/Cover.tsx similarity index 100% rename from rocksky-app/src/components/Cover/Cover.tsx rename to apps/app/src/components/Cover/Cover.tsx diff --git a/rocksky-app/src/components/Cover/index.tsx b/apps/app/src/components/Cover/index.tsx similarity index 100% rename from rocksky-app/src/components/Cover/index.tsx rename to apps/app/src/components/Cover/index.tsx diff --git a/rocksky-app/src/components/Handle/Handle.tsx b/apps/app/src/components/Handle/Handle.tsx similarity index 100% rename from rocksky-app/src/components/Handle/Handle.tsx rename to apps/app/src/components/Handle/Handle.tsx diff --git a/rocksky-app/src/components/Handle/index.tsx b/apps/app/src/components/Handle/index.tsx similarity index 100% rename from rocksky-app/src/components/Handle/index.tsx rename to apps/app/src/components/Handle/index.tsx diff --git a/rocksky-app/src/components/Icons/Artist.tsx b/apps/app/src/components/Icons/Artist.tsx similarity index 100% rename from rocksky-app/src/components/Icons/Artist.tsx rename to apps/app/src/components/Icons/Artist.tsx diff --git a/rocksky-app/src/components/Icons/Disc.tsx b/apps/app/src/components/Icons/Disc.tsx similarity index 100% rename from rocksky-app/src/components/Icons/Disc.tsx rename to apps/app/src/components/Icons/Disc.tsx diff --git a/rocksky-app/src/components/Icons/Track.tsx b/apps/app/src/components/Icons/Track.tsx similarity index 100% rename from rocksky-app/src/components/Icons/Track.tsx rename to apps/app/src/components/Icons/Track.tsx diff --git a/rocksky-app/src/components/Playlist/Playlist.tsx b/apps/app/src/components/Playlist/Playlist.tsx similarity index 100% rename from rocksky-app/src/components/Playlist/Playlist.tsx rename to apps/app/src/components/Playlist/Playlist.tsx diff --git a/rocksky-app/src/components/Playlist/index.tsx b/apps/app/src/components/Playlist/index.tsx similarity index 100% rename from rocksky-app/src/components/Playlist/index.tsx rename to apps/app/src/components/Playlist/index.tsx diff --git a/rocksky-app/src/components/Progressbar/Progressbar.tsx b/apps/app/src/components/Progressbar/Progressbar.tsx similarity index 100% rename from rocksky-app/src/components/Progressbar/Progressbar.tsx rename to apps/app/src/components/Progressbar/Progressbar.tsx diff --git a/rocksky-app/src/components/Progressbar/index.tsx b/apps/app/src/components/Progressbar/index.tsx similarity index 100% rename from rocksky-app/src/components/Progressbar/index.tsx rename to apps/app/src/components/Progressbar/index.tsx diff --git a/rocksky-app/src/components/ScrollToTopButton/ScrollToTopButton.tsx b/apps/app/src/components/ScrollToTopButton/ScrollToTopButton.tsx similarity index 100% rename from rocksky-app/src/components/ScrollToTopButton/ScrollToTopButton.tsx rename to apps/app/src/components/ScrollToTopButton/ScrollToTopButton.tsx diff --git a/rocksky-app/src/components/ScrollToTopButton/index.tsx b/apps/app/src/components/ScrollToTopButton/index.tsx similarity index 100% rename from rocksky-app/src/components/ScrollToTopButton/index.tsx rename to apps/app/src/components/ScrollToTopButton/index.tsx diff --git a/rocksky-app/src/components/Song/Song.stories.tsx b/apps/app/src/components/Song/Song.stories.tsx similarity index 100% rename from rocksky-app/src/components/Song/Song.stories.tsx rename to apps/app/src/components/Song/Song.stories.tsx diff --git a/rocksky-app/src/components/Song/Song.tsx b/apps/app/src/components/Song/Song.tsx similarity index 100% rename from rocksky-app/src/components/Song/Song.tsx rename to apps/app/src/components/Song/Song.tsx diff --git a/rocksky-app/src/components/Song/index.tsx b/apps/app/src/components/Song/index.tsx similarity index 100% rename from rocksky-app/src/components/Song/index.tsx rename to apps/app/src/components/Song/index.tsx diff --git a/rocksky-app/src/components/Stats/Stats.stories.tsx b/apps/app/src/components/Stats/Stats.stories.tsx similarity index 100% rename from rocksky-app/src/components/Stats/Stats.stories.tsx rename to apps/app/src/components/Stats/Stats.stories.tsx diff --git a/rocksky-app/src/components/Stats/Stats.tsx b/apps/app/src/components/Stats/Stats.tsx similarity index 100% rename from rocksky-app/src/components/Stats/Stats.tsx rename to apps/app/src/components/Stats/Stats.tsx diff --git a/rocksky-app/src/components/Stats/StatsWithData.tsx b/apps/app/src/components/Stats/StatsWithData.tsx similarity index 100% rename from rocksky-app/src/components/Stats/StatsWithData.tsx rename to apps/app/src/components/Stats/StatsWithData.tsx diff --git a/rocksky-app/src/components/Stats/index.tsx b/apps/app/src/components/Stats/index.tsx similarity index 100% rename from rocksky-app/src/components/Stats/index.tsx rename to apps/app/src/components/Stats/index.tsx diff --git a/rocksky-app/src/components/StickyPlayer/StickyPlayer.stories.tsx b/apps/app/src/components/StickyPlayer/StickyPlayer.stories.tsx similarity index 100% rename from rocksky-app/src/components/StickyPlayer/StickyPlayer.stories.tsx rename to apps/app/src/components/StickyPlayer/StickyPlayer.stories.tsx diff --git a/rocksky-app/src/components/StickyPlayer/StickyPlayer.tsx b/apps/app/src/components/StickyPlayer/StickyPlayer.tsx similarity index 100% rename from rocksky-app/src/components/StickyPlayer/StickyPlayer.tsx rename to apps/app/src/components/StickyPlayer/StickyPlayer.tsx diff --git a/rocksky-app/src/components/StickyPlayer/StickyPlayerWithData.tsx b/apps/app/src/components/StickyPlayer/StickyPlayerWithData.tsx similarity index 100% rename from rocksky-app/src/components/StickyPlayer/StickyPlayerWithData.tsx rename to apps/app/src/components/StickyPlayer/StickyPlayerWithData.tsx diff --git a/rocksky-app/src/components/StickyPlayer/index.tsx b/apps/app/src/components/StickyPlayer/index.tsx similarity index 100% rename from rocksky-app/src/components/StickyPlayer/index.tsx rename to apps/app/src/components/StickyPlayer/index.tsx diff --git a/rocksky-app/src/consts.tsx b/apps/app/src/consts.tsx similarity index 100% rename from rocksky-app/src/consts.tsx rename to apps/app/src/consts.tsx diff --git a/rocksky-app/src/hooks/useChart.tsx b/apps/app/src/hooks/useChart.tsx similarity index 100% rename from rocksky-app/src/hooks/useChart.tsx rename to apps/app/src/hooks/useChart.tsx diff --git a/rocksky-app/src/hooks/useFeed.tsx b/apps/app/src/hooks/useFeed.tsx similarity index 100% rename from rocksky-app/src/hooks/useFeed.tsx rename to apps/app/src/hooks/useFeed.tsx diff --git a/rocksky-app/src/hooks/useFormat.tsx b/apps/app/src/hooks/useFormat.tsx similarity index 100% rename from rocksky-app/src/hooks/useFormat.tsx rename to apps/app/src/hooks/useFormat.tsx diff --git a/rocksky-app/src/hooks/useLibrary.tsx b/apps/app/src/hooks/useLibrary.tsx similarity index 100% rename from rocksky-app/src/hooks/useLibrary.tsx rename to apps/app/src/hooks/useLibrary.tsx diff --git a/rocksky-app/src/hooks/useLike.tsx b/apps/app/src/hooks/useLike.tsx similarity index 100% rename from rocksky-app/src/hooks/useLike.tsx rename to apps/app/src/hooks/useLike.tsx diff --git a/rocksky-app/src/hooks/useNowPlaying.tsx b/apps/app/src/hooks/useNowPlaying.tsx similarity index 100% rename from rocksky-app/src/hooks/useNowPlaying.tsx rename to apps/app/src/hooks/useNowPlaying.tsx diff --git a/rocksky-app/src/hooks/usePlaylists.tsx b/apps/app/src/hooks/usePlaylists.tsx similarity index 100% rename from rocksky-app/src/hooks/usePlaylists.tsx rename to apps/app/src/hooks/usePlaylists.tsx diff --git a/rocksky-app/src/hooks/useProfile.tsx b/apps/app/src/hooks/useProfile.tsx similarity index 100% rename from rocksky-app/src/hooks/useProfile.tsx rename to apps/app/src/hooks/useProfile.tsx diff --git a/rocksky-app/src/hooks/useScrollToTop.tsx b/apps/app/src/hooks/useScrollToTop.tsx similarity index 100% rename from rocksky-app/src/hooks/useScrollToTop.tsx rename to apps/app/src/hooks/useScrollToTop.tsx diff --git a/rocksky-app/src/hooks/useSearch.tsx b/apps/app/src/hooks/useSearch.tsx similarity index 100% rename from rocksky-app/src/hooks/useSearch.tsx rename to apps/app/src/hooks/useSearch.tsx diff --git a/rocksky-app/src/providers/NowPlayingProvider.tsx b/apps/app/src/providers/NowPlayingProvider.tsx similarity index 100% rename from rocksky-app/src/providers/NowPlayingProvider.tsx rename to apps/app/src/providers/NowPlayingProvider.tsx diff --git a/rocksky-app/src/screens/AlbumDetails/AlbumDetails.stories.tsx b/apps/app/src/screens/AlbumDetails/AlbumDetails.stories.tsx similarity index 100% rename from rocksky-app/src/screens/AlbumDetails/AlbumDetails.stories.tsx rename to apps/app/src/screens/AlbumDetails/AlbumDetails.stories.tsx diff --git a/rocksky-app/src/screens/AlbumDetails/AlbumDetails.tsx b/apps/app/src/screens/AlbumDetails/AlbumDetails.tsx similarity index 100% rename from rocksky-app/src/screens/AlbumDetails/AlbumDetails.tsx rename to apps/app/src/screens/AlbumDetails/AlbumDetails.tsx diff --git a/rocksky-app/src/screens/AlbumDetails/AlbumDetailsWithData.tsx b/apps/app/src/screens/AlbumDetails/AlbumDetailsWithData.tsx similarity index 100% rename from rocksky-app/src/screens/AlbumDetails/AlbumDetailsWithData.tsx rename to apps/app/src/screens/AlbumDetails/AlbumDetailsWithData.tsx diff --git a/rocksky-app/src/screens/AlbumDetails/index.tsx b/apps/app/src/screens/AlbumDetails/index.tsx similarity index 100% rename from rocksky-app/src/screens/AlbumDetails/index.tsx rename to apps/app/src/screens/AlbumDetails/index.tsx diff --git a/rocksky-app/src/screens/ArtistDetails/ArtistDetails.stories.tsx b/apps/app/src/screens/ArtistDetails/ArtistDetails.stories.tsx similarity index 100% rename from rocksky-app/src/screens/ArtistDetails/ArtistDetails.stories.tsx rename to apps/app/src/screens/ArtistDetails/ArtistDetails.stories.tsx diff --git a/rocksky-app/src/screens/ArtistDetails/ArtistDetails.tsx b/apps/app/src/screens/ArtistDetails/ArtistDetails.tsx similarity index 100% rename from rocksky-app/src/screens/ArtistDetails/ArtistDetails.tsx rename to apps/app/src/screens/ArtistDetails/ArtistDetails.tsx diff --git a/rocksky-app/src/screens/ArtistDetails/ArtistDetailsWithData.tsx b/apps/app/src/screens/ArtistDetails/ArtistDetailsWithData.tsx similarity index 100% rename from rocksky-app/src/screens/ArtistDetails/ArtistDetailsWithData.tsx rename to apps/app/src/screens/ArtistDetails/ArtistDetailsWithData.tsx diff --git a/rocksky-app/src/screens/ArtistDetails/index.tsx b/apps/app/src/screens/ArtistDetails/index.tsx similarity index 100% rename from rocksky-app/src/screens/ArtistDetails/index.tsx rename to apps/app/src/screens/ArtistDetails/index.tsx diff --git a/rocksky-app/src/screens/Home/Home.stories.tsx b/apps/app/src/screens/Home/Home.stories.tsx similarity index 100% rename from rocksky-app/src/screens/Home/Home.stories.tsx rename to apps/app/src/screens/Home/Home.stories.tsx diff --git a/rocksky-app/src/screens/Home/Home.tsx b/apps/app/src/screens/Home/Home.tsx similarity index 100% rename from rocksky-app/src/screens/Home/Home.tsx rename to apps/app/src/screens/Home/Home.tsx diff --git a/rocksky-app/src/screens/Home/Stories/Avatar/Avatar.tsx b/apps/app/src/screens/Home/Stories/Avatar/Avatar.tsx similarity index 100% rename from rocksky-app/src/screens/Home/Stories/Avatar/Avatar.tsx rename to apps/app/src/screens/Home/Stories/Avatar/Avatar.tsx diff --git a/rocksky-app/src/screens/Home/Stories/Avatar/index.tsx b/apps/app/src/screens/Home/Stories/Avatar/index.tsx similarity index 100% rename from rocksky-app/src/screens/Home/Stories/Avatar/index.tsx rename to apps/app/src/screens/Home/Stories/Avatar/index.tsx diff --git a/rocksky-app/src/screens/Home/Stories/Stories.tsx b/apps/app/src/screens/Home/Stories/Stories.tsx similarity index 100% rename from rocksky-app/src/screens/Home/Stories/Stories.tsx rename to apps/app/src/screens/Home/Stories/Stories.tsx diff --git a/rocksky-app/src/screens/Home/Stories/StoriesWithData.tsx b/apps/app/src/screens/Home/Stories/StoriesWithData.tsx similarity index 100% rename from rocksky-app/src/screens/Home/Stories/StoriesWithData.tsx rename to apps/app/src/screens/Home/Stories/StoriesWithData.tsx diff --git a/rocksky-app/src/screens/Home/Stories/index.tsx b/apps/app/src/screens/Home/Stories/index.tsx similarity index 100% rename from rocksky-app/src/screens/Home/Stories/index.tsx rename to apps/app/src/screens/Home/Stories/index.tsx diff --git a/rocksky-app/src/screens/Home/index.tsx b/apps/app/src/screens/Home/index.tsx similarity index 100% rename from rocksky-app/src/screens/Home/index.tsx rename to apps/app/src/screens/Home/index.tsx diff --git a/rocksky-app/src/screens/Library/Albums/Albums.tsx b/apps/app/src/screens/Library/Albums/Albums.tsx similarity index 100% rename from rocksky-app/src/screens/Library/Albums/Albums.tsx rename to apps/app/src/screens/Library/Albums/Albums.tsx diff --git a/rocksky-app/src/screens/Library/Albums/AlbumsWithData.tsx b/apps/app/src/screens/Library/Albums/AlbumsWithData.tsx similarity index 100% rename from rocksky-app/src/screens/Library/Albums/AlbumsWithData.tsx rename to apps/app/src/screens/Library/Albums/AlbumsWithData.tsx diff --git a/rocksky-app/src/screens/Library/Albums/index.tsx b/apps/app/src/screens/Library/Albums/index.tsx similarity index 100% rename from rocksky-app/src/screens/Library/Albums/index.tsx rename to apps/app/src/screens/Library/Albums/index.tsx diff --git a/rocksky-app/src/screens/Library/Artists/Artists.tsx b/apps/app/src/screens/Library/Artists/Artists.tsx similarity index 100% rename from rocksky-app/src/screens/Library/Artists/Artists.tsx rename to apps/app/src/screens/Library/Artists/Artists.tsx diff --git a/rocksky-app/src/screens/Library/Artists/ArtistsWithData.tsx b/apps/app/src/screens/Library/Artists/ArtistsWithData.tsx similarity index 100% rename from rocksky-app/src/screens/Library/Artists/ArtistsWithData.tsx rename to apps/app/src/screens/Library/Artists/ArtistsWithData.tsx diff --git a/rocksky-app/src/screens/Library/Artists/index.tsx b/apps/app/src/screens/Library/Artists/index.tsx similarity index 100% rename from rocksky-app/src/screens/Library/Artists/index.tsx rename to apps/app/src/screens/Library/Artists/index.tsx diff --git a/rocksky-app/src/screens/Library/Library.tsx b/apps/app/src/screens/Library/Library.tsx similarity index 100% rename from rocksky-app/src/screens/Library/Library.tsx rename to apps/app/src/screens/Library/Library.tsx diff --git a/rocksky-app/src/screens/Library/Scrobbles/Scrobbles.tsx b/apps/app/src/screens/Library/Scrobbles/Scrobbles.tsx similarity index 100% rename from rocksky-app/src/screens/Library/Scrobbles/Scrobbles.tsx rename to apps/app/src/screens/Library/Scrobbles/Scrobbles.tsx diff --git a/rocksky-app/src/screens/Library/Scrobbles/ScrobblesWithData.tsx b/apps/app/src/screens/Library/Scrobbles/ScrobblesWithData.tsx similarity index 100% rename from rocksky-app/src/screens/Library/Scrobbles/ScrobblesWithData.tsx rename to apps/app/src/screens/Library/Scrobbles/ScrobblesWithData.tsx diff --git a/rocksky-app/src/screens/Library/Scrobbles/index.tsx b/apps/app/src/screens/Library/Scrobbles/index.tsx similarity index 100% rename from rocksky-app/src/screens/Library/Scrobbles/index.tsx rename to apps/app/src/screens/Library/Scrobbles/index.tsx diff --git a/rocksky-app/src/screens/Library/Tracks/Tracks.tsx b/apps/app/src/screens/Library/Tracks/Tracks.tsx similarity index 100% rename from rocksky-app/src/screens/Library/Tracks/Tracks.tsx rename to apps/app/src/screens/Library/Tracks/Tracks.tsx diff --git a/rocksky-app/src/screens/Library/Tracks/TracksWithData.tsx b/apps/app/src/screens/Library/Tracks/TracksWithData.tsx similarity index 100% rename from rocksky-app/src/screens/Library/Tracks/TracksWithData.tsx rename to apps/app/src/screens/Library/Tracks/TracksWithData.tsx diff --git a/rocksky-app/src/screens/Library/Tracks/index.tsx b/apps/app/src/screens/Library/Tracks/index.tsx similarity index 100% rename from rocksky-app/src/screens/Library/Tracks/index.tsx rename to apps/app/src/screens/Library/Tracks/index.tsx diff --git a/rocksky-app/src/screens/Library/index.tsx b/apps/app/src/screens/Library/index.tsx similarity index 100% rename from rocksky-app/src/screens/Library/index.tsx rename to apps/app/src/screens/Library/index.tsx diff --git a/rocksky-app/src/screens/Profile/LovedTracks/LovedTracks.tsx b/apps/app/src/screens/Profile/LovedTracks/LovedTracks.tsx similarity index 100% rename from rocksky-app/src/screens/Profile/LovedTracks/LovedTracks.tsx rename to apps/app/src/screens/Profile/LovedTracks/LovedTracks.tsx diff --git a/rocksky-app/src/screens/Profile/LovedTracks/LovedTracksWithData.tsx b/apps/app/src/screens/Profile/LovedTracks/LovedTracksWithData.tsx similarity index 100% rename from rocksky-app/src/screens/Profile/LovedTracks/LovedTracksWithData.tsx rename to apps/app/src/screens/Profile/LovedTracks/LovedTracksWithData.tsx diff --git a/rocksky-app/src/screens/Profile/LovedTracks/index.tsx b/apps/app/src/screens/Profile/LovedTracks/index.tsx similarity index 100% rename from rocksky-app/src/screens/Profile/LovedTracks/index.tsx rename to apps/app/src/screens/Profile/LovedTracks/index.tsx diff --git a/rocksky-app/src/screens/Profile/Overview/Overview.tsx b/apps/app/src/screens/Profile/Overview/Overview.tsx similarity index 100% rename from rocksky-app/src/screens/Profile/Overview/Overview.tsx rename to apps/app/src/screens/Profile/Overview/Overview.tsx diff --git a/rocksky-app/src/screens/Profile/Overview/RecentTracks/RecentTracks.stories.tsx b/apps/app/src/screens/Profile/Overview/RecentTracks/RecentTracks.stories.tsx similarity index 100% rename from rocksky-app/src/screens/Profile/Overview/RecentTracks/RecentTracks.stories.tsx rename to apps/app/src/screens/Profile/Overview/RecentTracks/RecentTracks.stories.tsx diff --git a/rocksky-app/src/screens/Profile/Overview/RecentTracks/RecentTracks.tsx b/apps/app/src/screens/Profile/Overview/RecentTracks/RecentTracks.tsx similarity index 100% rename from rocksky-app/src/screens/Profile/Overview/RecentTracks/RecentTracks.tsx rename to apps/app/src/screens/Profile/Overview/RecentTracks/RecentTracks.tsx diff --git a/rocksky-app/src/screens/Profile/Overview/RecentTracks/RecentTracksWithData.tsx b/apps/app/src/screens/Profile/Overview/RecentTracks/RecentTracksWithData.tsx similarity index 100% rename from rocksky-app/src/screens/Profile/Overview/RecentTracks/RecentTracksWithData.tsx rename to apps/app/src/screens/Profile/Overview/RecentTracks/RecentTracksWithData.tsx diff --git a/rocksky-app/src/screens/Profile/Overview/RecentTracks/index.tsx b/apps/app/src/screens/Profile/Overview/RecentTracks/index.tsx similarity index 100% rename from rocksky-app/src/screens/Profile/Overview/RecentTracks/index.tsx rename to apps/app/src/screens/Profile/Overview/RecentTracks/index.tsx diff --git a/rocksky-app/src/screens/Profile/Overview/TopAlbums/TopAlbums.stories.tsx b/apps/app/src/screens/Profile/Overview/TopAlbums/TopAlbums.stories.tsx similarity index 100% rename from rocksky-app/src/screens/Profile/Overview/TopAlbums/TopAlbums.stories.tsx rename to apps/app/src/screens/Profile/Overview/TopAlbums/TopAlbums.stories.tsx diff --git a/rocksky-app/src/screens/Profile/Overview/TopAlbums/TopAlbums.tsx b/apps/app/src/screens/Profile/Overview/TopAlbums/TopAlbums.tsx similarity index 100% rename from rocksky-app/src/screens/Profile/Overview/TopAlbums/TopAlbums.tsx rename to apps/app/src/screens/Profile/Overview/TopAlbums/TopAlbums.tsx diff --git a/rocksky-app/src/screens/Profile/Overview/TopAlbums/TopAlbumsWithData.tsx b/apps/app/src/screens/Profile/Overview/TopAlbums/TopAlbumsWithData.tsx similarity index 100% rename from rocksky-app/src/screens/Profile/Overview/TopAlbums/TopAlbumsWithData.tsx rename to apps/app/src/screens/Profile/Overview/TopAlbums/TopAlbumsWithData.tsx diff --git a/rocksky-app/src/screens/Profile/Overview/TopAlbums/index.tsx b/apps/app/src/screens/Profile/Overview/TopAlbums/index.tsx similarity index 100% rename from rocksky-app/src/screens/Profile/Overview/TopAlbums/index.tsx rename to apps/app/src/screens/Profile/Overview/TopAlbums/index.tsx diff --git a/rocksky-app/src/screens/Profile/Overview/TopArtists/TopArtists.stories.tsx b/apps/app/src/screens/Profile/Overview/TopArtists/TopArtists.stories.tsx similarity index 100% rename from rocksky-app/src/screens/Profile/Overview/TopArtists/TopArtists.stories.tsx rename to apps/app/src/screens/Profile/Overview/TopArtists/TopArtists.stories.tsx diff --git a/rocksky-app/src/screens/Profile/Overview/TopArtists/TopArtists.tsx b/apps/app/src/screens/Profile/Overview/TopArtists/TopArtists.tsx similarity index 100% rename from rocksky-app/src/screens/Profile/Overview/TopArtists/TopArtists.tsx rename to apps/app/src/screens/Profile/Overview/TopArtists/TopArtists.tsx diff --git a/rocksky-app/src/screens/Profile/Overview/TopArtists/TopArtistsWithData.tsx b/apps/app/src/screens/Profile/Overview/TopArtists/TopArtistsWithData.tsx similarity index 100% rename from rocksky-app/src/screens/Profile/Overview/TopArtists/TopArtistsWithData.tsx rename to apps/app/src/screens/Profile/Overview/TopArtists/TopArtistsWithData.tsx diff --git a/rocksky-app/src/screens/Profile/Overview/TopArtists/index.tsx b/apps/app/src/screens/Profile/Overview/TopArtists/index.tsx similarity index 100% rename from rocksky-app/src/screens/Profile/Overview/TopArtists/index.tsx rename to apps/app/src/screens/Profile/Overview/TopArtists/index.tsx diff --git a/rocksky-app/src/screens/Profile/Overview/TopTracks/TopTracks.stories.tsx b/apps/app/src/screens/Profile/Overview/TopTracks/TopTracks.stories.tsx similarity index 100% rename from rocksky-app/src/screens/Profile/Overview/TopTracks/TopTracks.stories.tsx rename to apps/app/src/screens/Profile/Overview/TopTracks/TopTracks.stories.tsx diff --git a/rocksky-app/src/screens/Profile/Overview/TopTracks/TopTracks.tsx b/apps/app/src/screens/Profile/Overview/TopTracks/TopTracks.tsx similarity index 100% rename from rocksky-app/src/screens/Profile/Overview/TopTracks/TopTracks.tsx rename to apps/app/src/screens/Profile/Overview/TopTracks/TopTracks.tsx diff --git a/rocksky-app/src/screens/Profile/Overview/TopTracks/TopTracksWithData.tsx b/apps/app/src/screens/Profile/Overview/TopTracks/TopTracksWithData.tsx similarity index 100% rename from rocksky-app/src/screens/Profile/Overview/TopTracks/TopTracksWithData.tsx rename to apps/app/src/screens/Profile/Overview/TopTracks/TopTracksWithData.tsx diff --git a/rocksky-app/src/screens/Profile/Overview/TopTracks/index.tsx b/apps/app/src/screens/Profile/Overview/TopTracks/index.tsx similarity index 100% rename from rocksky-app/src/screens/Profile/Overview/TopTracks/index.tsx rename to apps/app/src/screens/Profile/Overview/TopTracks/index.tsx diff --git a/rocksky-app/src/screens/Profile/Overview/index.tsx b/apps/app/src/screens/Profile/Overview/index.tsx similarity index 100% rename from rocksky-app/src/screens/Profile/Overview/index.tsx rename to apps/app/src/screens/Profile/Overview/index.tsx diff --git a/rocksky-app/src/screens/Profile/Playlists/Playlists.tsx b/apps/app/src/screens/Profile/Playlists/Playlists.tsx similarity index 100% rename from rocksky-app/src/screens/Profile/Playlists/Playlists.tsx rename to apps/app/src/screens/Profile/Playlists/Playlists.tsx diff --git a/rocksky-app/src/screens/Profile/Playlists/PlaylistsWithData.tsx b/apps/app/src/screens/Profile/Playlists/PlaylistsWithData.tsx similarity index 100% rename from rocksky-app/src/screens/Profile/Playlists/PlaylistsWithData.tsx rename to apps/app/src/screens/Profile/Playlists/PlaylistsWithData.tsx diff --git a/rocksky-app/src/screens/Profile/Playlists/index.tsx b/apps/app/src/screens/Profile/Playlists/index.tsx similarity index 100% rename from rocksky-app/src/screens/Profile/Playlists/index.tsx rename to apps/app/src/screens/Profile/Playlists/index.tsx diff --git a/rocksky-app/src/screens/Profile/Profile.tsx b/apps/app/src/screens/Profile/Profile.tsx similarity index 100% rename from rocksky-app/src/screens/Profile/Profile.tsx rename to apps/app/src/screens/Profile/Profile.tsx diff --git a/rocksky-app/src/screens/Profile/ProfileHeader/ProfileHeader.tsx b/apps/app/src/screens/Profile/ProfileHeader/ProfileHeader.tsx similarity index 100% rename from rocksky-app/src/screens/Profile/ProfileHeader/ProfileHeader.tsx rename to apps/app/src/screens/Profile/ProfileHeader/ProfileHeader.tsx diff --git a/rocksky-app/src/screens/Profile/ProfileHeader/index.tsx b/apps/app/src/screens/Profile/ProfileHeader/index.tsx similarity index 100% rename from rocksky-app/src/screens/Profile/ProfileHeader/index.tsx rename to apps/app/src/screens/Profile/ProfileHeader/index.tsx diff --git a/rocksky-app/src/screens/Profile/index.tsx b/apps/app/src/screens/Profile/index.tsx similarity index 100% rename from rocksky-app/src/screens/Profile/index.tsx rename to apps/app/src/screens/Profile/index.tsx diff --git a/rocksky-app/src/screens/Search/Search.stories.tsx b/apps/app/src/screens/Search/Search.stories.tsx similarity index 100% rename from rocksky-app/src/screens/Search/Search.stories.tsx rename to apps/app/src/screens/Search/Search.stories.tsx diff --git a/rocksky-app/src/screens/Search/Search.tsx b/apps/app/src/screens/Search/Search.tsx similarity index 100% rename from rocksky-app/src/screens/Search/Search.tsx rename to apps/app/src/screens/Search/Search.tsx diff --git a/rocksky-app/src/screens/Search/SearchInput/SearchInput.tsx b/apps/app/src/screens/Search/SearchInput/SearchInput.tsx similarity index 100% rename from rocksky-app/src/screens/Search/SearchInput/SearchInput.tsx rename to apps/app/src/screens/Search/SearchInput/SearchInput.tsx diff --git a/rocksky-app/src/screens/Search/SearchInput/index.tsx b/apps/app/src/screens/Search/SearchInput/index.tsx similarity index 100% rename from rocksky-app/src/screens/Search/SearchInput/index.tsx rename to apps/app/src/screens/Search/SearchInput/index.tsx diff --git a/rocksky-app/src/screens/Search/SearchWithData.tsx b/apps/app/src/screens/Search/SearchWithData.tsx similarity index 100% rename from rocksky-app/src/screens/Search/SearchWithData.tsx rename to apps/app/src/screens/Search/SearchWithData.tsx diff --git a/rocksky-app/src/screens/Search/index.tsx b/apps/app/src/screens/Search/index.tsx similarity index 100% rename from rocksky-app/src/screens/Search/index.tsx rename to apps/app/src/screens/Search/index.tsx diff --git a/rocksky-app/src/screens/SignIn/SignIn.stories.tsx b/apps/app/src/screens/SignIn/SignIn.stories.tsx similarity index 100% rename from rocksky-app/src/screens/SignIn/SignIn.stories.tsx rename to apps/app/src/screens/SignIn/SignIn.stories.tsx diff --git a/rocksky-app/src/screens/SignIn/SignIn.tsx b/apps/app/src/screens/SignIn/SignIn.tsx similarity index 100% rename from rocksky-app/src/screens/SignIn/SignIn.tsx rename to apps/app/src/screens/SignIn/SignIn.tsx diff --git a/rocksky-app/src/screens/SignIn/index.tsx b/apps/app/src/screens/SignIn/index.tsx similarity index 100% rename from rocksky-app/src/screens/SignIn/index.tsx rename to apps/app/src/screens/SignIn/index.tsx diff --git a/rocksky-app/src/screens/SongDetails/SongDetails.stories.tsx b/apps/app/src/screens/SongDetails/SongDetails.stories.tsx similarity index 100% rename from rocksky-app/src/screens/SongDetails/SongDetails.stories.tsx rename to apps/app/src/screens/SongDetails/SongDetails.stories.tsx diff --git a/rocksky-app/src/screens/SongDetails/SongDetails.tsx b/apps/app/src/screens/SongDetails/SongDetails.tsx similarity index 100% rename from rocksky-app/src/screens/SongDetails/SongDetails.tsx rename to apps/app/src/screens/SongDetails/SongDetails.tsx diff --git a/rocksky-app/src/screens/SongDetails/SongDetailsWithData.tsx b/apps/app/src/screens/SongDetails/SongDetailsWithData.tsx similarity index 100% rename from rocksky-app/src/screens/SongDetails/SongDetailsWithData.tsx rename to apps/app/src/screens/SongDetails/SongDetailsWithData.tsx diff --git a/rocksky-app/src/screens/SongDetails/index.tsx b/apps/app/src/screens/SongDetails/index.tsx similarity index 100% rename from rocksky-app/src/screens/SongDetails/index.tsx rename to apps/app/src/screens/SongDetails/index.tsx diff --git a/rocksky-app/src/screens/Story/Story.tsx b/apps/app/src/screens/Story/Story.tsx similarity index 100% rename from rocksky-app/src/screens/Story/Story.tsx rename to apps/app/src/screens/Story/Story.tsx diff --git a/rocksky-app/src/screens/Story/StoryWithData.tsx b/apps/app/src/screens/Story/StoryWithData.tsx similarity index 100% rename from rocksky-app/src/screens/Story/StoryWithData.tsx rename to apps/app/src/screens/Story/StoryWithData.tsx diff --git a/rocksky-app/src/screens/Story/index.tsx b/apps/app/src/screens/Story/index.tsx similarity index 100% rename from rocksky-app/src/screens/Story/index.tsx rename to apps/app/src/screens/Story/index.tsx diff --git a/rocksky-app/src/types/scrobble.ts b/apps/app/src/types/scrobble.ts similarity index 100% rename from rocksky-app/src/types/scrobble.ts rename to apps/app/src/types/scrobble.ts diff --git a/rocksky-app/src/types/search.ts b/apps/app/src/types/search.ts similarity index 100% rename from rocksky-app/src/types/search.ts rename to apps/app/src/types/search.ts diff --git a/rocksky-app/tailwind.config.js b/apps/app/tailwind.config.js similarity index 100% rename from rocksky-app/tailwind.config.js rename to apps/app/tailwind.config.js diff --git a/rocksky-app/tsconfig.json b/apps/app/tsconfig.json similarity index 100% rename from rocksky-app/tsconfig.json rename to apps/app/tsconfig.json diff --git a/rockskyapi/rocksky-beta/.editorconfig b/apps/beta/.editorconfig similarity index 100% rename from rockskyapi/rocksky-beta/.editorconfig rename to apps/beta/.editorconfig diff --git a/rockskyapi/rocksky-beta/.gitignore b/apps/beta/.gitignore similarity index 100% rename from rockskyapi/rocksky-beta/.gitignore rename to apps/beta/.gitignore diff --git a/rockskyapi/rocksky-beta/.prettierrc b/apps/beta/.prettierrc similarity index 100% rename from rockskyapi/rocksky-beta/.prettierrc rename to apps/beta/.prettierrc diff --git a/rockskyapi/rocksky-beta/.vscode/settings.json b/apps/beta/.vscode/settings.json similarity index 100% rename from rockskyapi/rocksky-beta/.vscode/settings.json rename to apps/beta/.vscode/settings.json diff --git a/rockskyapi/rocksky-beta/bun.lock b/apps/beta/bun.lock similarity index 100% rename from rockskyapi/rocksky-beta/bun.lock rename to apps/beta/bun.lock diff --git a/rockskyapi/rocksky-beta/package.json b/apps/beta/package.json similarity index 94% rename from rockskyapi/rocksky-beta/package.json rename to apps/beta/package.json index d574d7a6..d9274007 100644 --- a/rockskyapi/rocksky-beta/package.json +++ b/apps/beta/package.json @@ -1,5 +1,5 @@ { - "name": "tiny-salad-4531", + "name": "@rocksky/beta", "version": "0.0.0", "private": true, "scripts": { diff --git a/rockskyapi/rocksky-beta/src/index.ts b/apps/beta/src/index.ts similarity index 100% rename from rockskyapi/rocksky-beta/src/index.ts rename to apps/beta/src/index.ts diff --git a/rockskyapi/rocksky-beta/test/index.spec.ts b/apps/beta/test/index.spec.ts similarity index 100% rename from rockskyapi/rocksky-beta/test/index.spec.ts rename to apps/beta/test/index.spec.ts diff --git a/rockskyapi/rocksky-beta/test/tsconfig.json b/apps/beta/test/tsconfig.json similarity index 100% rename from rockskyapi/rocksky-beta/test/tsconfig.json rename to apps/beta/test/tsconfig.json diff --git a/rockskyapi/rocksky-beta/tsconfig.json b/apps/beta/tsconfig.json similarity index 100% rename from rockskyapi/rocksky-beta/tsconfig.json rename to apps/beta/tsconfig.json diff --git a/rockskyapi/rocksky-beta/vitest.config.mts b/apps/beta/vitest.config.mts similarity index 100% rename from rockskyapi/rocksky-beta/vitest.config.mts rename to apps/beta/vitest.config.mts diff --git a/rockskyapi/rocksky-beta/worker-configuration.d.ts b/apps/beta/worker-configuration.d.ts similarity index 100% rename from rockskyapi/rocksky-beta/worker-configuration.d.ts rename to apps/beta/worker-configuration.d.ts diff --git a/rockskyapi/rocksky-beta/wrangler.jsonc b/apps/beta/wrangler.jsonc similarity index 100% rename from rockskyapi/rocksky-beta/wrangler.jsonc rename to apps/beta/wrangler.jsonc diff --git a/rockskycli/.gitignore b/apps/cli/.gitignore similarity index 100% rename from rockskycli/.gitignore rename to apps/cli/.gitignore diff --git a/rockskycli/LICENSE b/apps/cli/LICENSE similarity index 100% rename from rockskycli/LICENSE rename to apps/cli/LICENSE diff --git a/rockskycli/README.md b/apps/cli/README.md similarity index 100% rename from rockskycli/README.md rename to apps/cli/README.md diff --git a/rockskycli/TOOLS.md b/apps/cli/TOOLS.md similarity index 100% rename from rockskycli/TOOLS.md rename to apps/cli/TOOLS.md diff --git a/rockskycli/bun.lock b/apps/cli/bun.lock similarity index 100% rename from rockskycli/bun.lock rename to apps/cli/bun.lock diff --git a/rockskycli/package.json b/apps/cli/package.json similarity index 100% rename from rockskycli/package.json rename to apps/cli/package.json diff --git a/rockskycli/src/client.ts b/apps/cli/src/client.ts similarity index 100% rename from rockskycli/src/client.ts rename to apps/cli/src/client.ts diff --git a/rockskycli/src/cmd/albums.ts b/apps/cli/src/cmd/albums.ts similarity index 100% rename from rockskycli/src/cmd/albums.ts rename to apps/cli/src/cmd/albums.ts diff --git a/rockskycli/src/cmd/artists.ts b/apps/cli/src/cmd/artists.ts similarity index 100% rename from rockskycli/src/cmd/artists.ts rename to apps/cli/src/cmd/artists.ts diff --git a/rockskycli/src/cmd/create.ts b/apps/cli/src/cmd/create.ts similarity index 100% rename from rockskycli/src/cmd/create.ts rename to apps/cli/src/cmd/create.ts diff --git a/rockskycli/src/cmd/login.ts b/apps/cli/src/cmd/login.ts similarity index 100% rename from rockskycli/src/cmd/login.ts rename to apps/cli/src/cmd/login.ts diff --git a/rockskycli/src/cmd/mcp.ts b/apps/cli/src/cmd/mcp.ts similarity index 100% rename from rockskycli/src/cmd/mcp.ts rename to apps/cli/src/cmd/mcp.ts diff --git a/rockskycli/src/cmd/nowplaying.ts b/apps/cli/src/cmd/nowplaying.ts similarity index 100% rename from rockskycli/src/cmd/nowplaying.ts rename to apps/cli/src/cmd/nowplaying.ts diff --git a/rockskycli/src/cmd/scrobble.ts b/apps/cli/src/cmd/scrobble.ts similarity index 100% rename from rockskycli/src/cmd/scrobble.ts rename to apps/cli/src/cmd/scrobble.ts diff --git a/rockskycli/src/cmd/scrobbles.ts b/apps/cli/src/cmd/scrobbles.ts similarity index 100% rename from rockskycli/src/cmd/scrobbles.ts rename to apps/cli/src/cmd/scrobbles.ts diff --git a/rockskycli/src/cmd/search.ts b/apps/cli/src/cmd/search.ts similarity index 100% rename from rockskycli/src/cmd/search.ts rename to apps/cli/src/cmd/search.ts diff --git a/rockskycli/src/cmd/stats.ts b/apps/cli/src/cmd/stats.ts similarity index 100% rename from rockskycli/src/cmd/stats.ts rename to apps/cli/src/cmd/stats.ts diff --git a/rockskycli/src/cmd/tracks.ts b/apps/cli/src/cmd/tracks.ts similarity index 100% rename from rockskycli/src/cmd/tracks.ts rename to apps/cli/src/cmd/tracks.ts diff --git a/rockskycli/src/cmd/whoami.ts b/apps/cli/src/cmd/whoami.ts similarity index 100% rename from rockskycli/src/cmd/whoami.ts rename to apps/cli/src/cmd/whoami.ts diff --git a/rockskycli/src/index.ts b/apps/cli/src/index.ts similarity index 100% rename from rockskycli/src/index.ts rename to apps/cli/src/index.ts diff --git a/rockskycli/src/mcp/index.ts b/apps/cli/src/mcp/index.ts similarity index 100% rename from rockskycli/src/mcp/index.ts rename to apps/cli/src/mcp/index.ts diff --git a/rockskycli/src/mcp/tools/albums.ts b/apps/cli/src/mcp/tools/albums.ts similarity index 100% rename from rockskycli/src/mcp/tools/albums.ts rename to apps/cli/src/mcp/tools/albums.ts diff --git a/rockskycli/src/mcp/tools/artists.ts b/apps/cli/src/mcp/tools/artists.ts similarity index 100% rename from rockskycli/src/mcp/tools/artists.ts rename to apps/cli/src/mcp/tools/artists.ts diff --git a/rockskycli/src/mcp/tools/create.ts b/apps/cli/src/mcp/tools/create.ts similarity index 100% rename from rockskycli/src/mcp/tools/create.ts rename to apps/cli/src/mcp/tools/create.ts diff --git a/rockskycli/src/mcp/tools/myscrobbles.ts b/apps/cli/src/mcp/tools/myscrobbles.ts similarity index 100% rename from rockskycli/src/mcp/tools/myscrobbles.ts rename to apps/cli/src/mcp/tools/myscrobbles.ts diff --git a/rockskycli/src/mcp/tools/nowplaying.ts b/apps/cli/src/mcp/tools/nowplaying.ts similarity index 100% rename from rockskycli/src/mcp/tools/nowplaying.ts rename to apps/cli/src/mcp/tools/nowplaying.ts diff --git a/rockskycli/src/mcp/tools/scrobbles.ts b/apps/cli/src/mcp/tools/scrobbles.ts similarity index 100% rename from rockskycli/src/mcp/tools/scrobbles.ts rename to apps/cli/src/mcp/tools/scrobbles.ts diff --git a/rockskycli/src/mcp/tools/search.ts b/apps/cli/src/mcp/tools/search.ts similarity index 100% rename from rockskycli/src/mcp/tools/search.ts rename to apps/cli/src/mcp/tools/search.ts diff --git a/rockskycli/src/mcp/tools/stats.ts b/apps/cli/src/mcp/tools/stats.ts similarity index 100% rename from rockskycli/src/mcp/tools/stats.ts rename to apps/cli/src/mcp/tools/stats.ts diff --git a/rockskycli/src/mcp/tools/tracks.ts b/apps/cli/src/mcp/tools/tracks.ts similarity index 100% rename from rockskycli/src/mcp/tools/tracks.ts rename to apps/cli/src/mcp/tools/tracks.ts diff --git a/rockskycli/src/mcp/tools/whoami.ts b/apps/cli/src/mcp/tools/whoami.ts similarity index 100% rename from rockskycli/src/mcp/tools/whoami.ts rename to apps/cli/src/mcp/tools/whoami.ts diff --git a/rockskycli/tsconfig.json b/apps/cli/tsconfig.json similarity index 100% rename from rockskycli/tsconfig.json rename to apps/cli/tsconfig.json diff --git a/rockskyapi/rocksky-doc/.editorconfig b/apps/doc/.editorconfig similarity index 100% rename from rockskyapi/rocksky-doc/.editorconfig rename to apps/doc/.editorconfig diff --git a/rockskyapi/rocksky-doc/.gitignore b/apps/doc/.gitignore similarity index 100% rename from rockskyapi/rocksky-doc/.gitignore rename to apps/doc/.gitignore diff --git a/rockskyapi/rocksky-doc/.prettierrc b/apps/doc/.prettierrc similarity index 100% rename from rockskyapi/rocksky-doc/.prettierrc rename to apps/doc/.prettierrc diff --git a/rockskyapi/rocksky-doc/.vscode/settings.json b/apps/doc/.vscode/settings.json similarity index 100% rename from rockskyapi/rocksky-doc/.vscode/settings.json rename to apps/doc/.vscode/settings.json diff --git a/rockskyapi/rocksky-doc/bun.lock b/apps/doc/bun.lock similarity index 100% rename from rockskyapi/rocksky-doc/bun.lock rename to apps/doc/bun.lock diff --git a/rockskyapi/rocksky-doc/package.json b/apps/doc/package.json similarity index 93% rename from rockskyapi/rocksky-doc/package.json rename to apps/doc/package.json index 9fbcd236..4df9c2c8 100644 --- a/rockskyapi/rocksky-doc/package.json +++ b/apps/doc/package.json @@ -1,5 +1,5 @@ { - "name": "white-scene-4cbd", + "name": "@rocksky/doc", "version": "0.0.0", "private": true, "scripts": { diff --git a/rockskyapi/rocksky-doc/src/index.ts b/apps/doc/src/index.ts similarity index 100% rename from rockskyapi/rocksky-doc/src/index.ts rename to apps/doc/src/index.ts diff --git a/rockskyapi/rocksky-doc/test/index.spec.ts b/apps/doc/test/index.spec.ts similarity index 100% rename from rockskyapi/rocksky-doc/test/index.spec.ts rename to apps/doc/test/index.spec.ts diff --git a/rockskyapi/rocksky-doc/test/tsconfig.json b/apps/doc/test/tsconfig.json similarity index 100% rename from rockskyapi/rocksky-doc/test/tsconfig.json rename to apps/doc/test/tsconfig.json diff --git a/rockskyapi/rocksky-doc/tsconfig.json b/apps/doc/tsconfig.json similarity index 100% rename from rockskyapi/rocksky-doc/tsconfig.json rename to apps/doc/tsconfig.json diff --git a/rockskyapi/rocksky-doc/vitest.config.mts b/apps/doc/vitest.config.mts similarity index 100% rename from rockskyapi/rocksky-doc/vitest.config.mts rename to apps/doc/vitest.config.mts diff --git a/rockskyapi/rocksky-doc/worker-configuration.d.ts b/apps/doc/worker-configuration.d.ts similarity index 100% rename from rockskyapi/rocksky-doc/worker-configuration.d.ts rename to apps/doc/worker-configuration.d.ts diff --git a/rockskyapi/rocksky-doc/wrangler.jsonc b/apps/doc/wrangler.jsonc similarity index 100% rename from rockskyapi/rocksky-doc/wrangler.jsonc rename to apps/doc/wrangler.jsonc diff --git a/rockskyapi/rocksky-uploads/.editorconfig b/apps/spotify-proxy/.editorconfig similarity index 100% rename from rockskyapi/rocksky-uploads/.editorconfig rename to apps/spotify-proxy/.editorconfig diff --git a/rockskyapi/rocksky-uploads/.gitignore b/apps/spotify-proxy/.gitignore similarity index 100% rename from rockskyapi/rocksky-uploads/.gitignore rename to apps/spotify-proxy/.gitignore diff --git a/rockskyapi/rocksky-uploads/.prettierrc b/apps/spotify-proxy/.prettierrc similarity index 100% rename from rockskyapi/rocksky-uploads/.prettierrc rename to apps/spotify-proxy/.prettierrc diff --git a/rockskyapi/spotify-proxy/.vscode/settings.json b/apps/spotify-proxy/.vscode/settings.json similarity index 100% rename from rockskyapi/spotify-proxy/.vscode/settings.json rename to apps/spotify-proxy/.vscode/settings.json diff --git a/rockskyapi/spotify-proxy/bun.lock b/apps/spotify-proxy/bun.lock similarity index 100% rename from rockskyapi/spotify-proxy/bun.lock rename to apps/spotify-proxy/bun.lock diff --git a/rockskyapi/spotify-proxy/package.json b/apps/spotify-proxy/package.json similarity index 91% rename from rockskyapi/spotify-proxy/package.json rename to apps/spotify-proxy/package.json index d29ee0c3..3666b51f 100644 --- a/rockskyapi/spotify-proxy/package.json +++ b/apps/spotify-proxy/package.json @@ -1,5 +1,5 @@ { - "name": "spotify-proxy", + "name": "@rocksky/spotify-proxy", "version": "0.0.0", "private": true, "scripts": { diff --git a/rockskyapi/spotify-proxy/src/index.ts b/apps/spotify-proxy/src/index.ts similarity index 100% rename from rockskyapi/spotify-proxy/src/index.ts rename to apps/spotify-proxy/src/index.ts diff --git a/rockskyapi/spotify-proxy/test/env.d.ts b/apps/spotify-proxy/test/env.d.ts similarity index 100% rename from rockskyapi/spotify-proxy/test/env.d.ts rename to apps/spotify-proxy/test/env.d.ts diff --git a/rockskyapi/rocksky-uploads/test/index.spec.ts b/apps/spotify-proxy/test/index.spec.ts similarity index 100% rename from rockskyapi/rocksky-uploads/test/index.spec.ts rename to apps/spotify-proxy/test/index.spec.ts diff --git a/rockskyapi/rocksky-uploads/test/tsconfig.json b/apps/spotify-proxy/test/tsconfig.json similarity index 100% rename from rockskyapi/rocksky-uploads/test/tsconfig.json rename to apps/spotify-proxy/test/tsconfig.json diff --git a/rockskyapi/rocksky-uploads/tsconfig.json b/apps/spotify-proxy/tsconfig.json similarity index 100% rename from rockskyapi/rocksky-uploads/tsconfig.json rename to apps/spotify-proxy/tsconfig.json diff --git a/rockskyapi/spotify-proxy/vitest.config.mts b/apps/spotify-proxy/vitest.config.mts similarity index 100% rename from rockskyapi/spotify-proxy/vitest.config.mts rename to apps/spotify-proxy/vitest.config.mts diff --git a/rockskyapi/spotify-proxy/worker-configuration.d.ts b/apps/spotify-proxy/worker-configuration.d.ts similarity index 100% rename from rockskyapi/spotify-proxy/worker-configuration.d.ts rename to apps/spotify-proxy/worker-configuration.d.ts diff --git a/rockskyapi/spotify-proxy/wrangler.jsonc b/apps/spotify-proxy/wrangler.jsonc similarity index 100% rename from rockskyapi/spotify-proxy/wrangler.jsonc rename to apps/spotify-proxy/wrangler.jsonc diff --git a/rockskyapi/rocksky-xata-proxy/.editorconfig b/apps/uploads/.editorconfig similarity index 100% rename from rockskyapi/rocksky-xata-proxy/.editorconfig rename to apps/uploads/.editorconfig diff --git a/rockskyapi/rocksky-xata-proxy/.gitignore b/apps/uploads/.gitignore similarity index 100% rename from rockskyapi/rocksky-xata-proxy/.gitignore rename to apps/uploads/.gitignore diff --git a/rockskyapi/rocksky-xata-proxy/.prettierrc b/apps/uploads/.prettierrc similarity index 100% rename from rockskyapi/rocksky-xata-proxy/.prettierrc rename to apps/uploads/.prettierrc diff --git a/rockskyapi/rocksky-uploads/bun.lock b/apps/uploads/bun.lock similarity index 100% rename from rockskyapi/rocksky-uploads/bun.lock rename to apps/uploads/bun.lock diff --git a/rockskyapi/rocksky-uploads/package.json b/apps/uploads/package.json similarity index 93% rename from rockskyapi/rocksky-uploads/package.json rename to apps/uploads/package.json index e63207f7..12bdf196 100644 --- a/rockskyapi/rocksky-uploads/package.json +++ b/apps/uploads/package.json @@ -1,5 +1,5 @@ { - "name": "patient-flower-7e0a", + "name": "@rocksky/uploads", "version": "0.0.0", "private": true, "scripts": { diff --git a/rockskyapi/rocksky-uploads/src/index.ts b/apps/uploads/src/index.ts similarity index 100% rename from rockskyapi/rocksky-uploads/src/index.ts rename to apps/uploads/src/index.ts diff --git a/rockskyapi/rocksky-xata-proxy/test/index.spec.ts b/apps/uploads/test/index.spec.ts similarity index 100% rename from rockskyapi/rocksky-xata-proxy/test/index.spec.ts rename to apps/uploads/test/index.spec.ts diff --git a/rockskyapi/rocksky-xata-proxy/test/tsconfig.json b/apps/uploads/test/tsconfig.json similarity index 100% rename from rockskyapi/rocksky-xata-proxy/test/tsconfig.json rename to apps/uploads/test/tsconfig.json diff --git a/rockskyapi/rocksky-xata-proxy/tsconfig.json b/apps/uploads/tsconfig.json similarity index 100% rename from rockskyapi/rocksky-xata-proxy/tsconfig.json rename to apps/uploads/tsconfig.json diff --git a/rockskyapi/rocksky-uploads/vitest.config.mts b/apps/uploads/vitest.config.mts similarity index 100% rename from rockskyapi/rocksky-uploads/vitest.config.mts rename to apps/uploads/vitest.config.mts diff --git a/rockskyapi/rocksky-uploads/worker-configuration.d.ts b/apps/uploads/worker-configuration.d.ts similarity index 100% rename from rockskyapi/rocksky-uploads/worker-configuration.d.ts rename to apps/uploads/worker-configuration.d.ts diff --git a/rockskyapi/rocksky-uploads/wrangler.json b/apps/uploads/wrangler.json similarity index 100% rename from rockskyapi/rocksky-uploads/wrangler.json rename to apps/uploads/wrangler.json diff --git a/rockskymobile/.env.example b/apps/web-mobile/.env.example similarity index 100% rename from rockskymobile/.env.example rename to apps/web-mobile/.env.example diff --git a/rockskymobile/.gitignore b/apps/web-mobile/.gitignore similarity index 100% rename from rockskymobile/.gitignore rename to apps/web-mobile/.gitignore diff --git a/rockskymobile/README.md b/apps/web-mobile/README.md similarity index 100% rename from rockskymobile/README.md rename to apps/web-mobile/README.md diff --git a/rockskymobile/bun.lock b/apps/web-mobile/bun.lock similarity index 100% rename from rockskymobile/bun.lock rename to apps/web-mobile/bun.lock diff --git a/rockskymobile/eslint.config.js b/apps/web-mobile/eslint.config.js similarity index 100% rename from rockskymobile/eslint.config.js rename to apps/web-mobile/eslint.config.js diff --git a/rockskymobile/index.html b/apps/web-mobile/index.html similarity index 100% rename from rockskymobile/index.html rename to apps/web-mobile/index.html diff --git a/rockskymobile/package-lock.json b/apps/web-mobile/package-lock.json similarity index 100% rename from rockskymobile/package-lock.json rename to apps/web-mobile/package-lock.json diff --git a/rockskymobile/package.json b/apps/web-mobile/package.json similarity index 98% rename from rockskymobile/package.json rename to apps/web-mobile/package.json index 834cdb56..cfd7a3fd 100644 --- a/rockskymobile/package.json +++ b/apps/web-mobile/package.json @@ -1,5 +1,5 @@ { - "name": "rocksky", + "name": "@rocksky/web-mobile", "private": true, "version": "0.0.0", "type": "module", diff --git a/rockskymobile/public/vite.svg b/apps/web-mobile/public/vite.svg similarity index 100% rename from rockskymobile/public/vite.svg rename to apps/web-mobile/public/vite.svg diff --git a/rockskymobile/src/App.tsx b/apps/web-mobile/src/App.tsx similarity index 100% rename from rockskymobile/src/App.tsx rename to apps/web-mobile/src/App.tsx diff --git a/rockskymobile/src/assets/fonts/RockfordSans-Bold.otf b/apps/web-mobile/src/assets/fonts/RockfordSans-Bold.otf similarity index 100% rename from rockskymobile/src/assets/fonts/RockfordSans-Bold.otf rename to apps/web-mobile/src/assets/fonts/RockfordSans-Bold.otf diff --git a/rockskymobile/src/assets/fonts/RockfordSans-BoldItalic.otf b/apps/web-mobile/src/assets/fonts/RockfordSans-BoldItalic.otf similarity index 100% rename from rockskymobile/src/assets/fonts/RockfordSans-BoldItalic.otf rename to apps/web-mobile/src/assets/fonts/RockfordSans-BoldItalic.otf diff --git a/rockskymobile/src/assets/fonts/RockfordSans-ExtraBold.otf b/apps/web-mobile/src/assets/fonts/RockfordSans-ExtraBold.otf similarity index 100% rename from rockskymobile/src/assets/fonts/RockfordSans-ExtraBold.otf rename to apps/web-mobile/src/assets/fonts/RockfordSans-ExtraBold.otf diff --git a/rockskymobile/src/assets/fonts/RockfordSans-Light.otf b/apps/web-mobile/src/assets/fonts/RockfordSans-Light.otf similarity index 100% rename from rockskymobile/src/assets/fonts/RockfordSans-Light.otf rename to apps/web-mobile/src/assets/fonts/RockfordSans-Light.otf diff --git a/rockskymobile/src/assets/fonts/RockfordSans-Medium.otf b/apps/web-mobile/src/assets/fonts/RockfordSans-Medium.otf similarity index 100% rename from rockskymobile/src/assets/fonts/RockfordSans-Medium.otf rename to apps/web-mobile/src/assets/fonts/RockfordSans-Medium.otf diff --git a/rockskymobile/src/assets/fonts/RockfordSans-Regular.otf b/apps/web-mobile/src/assets/fonts/RockfordSans-Regular.otf similarity index 100% rename from rockskymobile/src/assets/fonts/RockfordSans-Regular.otf rename to apps/web-mobile/src/assets/fonts/RockfordSans-Regular.otf diff --git a/rockskymobile/src/assets/fonts/RockfordSans-RegularItalic.otf b/apps/web-mobile/src/assets/fonts/RockfordSans-RegularItalic.otf similarity index 100% rename from rockskymobile/src/assets/fonts/RockfordSans-RegularItalic.otf rename to apps/web-mobile/src/assets/fonts/RockfordSans-RegularItalic.otf diff --git a/rockskymobile/src/assets/react.svg b/apps/web-mobile/src/assets/react.svg similarity index 100% rename from rockskymobile/src/assets/react.svg rename to apps/web-mobile/src/assets/react.svg diff --git a/rockskymobile/src/atoms/artist.ts b/apps/web-mobile/src/atoms/artist.ts similarity index 100% rename from rockskymobile/src/atoms/artist.ts rename to apps/web-mobile/src/atoms/artist.ts diff --git a/rockskymobile/src/atoms/likes.ts b/apps/web-mobile/src/atoms/likes.ts similarity index 100% rename from rockskymobile/src/atoms/likes.ts rename to apps/web-mobile/src/atoms/likes.ts diff --git a/rockskymobile/src/atoms/lovedTracks.ts b/apps/web-mobile/src/atoms/lovedTracks.ts similarity index 100% rename from rockskymobile/src/atoms/lovedTracks.ts rename to apps/web-mobile/src/atoms/lovedTracks.ts diff --git a/rockskymobile/src/atoms/profile.ts b/apps/web-mobile/src/atoms/profile.ts similarity index 100% rename from rockskymobile/src/atoms/profile.ts rename to apps/web-mobile/src/atoms/profile.ts diff --git a/rockskymobile/src/atoms/recentTracks.ts b/apps/web-mobile/src/atoms/recentTracks.ts similarity index 100% rename from rockskymobile/src/atoms/recentTracks.ts rename to apps/web-mobile/src/atoms/recentTracks.ts diff --git a/rockskymobile/src/atoms/shouts.ts b/apps/web-mobile/src/atoms/shouts.ts similarity index 100% rename from rockskymobile/src/atoms/shouts.ts rename to apps/web-mobile/src/atoms/shouts.ts diff --git a/rockskymobile/src/atoms/song.ts b/apps/web-mobile/src/atoms/song.ts similarity index 100% rename from rockskymobile/src/atoms/song.ts rename to apps/web-mobile/src/atoms/song.ts diff --git a/rockskymobile/src/atoms/stats.ts b/apps/web-mobile/src/atoms/stats.ts similarity index 100% rename from rockskymobile/src/atoms/stats.ts rename to apps/web-mobile/src/atoms/stats.ts diff --git a/rockskymobile/src/atoms/topAlbums.ts b/apps/web-mobile/src/atoms/topAlbums.ts similarity index 100% rename from rockskymobile/src/atoms/topAlbums.ts rename to apps/web-mobile/src/atoms/topAlbums.ts diff --git a/rockskymobile/src/atoms/topArtists.ts b/apps/web-mobile/src/atoms/topArtists.ts similarity index 100% rename from rockskymobile/src/atoms/topArtists.ts rename to apps/web-mobile/src/atoms/topArtists.ts diff --git a/rockskymobile/src/atoms/topTracks.ts b/apps/web-mobile/src/atoms/topTracks.ts similarity index 100% rename from rockskymobile/src/atoms/topTracks.ts rename to apps/web-mobile/src/atoms/topTracks.ts diff --git a/rockskymobile/src/atoms/user.ts b/apps/web-mobile/src/atoms/user.ts similarity index 100% rename from rockskymobile/src/atoms/user.ts rename to apps/web-mobile/src/atoms/user.ts diff --git a/rockskymobile/src/components/Icons/AlbumCover.tsx b/apps/web-mobile/src/components/Icons/AlbumCover.tsx similarity index 100% rename from rockskymobile/src/components/Icons/AlbumCover.tsx rename to apps/web-mobile/src/components/Icons/AlbumCover.tsx diff --git a/rockskymobile/src/components/Icons/Artist.tsx b/apps/web-mobile/src/components/Icons/Artist.tsx similarity index 100% rename from rockskymobile/src/components/Icons/Artist.tsx rename to apps/web-mobile/src/components/Icons/Artist.tsx diff --git a/rockskymobile/src/components/Icons/Disc.tsx b/apps/web-mobile/src/components/Icons/Disc.tsx similarity index 100% rename from rockskymobile/src/components/Icons/Disc.tsx rename to apps/web-mobile/src/components/Icons/Disc.tsx diff --git a/rockskymobile/src/components/Icons/Heart.tsx b/apps/web-mobile/src/components/Icons/Heart.tsx similarity index 100% rename from rockskymobile/src/components/Icons/Heart.tsx rename to apps/web-mobile/src/components/Icons/Heart.tsx diff --git a/rockskymobile/src/components/Icons/HeartOutline.tsx b/apps/web-mobile/src/components/Icons/HeartOutline.tsx similarity index 100% rename from rockskymobile/src/components/Icons/HeartOutline.tsx rename to apps/web-mobile/src/components/Icons/HeartOutline.tsx diff --git a/rockskymobile/src/components/Icons/Track.tsx b/apps/web-mobile/src/components/Icons/Track.tsx similarity index 100% rename from rockskymobile/src/components/Icons/Track.tsx rename to apps/web-mobile/src/components/Icons/Track.tsx diff --git a/rockskymobile/src/components/ScrobblesAreaChart/ScrobblesAreaChart.tsx b/apps/web-mobile/src/components/ScrobblesAreaChart/ScrobblesAreaChart.tsx similarity index 100% rename from rockskymobile/src/components/ScrobblesAreaChart/ScrobblesAreaChart.tsx rename to apps/web-mobile/src/components/ScrobblesAreaChart/ScrobblesAreaChart.tsx diff --git a/rockskymobile/src/components/ScrobblesAreaChart/index.tsx b/apps/web-mobile/src/components/ScrobblesAreaChart/index.tsx similarity index 100% rename from rockskymobile/src/components/ScrobblesAreaChart/index.tsx rename to apps/web-mobile/src/components/ScrobblesAreaChart/index.tsx diff --git a/rockskymobile/src/components/Shout/Shout.tsx b/apps/web-mobile/src/components/Shout/Shout.tsx similarity index 100% rename from rockskymobile/src/components/Shout/Shout.tsx rename to apps/web-mobile/src/components/Shout/Shout.tsx diff --git a/rockskymobile/src/components/Shout/ShoutList/Shout/DeleteShoutModal/DeleteShoutModal.tsx b/apps/web-mobile/src/components/Shout/ShoutList/Shout/DeleteShoutModal/DeleteShoutModal.tsx similarity index 100% rename from rockskymobile/src/components/Shout/ShoutList/Shout/DeleteShoutModal/DeleteShoutModal.tsx rename to apps/web-mobile/src/components/Shout/ShoutList/Shout/DeleteShoutModal/DeleteShoutModal.tsx diff --git a/rockskymobile/src/components/Shout/ShoutList/Shout/DeleteShoutModal/index.tsx b/apps/web-mobile/src/components/Shout/ShoutList/Shout/DeleteShoutModal/index.tsx similarity index 100% rename from rockskymobile/src/components/Shout/ShoutList/Shout/DeleteShoutModal/index.tsx rename to apps/web-mobile/src/components/Shout/ShoutList/Shout/DeleteShoutModal/index.tsx diff --git a/rockskymobile/src/components/Shout/ShoutList/Shout/ReplyModal/ReplyModal.tsx b/apps/web-mobile/src/components/Shout/ShoutList/Shout/ReplyModal/ReplyModal.tsx similarity index 100% rename from rockskymobile/src/components/Shout/ShoutList/Shout/ReplyModal/ReplyModal.tsx rename to apps/web-mobile/src/components/Shout/ShoutList/Shout/ReplyModal/ReplyModal.tsx diff --git a/rockskymobile/src/components/Shout/ShoutList/Shout/ReplyModal/index.tsx b/apps/web-mobile/src/components/Shout/ShoutList/Shout/ReplyModal/index.tsx similarity index 100% rename from rockskymobile/src/components/Shout/ShoutList/Shout/ReplyModal/index.tsx rename to apps/web-mobile/src/components/Shout/ShoutList/Shout/ReplyModal/index.tsx diff --git a/rockskymobile/src/components/Shout/ShoutList/Shout/Shout.tsx b/apps/web-mobile/src/components/Shout/ShoutList/Shout/Shout.tsx similarity index 100% rename from rockskymobile/src/components/Shout/ShoutList/Shout/Shout.tsx rename to apps/web-mobile/src/components/Shout/ShoutList/Shout/Shout.tsx diff --git a/rockskymobile/src/components/Shout/ShoutList/Shout/index.tsx b/apps/web-mobile/src/components/Shout/ShoutList/Shout/index.tsx similarity index 100% rename from rockskymobile/src/components/Shout/ShoutList/Shout/index.tsx rename to apps/web-mobile/src/components/Shout/ShoutList/Shout/index.tsx diff --git a/rockskymobile/src/components/Shout/ShoutList/ShoutList.tsx b/apps/web-mobile/src/components/Shout/ShoutList/ShoutList.tsx similarity index 100% rename from rockskymobile/src/components/Shout/ShoutList/ShoutList.tsx rename to apps/web-mobile/src/components/Shout/ShoutList/ShoutList.tsx diff --git a/rockskymobile/src/components/Shout/ShoutList/index.tsx b/apps/web-mobile/src/components/Shout/ShoutList/index.tsx similarity index 100% rename from rockskymobile/src/components/Shout/ShoutList/index.tsx rename to apps/web-mobile/src/components/Shout/ShoutList/index.tsx diff --git a/rockskymobile/src/components/Shout/ShoutList/mocks.ts b/apps/web-mobile/src/components/Shout/ShoutList/mocks.ts similarity index 100% rename from rockskymobile/src/components/Shout/ShoutList/mocks.ts rename to apps/web-mobile/src/components/Shout/ShoutList/mocks.ts diff --git a/rockskymobile/src/components/Shout/ShoutList/styles.css b/apps/web-mobile/src/components/Shout/ShoutList/styles.css similarity index 100% rename from rockskymobile/src/components/Shout/ShoutList/styles.css rename to apps/web-mobile/src/components/Shout/ShoutList/styles.css diff --git a/rockskymobile/src/components/Shout/index.tsx b/apps/web-mobile/src/components/Shout/index.tsx similarity index 100% rename from rockskymobile/src/components/Shout/index.tsx rename to apps/web-mobile/src/components/Shout/index.tsx diff --git a/rockskymobile/src/components/SignInModal/SignInModal.tsx b/apps/web-mobile/src/components/SignInModal/SignInModal.tsx similarity index 100% rename from rockskymobile/src/components/SignInModal/SignInModal.tsx rename to apps/web-mobile/src/components/SignInModal/SignInModal.tsx diff --git a/rockskymobile/src/components/SignInModal/index.tsx b/apps/web-mobile/src/components/SignInModal/index.tsx similarity index 100% rename from rockskymobile/src/components/SignInModal/index.tsx rename to apps/web-mobile/src/components/SignInModal/index.tsx diff --git a/rockskymobile/src/components/SongCover/SongCover.tsx b/apps/web-mobile/src/components/SongCover/SongCover.tsx similarity index 100% rename from rockskymobile/src/components/SongCover/SongCover.tsx rename to apps/web-mobile/src/components/SongCover/SongCover.tsx diff --git a/rockskymobile/src/components/SongCover/index.tsx b/apps/web-mobile/src/components/SongCover/index.tsx similarity index 100% rename from rockskymobile/src/components/SongCover/index.tsx rename to apps/web-mobile/src/components/SongCover/index.tsx diff --git a/rockskymobile/src/consts.ts b/apps/web-mobile/src/consts.ts similarity index 100% rename from rockskymobile/src/consts.ts rename to apps/web-mobile/src/consts.ts diff --git a/rockskymobile/src/hooks/useBeta.tsx b/apps/web-mobile/src/hooks/useBeta.tsx similarity index 100% rename from rockskymobile/src/hooks/useBeta.tsx rename to apps/web-mobile/src/hooks/useBeta.tsx diff --git a/rockskymobile/src/hooks/useChart.tsx b/apps/web-mobile/src/hooks/useChart.tsx similarity index 100% rename from rockskymobile/src/hooks/useChart.tsx rename to apps/web-mobile/src/hooks/useChart.tsx diff --git a/rockskymobile/src/hooks/useFeed.tsx b/apps/web-mobile/src/hooks/useFeed.tsx similarity index 100% rename from rockskymobile/src/hooks/useFeed.tsx rename to apps/web-mobile/src/hooks/useFeed.tsx diff --git a/rockskymobile/src/hooks/useFormat.tsx b/apps/web-mobile/src/hooks/useFormat.tsx similarity index 100% rename from rockskymobile/src/hooks/useFormat.tsx rename to apps/web-mobile/src/hooks/useFormat.tsx diff --git a/rockskymobile/src/hooks/useLibrary.tsx b/apps/web-mobile/src/hooks/useLibrary.tsx similarity index 100% rename from rockskymobile/src/hooks/useLibrary.tsx rename to apps/web-mobile/src/hooks/useLibrary.tsx diff --git a/rockskymobile/src/hooks/useLike.tsx b/apps/web-mobile/src/hooks/useLike.tsx similarity index 100% rename from rockskymobile/src/hooks/useLike.tsx rename to apps/web-mobile/src/hooks/useLike.tsx diff --git a/rockskymobile/src/hooks/useProfile.tsx b/apps/web-mobile/src/hooks/useProfile.tsx similarity index 100% rename from rockskymobile/src/hooks/useProfile.tsx rename to apps/web-mobile/src/hooks/useProfile.tsx diff --git a/rockskymobile/src/hooks/useSearch.tsx b/apps/web-mobile/src/hooks/useSearch.tsx similarity index 100% rename from rockskymobile/src/hooks/useSearch.tsx rename to apps/web-mobile/src/hooks/useSearch.tsx diff --git a/rockskymobile/src/hooks/useShout.tsx b/apps/web-mobile/src/hooks/useShout.tsx similarity index 100% rename from rockskymobile/src/hooks/useShout.tsx rename to apps/web-mobile/src/hooks/useShout.tsx diff --git a/rockskymobile/src/index.css b/apps/web-mobile/src/index.css similarity index 100% rename from rockskymobile/src/index.css rename to apps/web-mobile/src/index.css diff --git a/rockskymobile/src/layouts/ExternalLinks/ExternalLinks.tsx b/apps/web-mobile/src/layouts/ExternalLinks/ExternalLinks.tsx similarity index 100% rename from rockskymobile/src/layouts/ExternalLinks/ExternalLinks.tsx rename to apps/web-mobile/src/layouts/ExternalLinks/ExternalLinks.tsx diff --git a/rockskymobile/src/layouts/ExternalLinks/index.tsx b/apps/web-mobile/src/layouts/ExternalLinks/index.tsx similarity index 100% rename from rockskymobile/src/layouts/ExternalLinks/index.tsx rename to apps/web-mobile/src/layouts/ExternalLinks/index.tsx diff --git a/rockskymobile/src/layouts/Main.tsx b/apps/web-mobile/src/layouts/Main.tsx similarity index 100% rename from rockskymobile/src/layouts/Main.tsx rename to apps/web-mobile/src/layouts/Main.tsx diff --git a/rockskymobile/src/layouts/Navbar/Navbar.tsx b/apps/web-mobile/src/layouts/Navbar/Navbar.tsx similarity index 100% rename from rockskymobile/src/layouts/Navbar/Navbar.tsx rename to apps/web-mobile/src/layouts/Navbar/Navbar.tsx diff --git a/rockskymobile/src/layouts/Navbar/index.tsx b/apps/web-mobile/src/layouts/Navbar/index.tsx similarity index 100% rename from rockskymobile/src/layouts/Navbar/index.tsx rename to apps/web-mobile/src/layouts/Navbar/index.tsx diff --git a/rockskymobile/src/layouts/Search/Search.tsx b/apps/web-mobile/src/layouts/Search/Search.tsx similarity index 100% rename from rockskymobile/src/layouts/Search/Search.tsx rename to apps/web-mobile/src/layouts/Search/Search.tsx diff --git a/rockskymobile/src/layouts/Search/index.tsx b/apps/web-mobile/src/layouts/Search/index.tsx similarity index 100% rename from rockskymobile/src/layouts/Search/index.tsx rename to apps/web-mobile/src/layouts/Search/index.tsx diff --git a/rockskymobile/src/layouts/SpotifyLogin/SpotifyLogin.tsx b/apps/web-mobile/src/layouts/SpotifyLogin/SpotifyLogin.tsx similarity index 100% rename from rockskymobile/src/layouts/SpotifyLogin/SpotifyLogin.tsx rename to apps/web-mobile/src/layouts/SpotifyLogin/SpotifyLogin.tsx diff --git a/rockskymobile/src/layouts/SpotifyLogin/index.tsx b/apps/web-mobile/src/layouts/SpotifyLogin/index.tsx similarity index 100% rename from rockskymobile/src/layouts/SpotifyLogin/index.tsx rename to apps/web-mobile/src/layouts/SpotifyLogin/index.tsx diff --git a/rockskymobile/src/main.tsx b/apps/web-mobile/src/main.tsx similarity index 100% rename from rockskymobile/src/main.tsx rename to apps/web-mobile/src/main.tsx diff --git a/rockskymobile/src/pages/album/Album.tsx b/apps/web-mobile/src/pages/album/Album.tsx similarity index 100% rename from rockskymobile/src/pages/album/Album.tsx rename to apps/web-mobile/src/pages/album/Album.tsx diff --git a/rockskymobile/src/pages/album/index.tsx b/apps/web-mobile/src/pages/album/index.tsx similarity index 100% rename from rockskymobile/src/pages/album/index.tsx rename to apps/web-mobile/src/pages/album/index.tsx diff --git a/rockskymobile/src/pages/artist/Albums/Albums.tsx b/apps/web-mobile/src/pages/artist/Albums/Albums.tsx similarity index 100% rename from rockskymobile/src/pages/artist/Albums/Albums.tsx rename to apps/web-mobile/src/pages/artist/Albums/Albums.tsx diff --git a/rockskymobile/src/pages/artist/Albums/index.tsx b/apps/web-mobile/src/pages/artist/Albums/index.tsx similarity index 100% rename from rockskymobile/src/pages/artist/Albums/index.tsx rename to apps/web-mobile/src/pages/artist/Albums/index.tsx diff --git a/rockskymobile/src/pages/artist/Artist.tsx b/apps/web-mobile/src/pages/artist/Artist.tsx similarity index 100% rename from rockskymobile/src/pages/artist/Artist.tsx rename to apps/web-mobile/src/pages/artist/Artist.tsx diff --git a/rockskymobile/src/pages/artist/PopularSongs/PopularSongs.tsx b/apps/web-mobile/src/pages/artist/PopularSongs/PopularSongs.tsx similarity index 100% rename from rockskymobile/src/pages/artist/PopularSongs/PopularSongs.tsx rename to apps/web-mobile/src/pages/artist/PopularSongs/PopularSongs.tsx diff --git a/rockskymobile/src/pages/artist/PopularSongs/index.tsx b/apps/web-mobile/src/pages/artist/PopularSongs/index.tsx similarity index 100% rename from rockskymobile/src/pages/artist/PopularSongs/index.tsx rename to apps/web-mobile/src/pages/artist/PopularSongs/index.tsx diff --git a/rockskymobile/src/pages/artist/index.tsx b/apps/web-mobile/src/pages/artist/index.tsx similarity index 100% rename from rockskymobile/src/pages/artist/index.tsx rename to apps/web-mobile/src/pages/artist/index.tsx diff --git a/rockskymobile/src/pages/home/Home.tsx b/apps/web-mobile/src/pages/home/Home.tsx similarity index 100% rename from rockskymobile/src/pages/home/Home.tsx rename to apps/web-mobile/src/pages/home/Home.tsx diff --git a/rockskymobile/src/pages/home/feed/Feed.tsx b/apps/web-mobile/src/pages/home/feed/Feed.tsx similarity index 100% rename from rockskymobile/src/pages/home/feed/Feed.tsx rename to apps/web-mobile/src/pages/home/feed/Feed.tsx diff --git a/rockskymobile/src/pages/home/feed/index.tsx b/apps/web-mobile/src/pages/home/feed/index.tsx similarity index 100% rename from rockskymobile/src/pages/home/feed/index.tsx rename to apps/web-mobile/src/pages/home/feed/index.tsx diff --git a/rockskymobile/src/pages/home/feed/mocks.tsx b/apps/web-mobile/src/pages/home/feed/mocks.tsx similarity index 100% rename from rockskymobile/src/pages/home/feed/mocks.tsx rename to apps/web-mobile/src/pages/home/feed/mocks.tsx diff --git a/rockskymobile/src/pages/home/index.tsx b/apps/web-mobile/src/pages/home/index.tsx similarity index 100% rename from rockskymobile/src/pages/home/index.tsx rename to apps/web-mobile/src/pages/home/index.tsx diff --git a/rockskymobile/src/pages/profile/Profile.tsx b/apps/web-mobile/src/pages/profile/Profile.tsx similarity index 100% rename from rockskymobile/src/pages/profile/Profile.tsx rename to apps/web-mobile/src/pages/profile/Profile.tsx diff --git a/rockskymobile/src/pages/profile/index.tsx b/apps/web-mobile/src/pages/profile/index.tsx similarity index 100% rename from rockskymobile/src/pages/profile/index.tsx rename to apps/web-mobile/src/pages/profile/index.tsx diff --git a/rockskymobile/src/pages/profile/library/Library.tsx b/apps/web-mobile/src/pages/profile/library/Library.tsx similarity index 100% rename from rockskymobile/src/pages/profile/library/Library.tsx rename to apps/web-mobile/src/pages/profile/library/Library.tsx diff --git a/rockskymobile/src/pages/profile/library/albums/Albums.tsx b/apps/web-mobile/src/pages/profile/library/albums/Albums.tsx similarity index 100% rename from rockskymobile/src/pages/profile/library/albums/Albums.tsx rename to apps/web-mobile/src/pages/profile/library/albums/Albums.tsx diff --git a/rockskymobile/src/pages/profile/library/albums/index.tsx b/apps/web-mobile/src/pages/profile/library/albums/index.tsx similarity index 100% rename from rockskymobile/src/pages/profile/library/albums/index.tsx rename to apps/web-mobile/src/pages/profile/library/albums/index.tsx diff --git a/rockskymobile/src/pages/profile/library/index.tsx b/apps/web-mobile/src/pages/profile/library/index.tsx similarity index 100% rename from rockskymobile/src/pages/profile/library/index.tsx rename to apps/web-mobile/src/pages/profile/library/index.tsx diff --git a/rockskymobile/src/pages/profile/lovedtracks/LovedTracks.tsx b/apps/web-mobile/src/pages/profile/lovedtracks/LovedTracks.tsx similarity index 100% rename from rockskymobile/src/pages/profile/lovedtracks/LovedTracks.tsx rename to apps/web-mobile/src/pages/profile/lovedtracks/LovedTracks.tsx diff --git a/rockskymobile/src/pages/profile/lovedtracks/index.tsx b/apps/web-mobile/src/pages/profile/lovedtracks/index.tsx similarity index 100% rename from rockskymobile/src/pages/profile/lovedtracks/index.tsx rename to apps/web-mobile/src/pages/profile/lovedtracks/index.tsx diff --git a/rockskymobile/src/pages/profile/overview/Overview.tsx b/apps/web-mobile/src/pages/profile/overview/Overview.tsx similarity index 100% rename from rockskymobile/src/pages/profile/overview/Overview.tsx rename to apps/web-mobile/src/pages/profile/overview/Overview.tsx diff --git a/rockskymobile/src/pages/profile/overview/index.tsx b/apps/web-mobile/src/pages/profile/overview/index.tsx similarity index 100% rename from rockskymobile/src/pages/profile/overview/index.tsx rename to apps/web-mobile/src/pages/profile/overview/index.tsx diff --git a/rockskymobile/src/pages/profile/overview/recenttracks/RecentTracks.tsx b/apps/web-mobile/src/pages/profile/overview/recenttracks/RecentTracks.tsx similarity index 100% rename from rockskymobile/src/pages/profile/overview/recenttracks/RecentTracks.tsx rename to apps/web-mobile/src/pages/profile/overview/recenttracks/RecentTracks.tsx diff --git a/rockskymobile/src/pages/profile/overview/recenttracks/index.tsx b/apps/web-mobile/src/pages/profile/overview/recenttracks/index.tsx similarity index 100% rename from rockskymobile/src/pages/profile/overview/recenttracks/index.tsx rename to apps/web-mobile/src/pages/profile/overview/recenttracks/index.tsx diff --git a/rockskymobile/src/pages/profile/overview/topalbums/TopAlbums.tsx b/apps/web-mobile/src/pages/profile/overview/topalbums/TopAlbums.tsx similarity index 100% rename from rockskymobile/src/pages/profile/overview/topalbums/TopAlbums.tsx rename to apps/web-mobile/src/pages/profile/overview/topalbums/TopAlbums.tsx diff --git a/rockskymobile/src/pages/profile/overview/topalbums/index.tsx b/apps/web-mobile/src/pages/profile/overview/topalbums/index.tsx similarity index 100% rename from rockskymobile/src/pages/profile/overview/topalbums/index.tsx rename to apps/web-mobile/src/pages/profile/overview/topalbums/index.tsx diff --git a/rockskymobile/src/pages/profile/overview/topartists/TopArtists.tsx b/apps/web-mobile/src/pages/profile/overview/topartists/TopArtists.tsx similarity index 100% rename from rockskymobile/src/pages/profile/overview/topartists/TopArtists.tsx rename to apps/web-mobile/src/pages/profile/overview/topartists/TopArtists.tsx diff --git a/rockskymobile/src/pages/profile/overview/topartists/index.tsx b/apps/web-mobile/src/pages/profile/overview/topartists/index.tsx similarity index 100% rename from rockskymobile/src/pages/profile/overview/topartists/index.tsx rename to apps/web-mobile/src/pages/profile/overview/topartists/index.tsx diff --git a/rockskymobile/src/pages/profile/overview/toptracks/TopTracks.tsx b/apps/web-mobile/src/pages/profile/overview/toptracks/TopTracks.tsx similarity index 100% rename from rockskymobile/src/pages/profile/overview/toptracks/TopTracks.tsx rename to apps/web-mobile/src/pages/profile/overview/toptracks/TopTracks.tsx diff --git a/rockskymobile/src/pages/profile/overview/toptracks/index.tsx b/apps/web-mobile/src/pages/profile/overview/toptracks/index.tsx similarity index 100% rename from rockskymobile/src/pages/profile/overview/toptracks/index.tsx rename to apps/web-mobile/src/pages/profile/overview/toptracks/index.tsx diff --git a/rockskymobile/src/pages/profile/playlists/Playlists.tsx b/apps/web-mobile/src/pages/profile/playlists/Playlists.tsx similarity index 100% rename from rockskymobile/src/pages/profile/playlists/Playlists.tsx rename to apps/web-mobile/src/pages/profile/playlists/Playlists.tsx diff --git a/rockskymobile/src/pages/profile/playlists/index.tsx b/apps/web-mobile/src/pages/profile/playlists/index.tsx similarity index 100% rename from rockskymobile/src/pages/profile/playlists/index.tsx rename to apps/web-mobile/src/pages/profile/playlists/index.tsx diff --git a/rockskymobile/src/pages/song/Song.tsx b/apps/web-mobile/src/pages/song/Song.tsx similarity index 100% rename from rockskymobile/src/pages/song/Song.tsx rename to apps/web-mobile/src/pages/song/Song.tsx diff --git a/rockskymobile/src/pages/song/index.tsx b/apps/web-mobile/src/pages/song/index.tsx similarity index 100% rename from rockskymobile/src/pages/song/index.tsx rename to apps/web-mobile/src/pages/song/index.tsx diff --git a/rockskymobile/src/stories/Button.stories.ts b/apps/web-mobile/src/stories/Button.stories.ts similarity index 100% rename from rockskymobile/src/stories/Button.stories.ts rename to apps/web-mobile/src/stories/Button.stories.ts diff --git a/rockskymobile/src/stories/Button.tsx b/apps/web-mobile/src/stories/Button.tsx similarity index 100% rename from rockskymobile/src/stories/Button.tsx rename to apps/web-mobile/src/stories/Button.tsx diff --git a/rockskymobile/src/stories/Configure.mdx b/apps/web-mobile/src/stories/Configure.mdx similarity index 100% rename from rockskymobile/src/stories/Configure.mdx rename to apps/web-mobile/src/stories/Configure.mdx diff --git a/rockskymobile/src/stories/Header.stories.ts b/apps/web-mobile/src/stories/Header.stories.ts similarity index 100% rename from rockskymobile/src/stories/Header.stories.ts rename to apps/web-mobile/src/stories/Header.stories.ts diff --git a/rockskymobile/src/stories/Header.tsx b/apps/web-mobile/src/stories/Header.tsx similarity index 100% rename from rockskymobile/src/stories/Header.tsx rename to apps/web-mobile/src/stories/Header.tsx diff --git a/rockskymobile/src/stories/Page.stories.ts b/apps/web-mobile/src/stories/Page.stories.ts similarity index 100% rename from rockskymobile/src/stories/Page.stories.ts rename to apps/web-mobile/src/stories/Page.stories.ts diff --git a/rockskymobile/src/stories/Page.tsx b/apps/web-mobile/src/stories/Page.tsx similarity index 100% rename from rockskymobile/src/stories/Page.tsx rename to apps/web-mobile/src/stories/Page.tsx diff --git a/rockskymobile/src/stories/assets/accessibility.png b/apps/web-mobile/src/stories/assets/accessibility.png similarity index 100% rename from rockskymobile/src/stories/assets/accessibility.png rename to apps/web-mobile/src/stories/assets/accessibility.png diff --git a/rockskymobile/src/stories/assets/accessibility.svg b/apps/web-mobile/src/stories/assets/accessibility.svg similarity index 100% rename from rockskymobile/src/stories/assets/accessibility.svg rename to apps/web-mobile/src/stories/assets/accessibility.svg diff --git a/rockskymobile/src/stories/assets/addon-library.png b/apps/web-mobile/src/stories/assets/addon-library.png similarity index 100% rename from rockskymobile/src/stories/assets/addon-library.png rename to apps/web-mobile/src/stories/assets/addon-library.png diff --git a/rockskymobile/src/stories/assets/assets.png b/apps/web-mobile/src/stories/assets/assets.png similarity index 100% rename from rockskymobile/src/stories/assets/assets.png rename to apps/web-mobile/src/stories/assets/assets.png diff --git a/rockskymobile/src/stories/assets/avif-test-image.avif b/apps/web-mobile/src/stories/assets/avif-test-image.avif similarity index 100% rename from rockskymobile/src/stories/assets/avif-test-image.avif rename to apps/web-mobile/src/stories/assets/avif-test-image.avif diff --git a/rockskymobile/src/stories/assets/context.png b/apps/web-mobile/src/stories/assets/context.png similarity index 100% rename from rockskymobile/src/stories/assets/context.png rename to apps/web-mobile/src/stories/assets/context.png diff --git a/rockskymobile/src/stories/assets/discord.svg b/apps/web-mobile/src/stories/assets/discord.svg similarity index 100% rename from rockskymobile/src/stories/assets/discord.svg rename to apps/web-mobile/src/stories/assets/discord.svg diff --git a/rockskymobile/src/stories/assets/docs.png b/apps/web-mobile/src/stories/assets/docs.png similarity index 100% rename from rockskymobile/src/stories/assets/docs.png rename to apps/web-mobile/src/stories/assets/docs.png diff --git a/rockskymobile/src/stories/assets/figma-plugin.png b/apps/web-mobile/src/stories/assets/figma-plugin.png similarity index 100% rename from rockskymobile/src/stories/assets/figma-plugin.png rename to apps/web-mobile/src/stories/assets/figma-plugin.png diff --git a/rockskymobile/src/stories/assets/github.svg b/apps/web-mobile/src/stories/assets/github.svg similarity index 100% rename from rockskymobile/src/stories/assets/github.svg rename to apps/web-mobile/src/stories/assets/github.svg diff --git a/rockskymobile/src/stories/assets/share.png b/apps/web-mobile/src/stories/assets/share.png similarity index 100% rename from rockskymobile/src/stories/assets/share.png rename to apps/web-mobile/src/stories/assets/share.png diff --git a/rockskymobile/src/stories/assets/styling.png b/apps/web-mobile/src/stories/assets/styling.png similarity index 100% rename from rockskymobile/src/stories/assets/styling.png rename to apps/web-mobile/src/stories/assets/styling.png diff --git a/rockskymobile/src/stories/assets/testing.png b/apps/web-mobile/src/stories/assets/testing.png similarity index 100% rename from rockskymobile/src/stories/assets/testing.png rename to apps/web-mobile/src/stories/assets/testing.png diff --git a/rockskymobile/src/stories/assets/theming.png b/apps/web-mobile/src/stories/assets/theming.png similarity index 100% rename from rockskymobile/src/stories/assets/theming.png rename to apps/web-mobile/src/stories/assets/theming.png diff --git a/rockskymobile/src/stories/assets/tutorials.svg b/apps/web-mobile/src/stories/assets/tutorials.svg similarity index 100% rename from rockskymobile/src/stories/assets/tutorials.svg rename to apps/web-mobile/src/stories/assets/tutorials.svg diff --git a/rockskymobile/src/stories/assets/youtube.svg b/apps/web-mobile/src/stories/assets/youtube.svg similarity index 100% rename from rockskymobile/src/stories/assets/youtube.svg rename to apps/web-mobile/src/stories/assets/youtube.svg diff --git a/rockskymobile/src/stories/button.css b/apps/web-mobile/src/stories/button.css similarity index 100% rename from rockskymobile/src/stories/button.css rename to apps/web-mobile/src/stories/button.css diff --git a/rockskymobile/src/stories/header.css b/apps/web-mobile/src/stories/header.css similarity index 100% rename from rockskymobile/src/stories/header.css rename to apps/web-mobile/src/stories/header.css diff --git a/rockskymobile/src/stories/page.css b/apps/web-mobile/src/stories/page.css similarity index 100% rename from rockskymobile/src/stories/page.css rename to apps/web-mobile/src/stories/page.css diff --git a/rockskymobile/src/types/scrobble.ts b/apps/web-mobile/src/types/scrobble.ts similarity index 100% rename from rockskymobile/src/types/scrobble.ts rename to apps/web-mobile/src/types/scrobble.ts diff --git a/rockskymobile/src/vite-env.d.ts b/apps/web-mobile/src/vite-env.d.ts similarity index 100% rename from rockskymobile/src/vite-env.d.ts rename to apps/web-mobile/src/vite-env.d.ts diff --git a/rockskymobile/tsconfig.app.json b/apps/web-mobile/tsconfig.app.json similarity index 100% rename from rockskymobile/tsconfig.app.json rename to apps/web-mobile/tsconfig.app.json diff --git a/rockskymobile/tsconfig.json b/apps/web-mobile/tsconfig.json similarity index 100% rename from rockskymobile/tsconfig.json rename to apps/web-mobile/tsconfig.json diff --git a/rockskymobile/tsconfig.node.json b/apps/web-mobile/tsconfig.node.json similarity index 100% rename from rockskymobile/tsconfig.node.json rename to apps/web-mobile/tsconfig.node.json diff --git a/rockskymobile/vite.config.ts b/apps/web-mobile/vite.config.ts similarity index 100% rename from rockskymobile/vite.config.ts rename to apps/web-mobile/vite.config.ts diff --git a/rockskyweb/.env.example b/apps/web/.env.example similarity index 100% rename from rockskyweb/.env.example rename to apps/web/.env.example diff --git a/rockskyweb/.gitignore b/apps/web/.gitignore similarity index 100% rename from rockskyweb/.gitignore rename to apps/web/.gitignore diff --git a/rockskyweb/.storybook/main.ts b/apps/web/.storybook/main.ts similarity index 100% rename from rockskyweb/.storybook/main.ts rename to apps/web/.storybook/main.ts diff --git a/rockskyweb/.storybook/preview.ts b/apps/web/.storybook/preview.ts similarity index 100% rename from rockskyweb/.storybook/preview.ts rename to apps/web/.storybook/preview.ts diff --git a/rockskyweb/README.md b/apps/web/README.md similarity index 100% rename from rockskyweb/README.md rename to apps/web/README.md diff --git a/rockskyweb/bun.lock b/apps/web/bun.lock similarity index 100% rename from rockskyweb/bun.lock rename to apps/web/bun.lock diff --git a/rockskyweb/eslint.config.js b/apps/web/eslint.config.js similarity index 100% rename from rockskyweb/eslint.config.js rename to apps/web/eslint.config.js diff --git a/rockskyweb/index.html b/apps/web/index.html similarity index 100% rename from rockskyweb/index.html rename to apps/web/index.html diff --git a/rockskyweb/package-lock.json b/apps/web/package-lock.json similarity index 100% rename from rockskyweb/package-lock.json rename to apps/web/package-lock.json diff --git a/rockskyweb/package.json b/apps/web/package.json similarity index 99% rename from rockskyweb/package.json rename to apps/web/package.json index b733e580..a3be5b33 100644 --- a/rockskyweb/package.json +++ b/apps/web/package.json @@ -1,5 +1,5 @@ { - "name": "rocksky", + "name": "@rocksky/web", "private": true, "version": "0.0.0", "type": "module", diff --git a/rockskyweb/public/favicon.jpg b/apps/web/public/favicon.jpg similarity index 100% rename from rockskyweb/public/favicon.jpg rename to apps/web/public/favicon.jpg diff --git a/rockskyweb/public/vite.svg b/apps/web/public/vite.svg similarity index 100% rename from rockskyweb/public/vite.svg rename to apps/web/public/vite.svg diff --git a/rockskyweb/src/App.tsx b/apps/web/src/App.tsx similarity index 100% rename from rockskyweb/src/App.tsx rename to apps/web/src/App.tsx diff --git a/rockskyweb/src/api/apikeys.ts b/apps/web/src/api/apikeys.ts similarity index 100% rename from rockskyweb/src/api/apikeys.ts rename to apps/web/src/api/apikeys.ts diff --git a/rockskyweb/src/api/beta.ts b/apps/web/src/api/beta.ts similarity index 100% rename from rockskyweb/src/api/beta.ts rename to apps/web/src/api/beta.ts diff --git a/rockskyweb/src/api/charts.ts b/apps/web/src/api/charts.ts similarity index 100% rename from rockskyweb/src/api/charts.ts rename to apps/web/src/api/charts.ts diff --git a/rockskyweb/src/api/dropbox.ts b/apps/web/src/api/dropbox.ts similarity index 100% rename from rockskyweb/src/api/dropbox.ts rename to apps/web/src/api/dropbox.ts diff --git a/rockskyweb/src/api/feed.ts b/apps/web/src/api/feed.ts similarity index 100% rename from rockskyweb/src/api/feed.ts rename to apps/web/src/api/feed.ts diff --git a/rockskyweb/src/api/googledrive.ts b/apps/web/src/api/googledrive.ts similarity index 100% rename from rockskyweb/src/api/googledrive.ts rename to apps/web/src/api/googledrive.ts diff --git a/rockskyweb/src/api/library.ts b/apps/web/src/api/library.ts similarity index 100% rename from rockskyweb/src/api/library.ts rename to apps/web/src/api/library.ts diff --git a/rockskyweb/src/api/likes.ts b/apps/web/src/api/likes.ts similarity index 100% rename from rockskyweb/src/api/likes.ts rename to apps/web/src/api/likes.ts diff --git a/rockskyweb/src/api/playlists.ts b/apps/web/src/api/playlists.ts similarity index 100% rename from rockskyweb/src/api/playlists.ts rename to apps/web/src/api/playlists.ts diff --git a/rockskyweb/src/api/profile.ts b/apps/web/src/api/profile.ts similarity index 100% rename from rockskyweb/src/api/profile.ts rename to apps/web/src/api/profile.ts diff --git a/rockskyweb/src/api/search.ts b/apps/web/src/api/search.ts similarity index 100% rename from rockskyweb/src/api/search.ts rename to apps/web/src/api/search.ts diff --git a/rockskyweb/src/api/shouts.ts b/apps/web/src/api/shouts.ts similarity index 100% rename from rockskyweb/src/api/shouts.ts rename to apps/web/src/api/shouts.ts diff --git a/rockskyweb/src/api/spotify.ts b/apps/web/src/api/spotify.ts similarity index 100% rename from rockskyweb/src/api/spotify.ts rename to apps/web/src/api/spotify.ts diff --git a/rockskyweb/src/assets/fonts/RockfordSans-Bold.otf b/apps/web/src/assets/fonts/RockfordSans-Bold.otf similarity index 100% rename from rockskyweb/src/assets/fonts/RockfordSans-Bold.otf rename to apps/web/src/assets/fonts/RockfordSans-Bold.otf diff --git a/rockskyweb/src/assets/fonts/RockfordSans-BoldItalic.otf b/apps/web/src/assets/fonts/RockfordSans-BoldItalic.otf similarity index 100% rename from rockskyweb/src/assets/fonts/RockfordSans-BoldItalic.otf rename to apps/web/src/assets/fonts/RockfordSans-BoldItalic.otf diff --git a/rockskyweb/src/assets/fonts/RockfordSans-ExtraBold.otf b/apps/web/src/assets/fonts/RockfordSans-ExtraBold.otf similarity index 100% rename from rockskyweb/src/assets/fonts/RockfordSans-ExtraBold.otf rename to apps/web/src/assets/fonts/RockfordSans-ExtraBold.otf diff --git a/rockskyweb/src/assets/fonts/RockfordSans-Light.otf b/apps/web/src/assets/fonts/RockfordSans-Light.otf similarity index 100% rename from rockskyweb/src/assets/fonts/RockfordSans-Light.otf rename to apps/web/src/assets/fonts/RockfordSans-Light.otf diff --git a/rockskyweb/src/assets/fonts/RockfordSans-Medium.otf b/apps/web/src/assets/fonts/RockfordSans-Medium.otf similarity index 100% rename from rockskyweb/src/assets/fonts/RockfordSans-Medium.otf rename to apps/web/src/assets/fonts/RockfordSans-Medium.otf diff --git a/rockskyweb/src/assets/fonts/RockfordSans-Regular.otf b/apps/web/src/assets/fonts/RockfordSans-Regular.otf similarity index 100% rename from rockskyweb/src/assets/fonts/RockfordSans-Regular.otf rename to apps/web/src/assets/fonts/RockfordSans-Regular.otf diff --git a/rockskyweb/src/assets/fonts/RockfordSans-RegularItalic.otf b/apps/web/src/assets/fonts/RockfordSans-RegularItalic.otf similarity index 100% rename from rockskyweb/src/assets/fonts/RockfordSans-RegularItalic.otf rename to apps/web/src/assets/fonts/RockfordSans-RegularItalic.otf diff --git a/rockskyweb/src/assets/react.svg b/apps/web/src/assets/react.svg similarity index 100% rename from rockskyweb/src/assets/react.svg rename to apps/web/src/assets/react.svg diff --git a/rockskyweb/src/assets/webscrobbler-logo.png b/apps/web/src/assets/webscrobbler-logo.png similarity index 100% rename from rockskyweb/src/assets/webscrobbler-logo.png rename to apps/web/src/assets/webscrobbler-logo.png diff --git a/rockskyweb/src/atoms/apikeys.ts b/apps/web/src/atoms/apikeys.ts similarity index 100% rename from rockskyweb/src/atoms/apikeys.ts rename to apps/web/src/atoms/apikeys.ts diff --git a/rockskyweb/src/atoms/artist.ts b/apps/web/src/atoms/artist.ts similarity index 100% rename from rockskyweb/src/atoms/artist.ts rename to apps/web/src/atoms/artist.ts diff --git a/rockskyweb/src/atoms/dropbox.ts b/apps/web/src/atoms/dropbox.ts similarity index 100% rename from rockskyweb/src/atoms/dropbox.ts rename to apps/web/src/atoms/dropbox.ts diff --git a/rockskyweb/src/atoms/googledrive.ts b/apps/web/src/atoms/googledrive.ts similarity index 100% rename from rockskyweb/src/atoms/googledrive.ts rename to apps/web/src/atoms/googledrive.ts diff --git a/rockskyweb/src/atoms/likes.ts b/apps/web/src/atoms/likes.ts similarity index 100% rename from rockskyweb/src/atoms/likes.ts rename to apps/web/src/atoms/likes.ts diff --git a/rockskyweb/src/atoms/lovedTracks.ts b/apps/web/src/atoms/lovedTracks.ts similarity index 100% rename from rockskyweb/src/atoms/lovedTracks.ts rename to apps/web/src/atoms/lovedTracks.ts diff --git a/rockskyweb/src/atoms/nowpaying.ts b/apps/web/src/atoms/nowpaying.ts similarity index 100% rename from rockskyweb/src/atoms/nowpaying.ts rename to apps/web/src/atoms/nowpaying.ts diff --git a/rockskyweb/src/atoms/player.ts b/apps/web/src/atoms/player.ts similarity index 100% rename from rockskyweb/src/atoms/player.ts rename to apps/web/src/atoms/player.ts diff --git a/rockskyweb/src/atoms/playlists.ts b/apps/web/src/atoms/playlists.ts similarity index 100% rename from rockskyweb/src/atoms/playlists.ts rename to apps/web/src/atoms/playlists.ts diff --git a/rockskyweb/src/atoms/profile.ts b/apps/web/src/atoms/profile.ts similarity index 100% rename from rockskyweb/src/atoms/profile.ts rename to apps/web/src/atoms/profile.ts diff --git a/rockskyweb/src/atoms/profiles.ts b/apps/web/src/atoms/profiles.ts similarity index 100% rename from rockskyweb/src/atoms/profiles.ts rename to apps/web/src/atoms/profiles.ts diff --git a/rockskyweb/src/atoms/queue.ts b/apps/web/src/atoms/queue.ts similarity index 100% rename from rockskyweb/src/atoms/queue.ts rename to apps/web/src/atoms/queue.ts diff --git a/rockskyweb/src/atoms/recentTracks.ts b/apps/web/src/atoms/recentTracks.ts similarity index 100% rename from rockskyweb/src/atoms/recentTracks.ts rename to apps/web/src/atoms/recentTracks.ts diff --git a/rockskyweb/src/atoms/shouts.ts b/apps/web/src/atoms/shouts.ts similarity index 100% rename from rockskyweb/src/atoms/shouts.ts rename to apps/web/src/atoms/shouts.ts diff --git a/rockskyweb/src/atoms/song.ts b/apps/web/src/atoms/song.ts similarity index 100% rename from rockskyweb/src/atoms/song.ts rename to apps/web/src/atoms/song.ts diff --git a/rockskyweb/src/atoms/stats.ts b/apps/web/src/atoms/stats.ts similarity index 100% rename from rockskyweb/src/atoms/stats.ts rename to apps/web/src/atoms/stats.ts diff --git a/rockskyweb/src/atoms/theme.ts b/apps/web/src/atoms/theme.ts similarity index 100% rename from rockskyweb/src/atoms/theme.ts rename to apps/web/src/atoms/theme.ts diff --git a/rockskyweb/src/atoms/topAlbums.ts b/apps/web/src/atoms/topAlbums.ts similarity index 100% rename from rockskyweb/src/atoms/topAlbums.ts rename to apps/web/src/atoms/topAlbums.ts diff --git a/rockskyweb/src/atoms/topArtists.ts b/apps/web/src/atoms/topArtists.ts similarity index 100% rename from rockskyweb/src/atoms/topArtists.ts rename to apps/web/src/atoms/topArtists.ts diff --git a/rockskyweb/src/atoms/topTracks.ts b/apps/web/src/atoms/topTracks.ts similarity index 100% rename from rockskyweb/src/atoms/topTracks.ts rename to apps/web/src/atoms/topTracks.ts diff --git a/rockskyweb/src/atoms/user.ts b/apps/web/src/atoms/user.ts similarity index 100% rename from rockskyweb/src/atoms/user.ts rename to apps/web/src/atoms/user.ts diff --git a/rockskyweb/src/atoms/userNowplaying.ts b/apps/web/src/atoms/userNowplaying.ts similarity index 100% rename from rockskyweb/src/atoms/userNowplaying.ts rename to apps/web/src/atoms/userNowplaying.ts diff --git a/rockskyweb/src/components/Handle/Handle.tsx b/apps/web/src/components/Handle/Handle.tsx similarity index 100% rename from rockskyweb/src/components/Handle/Handle.tsx rename to apps/web/src/components/Handle/Handle.tsx diff --git a/rockskyweb/src/components/Handle/NowPlaying/NowPlaying.tsx b/apps/web/src/components/Handle/NowPlaying/NowPlaying.tsx similarity index 100% rename from rockskyweb/src/components/Handle/NowPlaying/NowPlaying.tsx rename to apps/web/src/components/Handle/NowPlaying/NowPlaying.tsx diff --git a/rockskyweb/src/components/Handle/NowPlaying/index.tsx b/apps/web/src/components/Handle/NowPlaying/index.tsx similarity index 100% rename from rockskyweb/src/components/Handle/NowPlaying/index.tsx rename to apps/web/src/components/Handle/NowPlaying/index.tsx diff --git a/rockskyweb/src/components/Handle/NowPlaying/styles.tsx b/apps/web/src/components/Handle/NowPlaying/styles.tsx similarity index 100% rename from rockskyweb/src/components/Handle/NowPlaying/styles.tsx rename to apps/web/src/components/Handle/NowPlaying/styles.tsx diff --git a/rockskyweb/src/components/Handle/index.tsx b/apps/web/src/components/Handle/index.tsx similarity index 100% rename from rockskyweb/src/components/Handle/index.tsx rename to apps/web/src/components/Handle/index.tsx diff --git a/rockskyweb/src/components/Handle/styles.tsx b/apps/web/src/components/Handle/styles.tsx similarity index 100% rename from rockskyweb/src/components/Handle/styles.tsx rename to apps/web/src/components/Handle/styles.tsx diff --git a/rockskyweb/src/components/Icons/AlbumCover.tsx b/apps/web/src/components/Icons/AlbumCover.tsx similarity index 100% rename from rockskyweb/src/components/Icons/AlbumCover.tsx rename to apps/web/src/components/Icons/AlbumCover.tsx diff --git a/rockskyweb/src/components/Icons/ArrowBack.tsx b/apps/web/src/components/Icons/ArrowBack.tsx similarity index 100% rename from rockskyweb/src/components/Icons/ArrowBack.tsx rename to apps/web/src/components/Icons/ArrowBack.tsx diff --git a/rockskyweb/src/components/Icons/Artist.tsx b/apps/web/src/components/Icons/Artist.tsx similarity index 100% rename from rockskyweb/src/components/Icons/Artist.tsx rename to apps/web/src/components/Icons/Artist.tsx diff --git a/rockskyweb/src/components/Icons/Composer.tsx b/apps/web/src/components/Icons/Composer.tsx similarity index 100% rename from rockskyweb/src/components/Icons/Composer.tsx rename to apps/web/src/components/Icons/Composer.tsx diff --git a/rockskyweb/src/components/Icons/Disc.tsx b/apps/web/src/components/Icons/Disc.tsx similarity index 100% rename from rockskyweb/src/components/Icons/Disc.tsx rename to apps/web/src/components/Icons/Disc.tsx diff --git a/rockskyweb/src/components/Icons/Dropbox.tsx b/apps/web/src/components/Icons/Dropbox.tsx similarity index 100% rename from rockskyweb/src/components/Icons/Dropbox.tsx rename to apps/web/src/components/Icons/Dropbox.tsx diff --git a/rockskyweb/src/components/Icons/Equalizer.tsx b/apps/web/src/components/Icons/Equalizer.tsx similarity index 100% rename from rockskyweb/src/components/Icons/Equalizer.tsx rename to apps/web/src/components/Icons/Equalizer.tsx diff --git a/rockskyweb/src/components/Icons/GoogleDrive.tsx b/apps/web/src/components/Icons/GoogleDrive.tsx similarity index 100% rename from rockskyweb/src/components/Icons/GoogleDrive.tsx rename to apps/web/src/components/Icons/GoogleDrive.tsx diff --git a/rockskyweb/src/components/Icons/Heart.tsx b/apps/web/src/components/Icons/Heart.tsx similarity index 100% rename from rockskyweb/src/components/Icons/Heart.tsx rename to apps/web/src/components/Icons/Heart.tsx diff --git a/rockskyweb/src/components/Icons/HeartOutline.tsx b/apps/web/src/components/Icons/HeartOutline.tsx similarity index 100% rename from rockskyweb/src/components/Icons/HeartOutline.tsx rename to apps/web/src/components/Icons/HeartOutline.tsx diff --git a/rockskyweb/src/components/Icons/Next.tsx b/apps/web/src/components/Icons/Next.tsx similarity index 100% rename from rockskyweb/src/components/Icons/Next.tsx rename to apps/web/src/components/Icons/Next.tsx diff --git a/rockskyweb/src/components/Icons/Pause.tsx b/apps/web/src/components/Icons/Pause.tsx similarity index 100% rename from rockskyweb/src/components/Icons/Pause.tsx rename to apps/web/src/components/Icons/Pause.tsx diff --git a/rockskyweb/src/components/Icons/Play.tsx b/apps/web/src/components/Icons/Play.tsx similarity index 100% rename from rockskyweb/src/components/Icons/Play.tsx rename to apps/web/src/components/Icons/Play.tsx diff --git a/rockskyweb/src/components/Icons/Playlist.tsx b/apps/web/src/components/Icons/Playlist.tsx similarity index 100% rename from rockskyweb/src/components/Icons/Playlist.tsx rename to apps/web/src/components/Icons/Playlist.tsx diff --git a/rockskyweb/src/components/Icons/Previous.tsx b/apps/web/src/components/Icons/Previous.tsx similarity index 100% rename from rockskyweb/src/components/Icons/Previous.tsx rename to apps/web/src/components/Icons/Previous.tsx diff --git a/rockskyweb/src/components/Icons/Speaker.tsx b/apps/web/src/components/Icons/Speaker.tsx similarity index 100% rename from rockskyweb/src/components/Icons/Speaker.tsx rename to apps/web/src/components/Icons/Speaker.tsx diff --git a/rockskyweb/src/components/Icons/Track.tsx b/apps/web/src/components/Icons/Track.tsx similarity index 100% rename from rockskyweb/src/components/Icons/Track.tsx rename to apps/web/src/components/Icons/Track.tsx diff --git a/rockskyweb/src/components/ScrobblesAreaChart/ScrobblesAreaChart.tsx b/apps/web/src/components/ScrobblesAreaChart/ScrobblesAreaChart.tsx similarity index 100% rename from rockskyweb/src/components/ScrobblesAreaChart/ScrobblesAreaChart.tsx rename to apps/web/src/components/ScrobblesAreaChart/ScrobblesAreaChart.tsx diff --git a/rockskyweb/src/components/ScrobblesAreaChart/index.tsx b/apps/web/src/components/ScrobblesAreaChart/index.tsx similarity index 100% rename from rockskyweb/src/components/ScrobblesAreaChart/index.tsx rename to apps/web/src/components/ScrobblesAreaChart/index.tsx diff --git a/rockskyweb/src/components/Shout/Shout.tsx b/apps/web/src/components/Shout/Shout.tsx similarity index 100% rename from rockskyweb/src/components/Shout/Shout.tsx rename to apps/web/src/components/Shout/Shout.tsx diff --git a/rockskyweb/src/components/Shout/ShoutList/Shout/DeleteShoutModal/DeleteShoutModal.tsx b/apps/web/src/components/Shout/ShoutList/Shout/DeleteShoutModal/DeleteShoutModal.tsx similarity index 100% rename from rockskyweb/src/components/Shout/ShoutList/Shout/DeleteShoutModal/DeleteShoutModal.tsx rename to apps/web/src/components/Shout/ShoutList/Shout/DeleteShoutModal/DeleteShoutModal.tsx diff --git a/rockskyweb/src/components/Shout/ShoutList/Shout/DeleteShoutModal/index.tsx b/apps/web/src/components/Shout/ShoutList/Shout/DeleteShoutModal/index.tsx similarity index 100% rename from rockskyweb/src/components/Shout/ShoutList/Shout/DeleteShoutModal/index.tsx rename to apps/web/src/components/Shout/ShoutList/Shout/DeleteShoutModal/index.tsx diff --git a/rockskyweb/src/components/Shout/ShoutList/Shout/ReplyModal/ReplyModal.tsx b/apps/web/src/components/Shout/ShoutList/Shout/ReplyModal/ReplyModal.tsx similarity index 100% rename from rockskyweb/src/components/Shout/ShoutList/Shout/ReplyModal/ReplyModal.tsx rename to apps/web/src/components/Shout/ShoutList/Shout/ReplyModal/ReplyModal.tsx diff --git a/rockskyweb/src/components/Shout/ShoutList/Shout/ReplyModal/index.tsx b/apps/web/src/components/Shout/ShoutList/Shout/ReplyModal/index.tsx similarity index 100% rename from rockskyweb/src/components/Shout/ShoutList/Shout/ReplyModal/index.tsx rename to apps/web/src/components/Shout/ShoutList/Shout/ReplyModal/index.tsx diff --git a/rockskyweb/src/components/Shout/ShoutList/Shout/Shout.tsx b/apps/web/src/components/Shout/ShoutList/Shout/Shout.tsx similarity index 100% rename from rockskyweb/src/components/Shout/ShoutList/Shout/Shout.tsx rename to apps/web/src/components/Shout/ShoutList/Shout/Shout.tsx diff --git a/rockskyweb/src/components/Shout/ShoutList/Shout/index.tsx b/apps/web/src/components/Shout/ShoutList/Shout/index.tsx similarity index 100% rename from rockskyweb/src/components/Shout/ShoutList/Shout/index.tsx rename to apps/web/src/components/Shout/ShoutList/Shout/index.tsx diff --git a/rockskyweb/src/components/Shout/ShoutList/ShoutList.tsx b/apps/web/src/components/Shout/ShoutList/ShoutList.tsx similarity index 100% rename from rockskyweb/src/components/Shout/ShoutList/ShoutList.tsx rename to apps/web/src/components/Shout/ShoutList/ShoutList.tsx diff --git a/rockskyweb/src/components/Shout/ShoutList/index.tsx b/apps/web/src/components/Shout/ShoutList/index.tsx similarity index 100% rename from rockskyweb/src/components/Shout/ShoutList/index.tsx rename to apps/web/src/components/Shout/ShoutList/index.tsx diff --git a/rockskyweb/src/components/Shout/ShoutList/mocks.ts b/apps/web/src/components/Shout/ShoutList/mocks.ts similarity index 100% rename from rockskyweb/src/components/Shout/ShoutList/mocks.ts rename to apps/web/src/components/Shout/ShoutList/mocks.ts diff --git a/rockskyweb/src/components/Shout/index.tsx b/apps/web/src/components/Shout/index.tsx similarity index 100% rename from rockskyweb/src/components/Shout/index.tsx rename to apps/web/src/components/Shout/index.tsx diff --git a/rockskyweb/src/components/SignInModal/SignInModal.tsx b/apps/web/src/components/SignInModal/SignInModal.tsx similarity index 100% rename from rockskyweb/src/components/SignInModal/SignInModal.tsx rename to apps/web/src/components/SignInModal/SignInModal.tsx diff --git a/rockskyweb/src/components/SignInModal/index.tsx b/apps/web/src/components/SignInModal/index.tsx similarity index 100% rename from rockskyweb/src/components/SignInModal/index.tsx rename to apps/web/src/components/SignInModal/index.tsx diff --git a/rockskyweb/src/components/SongCover/SongCover.tsx b/apps/web/src/components/SongCover/SongCover.tsx similarity index 100% rename from rockskyweb/src/components/SongCover/SongCover.tsx rename to apps/web/src/components/SongCover/SongCover.tsx diff --git a/rockskyweb/src/components/SongCover/index.tsx b/apps/web/src/components/SongCover/index.tsx similarity index 100% rename from rockskyweb/src/components/SongCover/index.tsx rename to apps/web/src/components/SongCover/index.tsx diff --git a/rockskyweb/src/components/Stats/Stats.tsx b/apps/web/src/components/Stats/Stats.tsx similarity index 100% rename from rockskyweb/src/components/Stats/Stats.tsx rename to apps/web/src/components/Stats/Stats.tsx diff --git a/rockskyweb/src/components/Stats/index.tsx b/apps/web/src/components/Stats/index.tsx similarity index 100% rename from rockskyweb/src/components/Stats/index.tsx rename to apps/web/src/components/Stats/index.tsx diff --git a/rockskyweb/src/components/StickyPlayer/StickyPlayerWithData.tsx b/apps/web/src/components/StickyPlayer/StickyPlayerWithData.tsx similarity index 100% rename from rockskyweb/src/components/StickyPlayer/StickyPlayerWithData.tsx rename to apps/web/src/components/StickyPlayer/StickyPlayerWithData.tsx diff --git a/rockskyweb/src/components/StickyPlayer/StrickyPlayer.tsx b/apps/web/src/components/StickyPlayer/StrickyPlayer.tsx similarity index 100% rename from rockskyweb/src/components/StickyPlayer/StrickyPlayer.tsx rename to apps/web/src/components/StickyPlayer/StrickyPlayer.tsx diff --git a/rockskyweb/src/components/StickyPlayer/index.tsx b/apps/web/src/components/StickyPlayer/index.tsx similarity index 100% rename from rockskyweb/src/components/StickyPlayer/index.tsx rename to apps/web/src/components/StickyPlayer/index.tsx diff --git a/rockskyweb/src/components/StickyPlayer/styles.ts b/apps/web/src/components/StickyPlayer/styles.ts similarity index 100% rename from rockskyweb/src/components/StickyPlayer/styles.ts rename to apps/web/src/components/StickyPlayer/styles.ts diff --git a/rockskyweb/src/components/Table/Table.tsx b/apps/web/src/components/Table/Table.tsx similarity index 100% rename from rockskyweb/src/components/Table/Table.tsx rename to apps/web/src/components/Table/Table.tsx diff --git a/rockskyweb/src/components/Table/index.tsx b/apps/web/src/components/Table/index.tsx similarity index 100% rename from rockskyweb/src/components/Table/index.tsx rename to apps/web/src/components/Table/index.tsx diff --git a/rockskyweb/src/consts.ts b/apps/web/src/consts.ts similarity index 100% rename from rockskyweb/src/consts.ts rename to apps/web/src/consts.ts diff --git a/rockskyweb/src/hooks/useApikey.tsx b/apps/web/src/hooks/useApikey.tsx similarity index 100% rename from rockskyweb/src/hooks/useApikey.tsx rename to apps/web/src/hooks/useApikey.tsx diff --git a/rockskyweb/src/hooks/useBeta.tsx b/apps/web/src/hooks/useBeta.tsx similarity index 100% rename from rockskyweb/src/hooks/useBeta.tsx rename to apps/web/src/hooks/useBeta.tsx diff --git a/rockskyweb/src/hooks/useChart.tsx b/apps/web/src/hooks/useChart.tsx similarity index 100% rename from rockskyweb/src/hooks/useChart.tsx rename to apps/web/src/hooks/useChart.tsx diff --git a/rockskyweb/src/hooks/useDropbox.tsx b/apps/web/src/hooks/useDropbox.tsx similarity index 100% rename from rockskyweb/src/hooks/useDropbox.tsx rename to apps/web/src/hooks/useDropbox.tsx diff --git a/rockskyweb/src/hooks/useFeed.tsx b/apps/web/src/hooks/useFeed.tsx similarity index 100% rename from rockskyweb/src/hooks/useFeed.tsx rename to apps/web/src/hooks/useFeed.tsx diff --git a/rockskyweb/src/hooks/useFormat.tsx b/apps/web/src/hooks/useFormat.tsx similarity index 100% rename from rockskyweb/src/hooks/useFormat.tsx rename to apps/web/src/hooks/useFormat.tsx diff --git a/rockskyweb/src/hooks/useGoogleDrive.tsx b/apps/web/src/hooks/useGoogleDrive.tsx similarity index 100% rename from rockskyweb/src/hooks/useGoogleDrive.tsx rename to apps/web/src/hooks/useGoogleDrive.tsx diff --git a/rockskyweb/src/hooks/useLibrary.tsx b/apps/web/src/hooks/useLibrary.tsx similarity index 100% rename from rockskyweb/src/hooks/useLibrary.tsx rename to apps/web/src/hooks/useLibrary.tsx diff --git a/rockskyweb/src/hooks/useLike.tsx b/apps/web/src/hooks/useLike.tsx similarity index 100% rename from rockskyweb/src/hooks/useLike.tsx rename to apps/web/src/hooks/useLike.tsx diff --git a/rockskyweb/src/hooks/useNowPlaying.tsx b/apps/web/src/hooks/useNowPlaying.tsx similarity index 100% rename from rockskyweb/src/hooks/useNowPlaying.tsx rename to apps/web/src/hooks/useNowPlaying.tsx diff --git a/rockskyweb/src/hooks/usePlaylists.tsx b/apps/web/src/hooks/usePlaylists.tsx similarity index 100% rename from rockskyweb/src/hooks/usePlaylists.tsx rename to apps/web/src/hooks/usePlaylists.tsx diff --git a/rockskyweb/src/hooks/useProfile.tsx b/apps/web/src/hooks/useProfile.tsx similarity index 100% rename from rockskyweb/src/hooks/useProfile.tsx rename to apps/web/src/hooks/useProfile.tsx diff --git a/rockskyweb/src/hooks/useSearch.tsx b/apps/web/src/hooks/useSearch.tsx similarity index 100% rename from rockskyweb/src/hooks/useSearch.tsx rename to apps/web/src/hooks/useSearch.tsx diff --git a/rockskyweb/src/hooks/useShout.tsx b/apps/web/src/hooks/useShout.tsx similarity index 100% rename from rockskyweb/src/hooks/useShout.tsx rename to apps/web/src/hooks/useShout.tsx diff --git a/rockskyweb/src/hooks/useSpotify.tsx b/apps/web/src/hooks/useSpotify.tsx similarity index 100% rename from rockskyweb/src/hooks/useSpotify.tsx rename to apps/web/src/hooks/useSpotify.tsx diff --git a/rockskyweb/src/index.css b/apps/web/src/index.css similarity index 100% rename from rockskyweb/src/index.css rename to apps/web/src/index.css diff --git a/rockskyweb/src/layouts/CloudDrive/CloudDrive.tsx b/apps/web/src/layouts/CloudDrive/CloudDrive.tsx similarity index 100% rename from rockskyweb/src/layouts/CloudDrive/CloudDrive.tsx rename to apps/web/src/layouts/CloudDrive/CloudDrive.tsx diff --git a/rockskyweb/src/layouts/CloudDrive/DropboxBeta/DropboxBeta.tsx b/apps/web/src/layouts/CloudDrive/DropboxBeta/DropboxBeta.tsx similarity index 100% rename from rockskyweb/src/layouts/CloudDrive/DropboxBeta/DropboxBeta.tsx rename to apps/web/src/layouts/CloudDrive/DropboxBeta/DropboxBeta.tsx diff --git a/rockskyweb/src/layouts/CloudDrive/DropboxBeta/index.tsx b/apps/web/src/layouts/CloudDrive/DropboxBeta/index.tsx similarity index 100% rename from rockskyweb/src/layouts/CloudDrive/DropboxBeta/index.tsx rename to apps/web/src/layouts/CloudDrive/DropboxBeta/index.tsx diff --git a/rockskyweb/src/layouts/CloudDrive/GoogleDriveBeta/GoogleDriveBeta.tsx b/apps/web/src/layouts/CloudDrive/GoogleDriveBeta/GoogleDriveBeta.tsx similarity index 100% rename from rockskyweb/src/layouts/CloudDrive/GoogleDriveBeta/GoogleDriveBeta.tsx rename to apps/web/src/layouts/CloudDrive/GoogleDriveBeta/GoogleDriveBeta.tsx diff --git a/rockskyweb/src/layouts/CloudDrive/GoogleDriveBeta/index.tsx b/apps/web/src/layouts/CloudDrive/GoogleDriveBeta/index.tsx similarity index 100% rename from rockskyweb/src/layouts/CloudDrive/GoogleDriveBeta/index.tsx rename to apps/web/src/layouts/CloudDrive/GoogleDriveBeta/index.tsx diff --git a/rockskyweb/src/layouts/CloudDrive/index.tsx b/apps/web/src/layouts/CloudDrive/index.tsx similarity index 100% rename from rockskyweb/src/layouts/CloudDrive/index.tsx rename to apps/web/src/layouts/CloudDrive/index.tsx diff --git a/rockskyweb/src/layouts/ExternalLinks/ExternalLinks.tsx b/apps/web/src/layouts/ExternalLinks/ExternalLinks.tsx similarity index 100% rename from rockskyweb/src/layouts/ExternalLinks/ExternalLinks.tsx rename to apps/web/src/layouts/ExternalLinks/ExternalLinks.tsx diff --git a/rockskyweb/src/layouts/ExternalLinks/index.tsx b/apps/web/src/layouts/ExternalLinks/index.tsx similarity index 100% rename from rockskyweb/src/layouts/ExternalLinks/index.tsx rename to apps/web/src/layouts/ExternalLinks/index.tsx diff --git a/rockskyweb/src/layouts/Main.tsx b/apps/web/src/layouts/Main.tsx similarity index 100% rename from rockskyweb/src/layouts/Main.tsx rename to apps/web/src/layouts/Main.tsx diff --git a/rockskyweb/src/layouts/Navbar/Navbar.tsx b/apps/web/src/layouts/Navbar/Navbar.tsx similarity index 100% rename from rockskyweb/src/layouts/Navbar/Navbar.tsx rename to apps/web/src/layouts/Navbar/Navbar.tsx diff --git a/rockskyweb/src/layouts/Navbar/index.tsx b/apps/web/src/layouts/Navbar/index.tsx similarity index 100% rename from rockskyweb/src/layouts/Navbar/index.tsx rename to apps/web/src/layouts/Navbar/index.tsx diff --git a/rockskyweb/src/layouts/Search/Search.tsx b/apps/web/src/layouts/Search/Search.tsx similarity index 100% rename from rockskyweb/src/layouts/Search/Search.tsx rename to apps/web/src/layouts/Search/Search.tsx diff --git a/rockskyweb/src/layouts/Search/index.tsx b/apps/web/src/layouts/Search/index.tsx similarity index 100% rename from rockskyweb/src/layouts/Search/index.tsx rename to apps/web/src/layouts/Search/index.tsx diff --git a/rockskyweb/src/layouts/SpotifyLogin/SpotifyLogin.tsx b/apps/web/src/layouts/SpotifyLogin/SpotifyLogin.tsx similarity index 100% rename from rockskyweb/src/layouts/SpotifyLogin/SpotifyLogin.tsx rename to apps/web/src/layouts/SpotifyLogin/SpotifyLogin.tsx diff --git a/rockskyweb/src/layouts/SpotifyLogin/index.tsx b/apps/web/src/layouts/SpotifyLogin/index.tsx similarity index 100% rename from rockskyweb/src/layouts/SpotifyLogin/index.tsx rename to apps/web/src/layouts/SpotifyLogin/index.tsx diff --git a/rockskyweb/src/lib/metadata.ts b/apps/web/src/lib/metadata.ts similarity index 100% rename from rockskyweb/src/lib/metadata.ts rename to apps/web/src/lib/metadata.ts diff --git a/rockskyweb/src/lib/player.ts b/apps/web/src/lib/player.ts similarity index 100% rename from rockskyweb/src/lib/player.ts rename to apps/web/src/lib/player.ts diff --git a/rockskyweb/src/main.tsx b/apps/web/src/main.tsx similarity index 100% rename from rockskyweb/src/main.tsx rename to apps/web/src/main.tsx diff --git a/rockskyweb/src/pages/album/Album.tsx b/apps/web/src/pages/album/Album.tsx similarity index 100% rename from rockskyweb/src/pages/album/Album.tsx rename to apps/web/src/pages/album/Album.tsx diff --git a/rockskyweb/src/pages/album/index.tsx b/apps/web/src/pages/album/index.tsx similarity index 100% rename from rockskyweb/src/pages/album/index.tsx rename to apps/web/src/pages/album/index.tsx diff --git a/rockskyweb/src/pages/apikeys/ApiKeys.tsx b/apps/web/src/pages/apikeys/ApiKeys.tsx similarity index 100% rename from rockskyweb/src/pages/apikeys/ApiKeys.tsx rename to apps/web/src/pages/apikeys/ApiKeys.tsx diff --git a/rockskyweb/src/pages/apikeys/index.tsx b/apps/web/src/pages/apikeys/index.tsx similarity index 100% rename from rockskyweb/src/pages/apikeys/index.tsx rename to apps/web/src/pages/apikeys/index.tsx diff --git a/rockskyweb/src/pages/apikeys/styles.tsx b/apps/web/src/pages/apikeys/styles.tsx similarity index 100% rename from rockskyweb/src/pages/apikeys/styles.tsx rename to apps/web/src/pages/apikeys/styles.tsx diff --git a/rockskyweb/src/pages/artist/Albums/Albums.tsx b/apps/web/src/pages/artist/Albums/Albums.tsx similarity index 100% rename from rockskyweb/src/pages/artist/Albums/Albums.tsx rename to apps/web/src/pages/artist/Albums/Albums.tsx diff --git a/rockskyweb/src/pages/artist/Albums/index.tsx b/apps/web/src/pages/artist/Albums/index.tsx similarity index 100% rename from rockskyweb/src/pages/artist/Albums/index.tsx rename to apps/web/src/pages/artist/Albums/index.tsx diff --git a/rockskyweb/src/pages/artist/Artist.tsx b/apps/web/src/pages/artist/Artist.tsx similarity index 100% rename from rockskyweb/src/pages/artist/Artist.tsx rename to apps/web/src/pages/artist/Artist.tsx diff --git a/rockskyweb/src/pages/artist/PopularSongs/PopularSongs.tsx b/apps/web/src/pages/artist/PopularSongs/PopularSongs.tsx similarity index 100% rename from rockskyweb/src/pages/artist/PopularSongs/PopularSongs.tsx rename to apps/web/src/pages/artist/PopularSongs/PopularSongs.tsx diff --git a/rockskyweb/src/pages/artist/PopularSongs/index.tsx b/apps/web/src/pages/artist/PopularSongs/index.tsx similarity index 100% rename from rockskyweb/src/pages/artist/PopularSongs/index.tsx rename to apps/web/src/pages/artist/PopularSongs/index.tsx diff --git a/rockskyweb/src/pages/artist/index.tsx b/apps/web/src/pages/artist/index.tsx similarity index 100% rename from rockskyweb/src/pages/artist/index.tsx rename to apps/web/src/pages/artist/index.tsx diff --git a/rockskyweb/src/pages/dropbox/Dropbox.tsx b/apps/web/src/pages/dropbox/Dropbox.tsx similarity index 100% rename from rockskyweb/src/pages/dropbox/Dropbox.tsx rename to apps/web/src/pages/dropbox/Dropbox.tsx diff --git a/rockskyweb/src/pages/dropbox/DropboxWithId.tsx b/apps/web/src/pages/dropbox/DropboxWithId.tsx similarity index 100% rename from rockskyweb/src/pages/dropbox/DropboxWithId.tsx rename to apps/web/src/pages/dropbox/DropboxWithId.tsx diff --git a/rockskyweb/src/pages/dropbox/index.tsx b/apps/web/src/pages/dropbox/index.tsx similarity index 100% rename from rockskyweb/src/pages/dropbox/index.tsx rename to apps/web/src/pages/dropbox/index.tsx diff --git a/rockskyweb/src/pages/dropbox/styles.tsx b/apps/web/src/pages/dropbox/styles.tsx similarity index 100% rename from rockskyweb/src/pages/dropbox/styles.tsx rename to apps/web/src/pages/dropbox/styles.tsx diff --git a/rockskyweb/src/pages/googledrive/GoogleDrive.tsx b/apps/web/src/pages/googledrive/GoogleDrive.tsx similarity index 100% rename from rockskyweb/src/pages/googledrive/GoogleDrive.tsx rename to apps/web/src/pages/googledrive/GoogleDrive.tsx diff --git a/rockskyweb/src/pages/googledrive/GoogleDriveWithId.tsx b/apps/web/src/pages/googledrive/GoogleDriveWithId.tsx similarity index 100% rename from rockskyweb/src/pages/googledrive/GoogleDriveWithId.tsx rename to apps/web/src/pages/googledrive/GoogleDriveWithId.tsx diff --git a/rockskyweb/src/pages/googledrive/index.tsx b/apps/web/src/pages/googledrive/index.tsx similarity index 100% rename from rockskyweb/src/pages/googledrive/index.tsx rename to apps/web/src/pages/googledrive/index.tsx diff --git a/rockskyweb/src/pages/googledrive/styles.tsx b/apps/web/src/pages/googledrive/styles.tsx similarity index 100% rename from rockskyweb/src/pages/googledrive/styles.tsx rename to apps/web/src/pages/googledrive/styles.tsx diff --git a/rockskyweb/src/pages/home/Home.tsx b/apps/web/src/pages/home/Home.tsx similarity index 100% rename from rockskyweb/src/pages/home/Home.tsx rename to apps/web/src/pages/home/Home.tsx diff --git a/rockskyweb/src/pages/home/feed/Feed.tsx b/apps/web/src/pages/home/feed/Feed.tsx similarity index 100% rename from rockskyweb/src/pages/home/feed/Feed.tsx rename to apps/web/src/pages/home/feed/Feed.tsx diff --git a/rockskyweb/src/pages/home/feed/index.tsx b/apps/web/src/pages/home/feed/index.tsx similarity index 100% rename from rockskyweb/src/pages/home/feed/index.tsx rename to apps/web/src/pages/home/feed/index.tsx diff --git a/rockskyweb/src/pages/home/feed/mocks.tsx b/apps/web/src/pages/home/feed/mocks.tsx similarity index 100% rename from rockskyweb/src/pages/home/feed/mocks.tsx rename to apps/web/src/pages/home/feed/mocks.tsx diff --git a/rockskyweb/src/pages/home/index.tsx b/apps/web/src/pages/home/index.tsx similarity index 100% rename from rockskyweb/src/pages/home/index.tsx rename to apps/web/src/pages/home/index.tsx diff --git a/rockskyweb/src/pages/home/nowplayings/NowPlayings.tsx b/apps/web/src/pages/home/nowplayings/NowPlayings.tsx similarity index 100% rename from rockskyweb/src/pages/home/nowplayings/NowPlayings.tsx rename to apps/web/src/pages/home/nowplayings/NowPlayings.tsx diff --git a/rockskyweb/src/pages/home/nowplayings/index.tsx b/apps/web/src/pages/home/nowplayings/index.tsx similarity index 100% rename from rockskyweb/src/pages/home/nowplayings/index.tsx rename to apps/web/src/pages/home/nowplayings/index.tsx diff --git a/rockskyweb/src/pages/home/nowplayings/styles.tsx b/apps/web/src/pages/home/nowplayings/styles.tsx similarity index 100% rename from rockskyweb/src/pages/home/nowplayings/styles.tsx rename to apps/web/src/pages/home/nowplayings/styles.tsx diff --git a/rockskyweb/src/pages/loading/Loading.tsx b/apps/web/src/pages/loading/Loading.tsx similarity index 100% rename from rockskyweb/src/pages/loading/Loading.tsx rename to apps/web/src/pages/loading/Loading.tsx diff --git a/rockskyweb/src/pages/loading/index.tsx b/apps/web/src/pages/loading/index.tsx similarity index 100% rename from rockskyweb/src/pages/loading/index.tsx rename to apps/web/src/pages/loading/index.tsx diff --git a/rockskyweb/src/pages/playlist/Playlist.tsx b/apps/web/src/pages/playlist/Playlist.tsx similarity index 100% rename from rockskyweb/src/pages/playlist/Playlist.tsx rename to apps/web/src/pages/playlist/Playlist.tsx diff --git a/rockskyweb/src/pages/playlist/index.tsx b/apps/web/src/pages/playlist/index.tsx similarity index 100% rename from rockskyweb/src/pages/playlist/index.tsx rename to apps/web/src/pages/playlist/index.tsx diff --git a/rockskyweb/src/pages/profile/Profile.tsx b/apps/web/src/pages/profile/Profile.tsx similarity index 100% rename from rockskyweb/src/pages/profile/Profile.tsx rename to apps/web/src/pages/profile/Profile.tsx diff --git a/rockskyweb/src/pages/profile/index.tsx b/apps/web/src/pages/profile/index.tsx similarity index 100% rename from rockskyweb/src/pages/profile/index.tsx rename to apps/web/src/pages/profile/index.tsx diff --git a/rockskyweb/src/pages/profile/library/Library.tsx b/apps/web/src/pages/profile/library/Library.tsx similarity index 100% rename from rockskyweb/src/pages/profile/library/Library.tsx rename to apps/web/src/pages/profile/library/Library.tsx diff --git a/rockskyweb/src/pages/profile/library/albums/Albums.tsx b/apps/web/src/pages/profile/library/albums/Albums.tsx similarity index 100% rename from rockskyweb/src/pages/profile/library/albums/Albums.tsx rename to apps/web/src/pages/profile/library/albums/Albums.tsx diff --git a/rockskyweb/src/pages/profile/library/albums/index.tsx b/apps/web/src/pages/profile/library/albums/index.tsx similarity index 100% rename from rockskyweb/src/pages/profile/library/albums/index.tsx rename to apps/web/src/pages/profile/library/albums/index.tsx diff --git a/rockskyweb/src/pages/profile/library/albums/styles.tsx b/apps/web/src/pages/profile/library/albums/styles.tsx similarity index 100% rename from rockskyweb/src/pages/profile/library/albums/styles.tsx rename to apps/web/src/pages/profile/library/albums/styles.tsx diff --git a/rockskyweb/src/pages/profile/library/index.tsx b/apps/web/src/pages/profile/library/index.tsx similarity index 100% rename from rockskyweb/src/pages/profile/library/index.tsx rename to apps/web/src/pages/profile/library/index.tsx diff --git a/rockskyweb/src/pages/profile/lovedtracks/LovedTracks.tsx b/apps/web/src/pages/profile/lovedtracks/LovedTracks.tsx similarity index 100% rename from rockskyweb/src/pages/profile/lovedtracks/LovedTracks.tsx rename to apps/web/src/pages/profile/lovedtracks/LovedTracks.tsx diff --git a/rockskyweb/src/pages/profile/lovedtracks/index.tsx b/apps/web/src/pages/profile/lovedtracks/index.tsx similarity index 100% rename from rockskyweb/src/pages/profile/lovedtracks/index.tsx rename to apps/web/src/pages/profile/lovedtracks/index.tsx diff --git a/rockskyweb/src/pages/profile/lovedtracks/styles.tsx b/apps/web/src/pages/profile/lovedtracks/styles.tsx similarity index 100% rename from rockskyweb/src/pages/profile/lovedtracks/styles.tsx rename to apps/web/src/pages/profile/lovedtracks/styles.tsx diff --git a/rockskyweb/src/pages/profile/overview/Overview.tsx b/apps/web/src/pages/profile/overview/Overview.tsx similarity index 100% rename from rockskyweb/src/pages/profile/overview/Overview.tsx rename to apps/web/src/pages/profile/overview/Overview.tsx diff --git a/rockskyweb/src/pages/profile/overview/index.tsx b/apps/web/src/pages/profile/overview/index.tsx similarity index 100% rename from rockskyweb/src/pages/profile/overview/index.tsx rename to apps/web/src/pages/profile/overview/index.tsx diff --git a/rockskyweb/src/pages/profile/overview/recenttracks/RecentTracks.tsx b/apps/web/src/pages/profile/overview/recenttracks/RecentTracks.tsx similarity index 100% rename from rockskyweb/src/pages/profile/overview/recenttracks/RecentTracks.tsx rename to apps/web/src/pages/profile/overview/recenttracks/RecentTracks.tsx diff --git a/rockskyweb/src/pages/profile/overview/recenttracks/index.tsx b/apps/web/src/pages/profile/overview/recenttracks/index.tsx similarity index 100% rename from rockskyweb/src/pages/profile/overview/recenttracks/index.tsx rename to apps/web/src/pages/profile/overview/recenttracks/index.tsx diff --git a/rockskyweb/src/pages/profile/overview/recenttracks/styles.tsx b/apps/web/src/pages/profile/overview/recenttracks/styles.tsx similarity index 100% rename from rockskyweb/src/pages/profile/overview/recenttracks/styles.tsx rename to apps/web/src/pages/profile/overview/recenttracks/styles.tsx diff --git a/rockskyweb/src/pages/profile/overview/topalbums/TopAlbums.tsx b/apps/web/src/pages/profile/overview/topalbums/TopAlbums.tsx similarity index 100% rename from rockskyweb/src/pages/profile/overview/topalbums/TopAlbums.tsx rename to apps/web/src/pages/profile/overview/topalbums/TopAlbums.tsx diff --git a/rockskyweb/src/pages/profile/overview/topalbums/index.tsx b/apps/web/src/pages/profile/overview/topalbums/index.tsx similarity index 100% rename from rockskyweb/src/pages/profile/overview/topalbums/index.tsx rename to apps/web/src/pages/profile/overview/topalbums/index.tsx diff --git a/rockskyweb/src/pages/profile/overview/topartists/TopArtists.tsx b/apps/web/src/pages/profile/overview/topartists/TopArtists.tsx similarity index 100% rename from rockskyweb/src/pages/profile/overview/topartists/TopArtists.tsx rename to apps/web/src/pages/profile/overview/topartists/TopArtists.tsx diff --git a/rockskyweb/src/pages/profile/overview/topartists/index.tsx b/apps/web/src/pages/profile/overview/topartists/index.tsx similarity index 100% rename from rockskyweb/src/pages/profile/overview/topartists/index.tsx rename to apps/web/src/pages/profile/overview/topartists/index.tsx diff --git a/rockskyweb/src/pages/profile/overview/topartists/styles.tsx b/apps/web/src/pages/profile/overview/topartists/styles.tsx similarity index 100% rename from rockskyweb/src/pages/profile/overview/topartists/styles.tsx rename to apps/web/src/pages/profile/overview/topartists/styles.tsx diff --git a/rockskyweb/src/pages/profile/overview/toptracks/TopTracks.tsx b/apps/web/src/pages/profile/overview/toptracks/TopTracks.tsx similarity index 100% rename from rockskyweb/src/pages/profile/overview/toptracks/TopTracks.tsx rename to apps/web/src/pages/profile/overview/toptracks/TopTracks.tsx diff --git a/rockskyweb/src/pages/profile/overview/toptracks/index.tsx b/apps/web/src/pages/profile/overview/toptracks/index.tsx similarity index 100% rename from rockskyweb/src/pages/profile/overview/toptracks/index.tsx rename to apps/web/src/pages/profile/overview/toptracks/index.tsx diff --git a/rockskyweb/src/pages/profile/overview/toptracks/styles.tsx b/apps/web/src/pages/profile/overview/toptracks/styles.tsx similarity index 100% rename from rockskyweb/src/pages/profile/overview/toptracks/styles.tsx rename to apps/web/src/pages/profile/overview/toptracks/styles.tsx diff --git a/rockskyweb/src/pages/profile/playlists/Playlists.tsx b/apps/web/src/pages/profile/playlists/Playlists.tsx similarity index 100% rename from rockskyweb/src/pages/profile/playlists/Playlists.tsx rename to apps/web/src/pages/profile/playlists/Playlists.tsx diff --git a/rockskyweb/src/pages/profile/playlists/index.tsx b/apps/web/src/pages/profile/playlists/index.tsx similarity index 100% rename from rockskyweb/src/pages/profile/playlists/index.tsx rename to apps/web/src/pages/profile/playlists/index.tsx diff --git a/rockskyweb/src/pages/song/Credits/Credits.tsx b/apps/web/src/pages/song/Credits/Credits.tsx similarity index 100% rename from rockskyweb/src/pages/song/Credits/Credits.tsx rename to apps/web/src/pages/song/Credits/Credits.tsx diff --git a/rockskyweb/src/pages/song/Credits/index.tsx b/apps/web/src/pages/song/Credits/index.tsx similarity index 100% rename from rockskyweb/src/pages/song/Credits/index.tsx rename to apps/web/src/pages/song/Credits/index.tsx diff --git a/rockskyweb/src/pages/song/PopularAlbums/PopularAlbums.tsx b/apps/web/src/pages/song/PopularAlbums/PopularAlbums.tsx similarity index 100% rename from rockskyweb/src/pages/song/PopularAlbums/PopularAlbums.tsx rename to apps/web/src/pages/song/PopularAlbums/PopularAlbums.tsx diff --git a/rockskyweb/src/pages/song/PopularAlbums/index.tsx b/apps/web/src/pages/song/PopularAlbums/index.tsx similarity index 100% rename from rockskyweb/src/pages/song/PopularAlbums/index.tsx rename to apps/web/src/pages/song/PopularAlbums/index.tsx diff --git a/rockskyweb/src/pages/song/PopularTracks/PopularTracks.tsx b/apps/web/src/pages/song/PopularTracks/PopularTracks.tsx similarity index 100% rename from rockskyweb/src/pages/song/PopularTracks/PopularTracks.tsx rename to apps/web/src/pages/song/PopularTracks/PopularTracks.tsx diff --git a/rockskyweb/src/pages/song/PopularTracks/index.tsx b/apps/web/src/pages/song/PopularTracks/index.tsx similarity index 100% rename from rockskyweb/src/pages/song/PopularTracks/index.tsx rename to apps/web/src/pages/song/PopularTracks/index.tsx diff --git a/rockskyweb/src/pages/song/Song.tsx b/apps/web/src/pages/song/Song.tsx similarity index 100% rename from rockskyweb/src/pages/song/Song.tsx rename to apps/web/src/pages/song/Song.tsx diff --git a/rockskyweb/src/pages/song/index.tsx b/apps/web/src/pages/song/index.tsx similarity index 100% rename from rockskyweb/src/pages/song/index.tsx rename to apps/web/src/pages/song/index.tsx diff --git a/rockskyweb/src/stories/Button.stories.ts b/apps/web/src/stories/Button.stories.ts similarity index 100% rename from rockskyweb/src/stories/Button.stories.ts rename to apps/web/src/stories/Button.stories.ts diff --git a/rockskyweb/src/stories/Button.tsx b/apps/web/src/stories/Button.tsx similarity index 100% rename from rockskyweb/src/stories/Button.tsx rename to apps/web/src/stories/Button.tsx diff --git a/rockskyweb/src/stories/Configure.mdx b/apps/web/src/stories/Configure.mdx similarity index 100% rename from rockskyweb/src/stories/Configure.mdx rename to apps/web/src/stories/Configure.mdx diff --git a/rockskyweb/src/stories/Header.stories.ts b/apps/web/src/stories/Header.stories.ts similarity index 100% rename from rockskyweb/src/stories/Header.stories.ts rename to apps/web/src/stories/Header.stories.ts diff --git a/rockskyweb/src/stories/Header.tsx b/apps/web/src/stories/Header.tsx similarity index 100% rename from rockskyweb/src/stories/Header.tsx rename to apps/web/src/stories/Header.tsx diff --git a/rockskyweb/src/stories/Page.stories.ts b/apps/web/src/stories/Page.stories.ts similarity index 100% rename from rockskyweb/src/stories/Page.stories.ts rename to apps/web/src/stories/Page.stories.ts diff --git a/rockskyweb/src/stories/Page.tsx b/apps/web/src/stories/Page.tsx similarity index 100% rename from rockskyweb/src/stories/Page.tsx rename to apps/web/src/stories/Page.tsx diff --git a/rockskyweb/src/stories/assets/accessibility.png b/apps/web/src/stories/assets/accessibility.png similarity index 100% rename from rockskyweb/src/stories/assets/accessibility.png rename to apps/web/src/stories/assets/accessibility.png diff --git a/rockskyweb/src/stories/assets/accessibility.svg b/apps/web/src/stories/assets/accessibility.svg similarity index 100% rename from rockskyweb/src/stories/assets/accessibility.svg rename to apps/web/src/stories/assets/accessibility.svg diff --git a/rockskyweb/src/stories/assets/addon-library.png b/apps/web/src/stories/assets/addon-library.png similarity index 100% rename from rockskyweb/src/stories/assets/addon-library.png rename to apps/web/src/stories/assets/addon-library.png diff --git a/rockskyweb/src/stories/assets/assets.png b/apps/web/src/stories/assets/assets.png similarity index 100% rename from rockskyweb/src/stories/assets/assets.png rename to apps/web/src/stories/assets/assets.png diff --git a/rockskyweb/src/stories/assets/avif-test-image.avif b/apps/web/src/stories/assets/avif-test-image.avif similarity index 100% rename from rockskyweb/src/stories/assets/avif-test-image.avif rename to apps/web/src/stories/assets/avif-test-image.avif diff --git a/rockskyweb/src/stories/assets/context.png b/apps/web/src/stories/assets/context.png similarity index 100% rename from rockskyweb/src/stories/assets/context.png rename to apps/web/src/stories/assets/context.png diff --git a/rockskyweb/src/stories/assets/discord.svg b/apps/web/src/stories/assets/discord.svg similarity index 100% rename from rockskyweb/src/stories/assets/discord.svg rename to apps/web/src/stories/assets/discord.svg diff --git a/rockskyweb/src/stories/assets/docs.png b/apps/web/src/stories/assets/docs.png similarity index 100% rename from rockskyweb/src/stories/assets/docs.png rename to apps/web/src/stories/assets/docs.png diff --git a/rockskyweb/src/stories/assets/figma-plugin.png b/apps/web/src/stories/assets/figma-plugin.png similarity index 100% rename from rockskyweb/src/stories/assets/figma-plugin.png rename to apps/web/src/stories/assets/figma-plugin.png diff --git a/rockskyweb/src/stories/assets/github.svg b/apps/web/src/stories/assets/github.svg similarity index 100% rename from rockskyweb/src/stories/assets/github.svg rename to apps/web/src/stories/assets/github.svg diff --git a/rockskyweb/src/stories/assets/share.png b/apps/web/src/stories/assets/share.png similarity index 100% rename from rockskyweb/src/stories/assets/share.png rename to apps/web/src/stories/assets/share.png diff --git a/rockskyweb/src/stories/assets/styling.png b/apps/web/src/stories/assets/styling.png similarity index 100% rename from rockskyweb/src/stories/assets/styling.png rename to apps/web/src/stories/assets/styling.png diff --git a/rockskyweb/src/stories/assets/testing.png b/apps/web/src/stories/assets/testing.png similarity index 100% rename from rockskyweb/src/stories/assets/testing.png rename to apps/web/src/stories/assets/testing.png diff --git a/rockskyweb/src/stories/assets/theming.png b/apps/web/src/stories/assets/theming.png similarity index 100% rename from rockskyweb/src/stories/assets/theming.png rename to apps/web/src/stories/assets/theming.png diff --git a/rockskyweb/src/stories/assets/tutorials.svg b/apps/web/src/stories/assets/tutorials.svg similarity index 100% rename from rockskyweb/src/stories/assets/tutorials.svg rename to apps/web/src/stories/assets/tutorials.svg diff --git a/rockskyweb/src/stories/assets/youtube.svg b/apps/web/src/stories/assets/youtube.svg similarity index 100% rename from rockskyweb/src/stories/assets/youtube.svg rename to apps/web/src/stories/assets/youtube.svg diff --git a/rockskyweb/src/stories/button.css b/apps/web/src/stories/button.css similarity index 100% rename from rockskyweb/src/stories/button.css rename to apps/web/src/stories/button.css diff --git a/rockskyweb/src/stories/header.css b/apps/web/src/stories/header.css similarity index 100% rename from rockskyweb/src/stories/header.css rename to apps/web/src/stories/header.css diff --git a/rockskyweb/src/stories/page.css b/apps/web/src/stories/page.css similarity index 100% rename from rockskyweb/src/stories/page.css rename to apps/web/src/stories/page.css diff --git a/rockskyweb/src/types/apikey.ts b/apps/web/src/types/apikey.ts similarity index 100% rename from rockskyweb/src/types/apikey.ts rename to apps/web/src/types/apikey.ts diff --git a/rockskyweb/src/types/file.ts b/apps/web/src/types/file.ts similarity index 100% rename from rockskyweb/src/types/file.ts rename to apps/web/src/types/file.ts diff --git a/rockskyweb/src/types/scrobble.ts b/apps/web/src/types/scrobble.ts similarity index 100% rename from rockskyweb/src/types/scrobble.ts rename to apps/web/src/types/scrobble.ts diff --git a/rockskyweb/src/vite-env.d.ts b/apps/web/src/vite-env.d.ts similarity index 100% rename from rockskyweb/src/vite-env.d.ts rename to apps/web/src/vite-env.d.ts diff --git a/rockskyweb/tailwind.config.js b/apps/web/tailwind.config.js similarity index 100% rename from rockskyweb/tailwind.config.js rename to apps/web/tailwind.config.js diff --git a/rockskyweb/tsconfig.app.json b/apps/web/tsconfig.app.json similarity index 100% rename from rockskyweb/tsconfig.app.json rename to apps/web/tsconfig.app.json diff --git a/rockskyweb/tsconfig.json b/apps/web/tsconfig.json similarity index 100% rename from rockskyweb/tsconfig.json rename to apps/web/tsconfig.json diff --git a/rockskyweb/tsconfig.node.json b/apps/web/tsconfig.node.json similarity index 100% rename from rockskyweb/tsconfig.node.json rename to apps/web/tsconfig.node.json diff --git a/rockskyweb/vite.config.ts b/apps/web/vite.config.ts similarity index 100% rename from rockskyweb/vite.config.ts rename to apps/web/vite.config.ts diff --git a/rockskyapi/spotify-proxy/.editorconfig b/apps/xata-proxy/.editorconfig similarity index 100% rename from rockskyapi/spotify-proxy/.editorconfig rename to apps/xata-proxy/.editorconfig diff --git a/rockskyapi/spotify-proxy/.gitignore b/apps/xata-proxy/.gitignore similarity index 100% rename from rockskyapi/spotify-proxy/.gitignore rename to apps/xata-proxy/.gitignore diff --git a/rockskyapi/spotify-proxy/.prettierrc b/apps/xata-proxy/.prettierrc similarity index 100% rename from rockskyapi/spotify-proxy/.prettierrc rename to apps/xata-proxy/.prettierrc diff --git a/rockskyapi/rocksky-xata-proxy/bun.lock b/apps/xata-proxy/bun.lock similarity index 100% rename from rockskyapi/rocksky-xata-proxy/bun.lock rename to apps/xata-proxy/bun.lock diff --git a/rockskyapi/rocksky-xata-proxy/package.json b/apps/xata-proxy/package.json similarity index 92% rename from rockskyapi/rocksky-xata-proxy/package.json rename to apps/xata-proxy/package.json index 1092269d..f8d91b18 100644 --- a/rockskyapi/rocksky-xata-proxy/package.json +++ b/apps/xata-proxy/package.json @@ -1,5 +1,5 @@ { - "name": "late-shadow-299a", + "name": "@rocksky/xata-proxy", "version": "0.0.0", "private": true, "scripts": { diff --git a/rockskyapi/rocksky-xata-proxy/src/index.ts b/apps/xata-proxy/src/index.ts similarity index 100% rename from rockskyapi/rocksky-xata-proxy/src/index.ts rename to apps/xata-proxy/src/index.ts diff --git a/rockskyapi/spotify-proxy/test/index.spec.ts b/apps/xata-proxy/test/index.spec.ts similarity index 100% rename from rockskyapi/spotify-proxy/test/index.spec.ts rename to apps/xata-proxy/test/index.spec.ts diff --git a/rockskyapi/spotify-proxy/test/tsconfig.json b/apps/xata-proxy/test/tsconfig.json similarity index 100% rename from rockskyapi/spotify-proxy/test/tsconfig.json rename to apps/xata-proxy/test/tsconfig.json diff --git a/rockskyapi/spotify-proxy/tsconfig.json b/apps/xata-proxy/tsconfig.json similarity index 100% rename from rockskyapi/spotify-proxy/tsconfig.json rename to apps/xata-proxy/tsconfig.json diff --git a/rockskyapi/rocksky-xata-proxy/vitest.config.mts b/apps/xata-proxy/vitest.config.mts similarity index 100% rename from rockskyapi/rocksky-xata-proxy/vitest.config.mts rename to apps/xata-proxy/vitest.config.mts diff --git a/apps/xata-proxy/worker-configuration.d.ts b/apps/xata-proxy/worker-configuration.d.ts new file mode 100644 index 00000000..7edf06f5 --- /dev/null +++ b/apps/xata-proxy/worker-configuration.d.ts @@ -0,0 +1,4 @@ +// Generated by Wrangler +// After adding bindings to `wrangler.json`, regenerate this interface via `npm run cf-typegen` +interface Env { +} diff --git a/rockskyapi/rocksky-xata-proxy/wrangler.json b/apps/xata-proxy/wrangler.json similarity index 100% rename from rockskyapi/rocksky-xata-proxy/wrangler.json rename to apps/xata-proxy/wrangler.json diff --git a/bun.lock b/bun.lock new file mode 100644 index 00000000..100c4772 --- /dev/null +++ b/bun.lock @@ -0,0 +1,6259 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "rocksky", + "devDependencies": { + "biome": "^0.3.3", + "prettier": "^3.5.3", + "turbo": "^2.5.4", + }, + }, + "apps/api": { + "name": "rocksky-auth", + "version": "0.0.1", + "dependencies": { + "@atproto/api": "^0.13.31", + "@atproto/common": "^0.4.6", + "@atproto/identity": "^0.4.5", + "@atproto/lex-cli": "^0.5.6", + "@atproto/lexicon": "^0.4.5", + "@atproto/oauth-client-node": "^0.2.14", + "@atproto/sync": "^0.1.11", + "@atproto/syntax": "^0.3.1", + "@atproto/xrpc-server": "^0.7.8", + "@hono/node-server": "^1.13.8", + "@hono/node-ws": "^1.1.0", + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/auto-instrumentations-node": "^0.58.0", + "@opentelemetry/exporter-metrics-otlp-http": "^0.200.0", + "@opentelemetry/exporter-trace-otlp-http": "^0.200.0", + "@opentelemetry/resources": "^2.0.0", + "@opentelemetry/sdk-metrics": "^2.0.0", + "@opentelemetry/sdk-node": "^0.200.0", + "@opentelemetry/semantic-conventions": "^1.32.0", + "@pyroscope/nodejs": "^0.4.5", + "@xata.io/client": "^0.0.0-next.va121e4207b94bfe0a3c025fc00b247b923880930", + "assert": "^2.1.0", + "axios": "^1.7.9", + "better-sqlite3": "^11.8.1", + "chalk": "^5.4.1", + "chanfana": "^2.0.2", + "dayjs": "^1.11.13", + "dotenv": "^16.4.7", + "drizzle-orm": "^0.44.2", + "dropbox": "^10.34.0", + "effect": "^3.14.22", + "envalid": "^8.0.0", + "express": "^5.1.0", + "googleapis": "^146.0.0", + "hono": "^4.4.7", + "iron-session": "^8.0.4", + "jsonwebtoken": "^9.0.2", + "kysely": "^0.27.5", + "lodash": "^4.17.21", + "nats": "^2.29.2", + "pg": "^8.13.3", + "ramda": "^0.30.1", + "redis": "^4.7.0", + "unstorage": "^1.14.4", + "url": "^0.11.4", + "uuid": "^11.1.0", + "ws": "^8.18.1", + "zod": "^3.24.1", + }, + "devDependencies": { + "@pkl-community/pkl": "^0.28.2", + "@types/express": "^5.0.2", + "@types/lodash": "^4.17.17", + "@types/node": "^22.13.0", + "@types/ramda": "^0.30.2", + "@types/service-worker-mock": "^2.0.1", + "drizzle-kit": "^0.31.1", + "pkgroll": "^2.6.1", + "tsx": "^4.19.2", + "zx": "^8.5.4", + }, + }, + "apps/app": { + "name": "rocksky-app", + "version": "1.0.0", + "dependencies": { + "@atproto/api": "^0.15.6", + "@expo/vector-icons": "^14.1.0", + "@hookform/resolvers": "^5.0.1", + "@ipld/dag-cbor": "^9.2.2", + "@react-native-async-storage/async-storage": "^2.1.2", + "@react-native-menu/menu": "^1.2.3", + "@react-navigation/bottom-tabs": "^7.3.12", + "@react-navigation/drawer": "^7.3.11", + "@react-navigation/elements": "^2.3.8", + "@react-navigation/native": "^7.1.8", + "@react-navigation/native-stack": "^7.3.12", + "@sentry/react-native": "^6.13.1", + "@tanstack/react-query": "^5.75.7", + "@types/numeral": "^2.0.5", + "axios": "^1.9.0", + "dayjs": "^1.11.13", + "effect": "^3.14.22", + "expo": "~53.0.8", + "expo-blur": "~14.1.4", + "expo-constants": "~17.1.6", + "expo-font": "~13.3.1", + "expo-haptics": "~14.1.4", + "expo-image": "~2.1.7", + "expo-linking": "~7.1.4", + "expo-router": "~5.0.6", + "expo-splash-screen": "~0.30.8", + "expo-status-bar": "~2.2.3", + "expo-symbols": "~0.4.4", + "expo-system-ui": "~5.0.7", + "expo-web-browser": "~14.1.6", + "i18next": "^25.1.2", + "jotai": "^2.12.4", + "nativewind": "^4.1.23", + "numeral": "^2.0.6", + "ramda": "^0.30.1", + "react": "19.0.0", + "react-content-loader": "^7.0.2", + "react-dom": "19.0.0", + "react-hook-form": "^7.56.4", + "react-i18next": "^15.5.1", + "react-native": "0.79.2", + "react-native-gesture-handler": "~2.24.0", + "react-native-pager-view": "6.7.1", + "react-native-reanimated": "~3.17.4", + "react-native-safe-area-context": "^5.4.0", + "react-native-screens": "~4.10.0", + "react-native-svg": "^15.12.0", + "react-native-tab-view": "^4.0.12", + "react-native-web": "~0.20.0", + "react-native-webview": "13.13.5", + "swr": "^2.3.3", + "tailwindcss": "^3.4.17", + "zod": "^3.24.4", + }, + "devDependencies": { + "@babel/core": "^7.25.2", + "@gorhom/bottom-sheet": "^5.1.4", + "@react-native-community/datetimepicker": "^8.3.0", + "@react-native-community/slider": "^4.5.6", + "@storybook/addon-ondevice-actions": "^8.6.2", + "@storybook/addon-ondevice-controls": "^8.6.2", + "@storybook/react-native": "^8.6.2", + "@testing-library/react-native": "^13.2.0", + "@types/lodash": "^4.17.16", + "@types/ramda": "^0.30.2", + "@types/react": "~19.0.10", + "babel-loader": "^8.4.1", + "eslint": "^9.25.0", + "eslint-config-expo": "~9.2.0", + "eslint-plugin-testing-library": "^7.1.1", + "jest": "^29.7.0", + "lodash": "^4.17.21", + "prettier": "^3.5.3", + "svgo": "^3.3.2", + "typescript": "~5.8.3", + "vitest": "^3.1.3", + }, + }, + "apps/app-proxy": { + "name": "patient-bar-6c30", + "version": "0.0.0", + "dependencies": { + "axios": "^1.8.4", + }, + "devDependencies": { + "@cloudflare/vitest-pool-workers": "^0.6.4", + "@cloudflare/workers-types": "^4.20250129.0", + "typescript": "^5.5.2", + "vitest": "2.1.8", + "wrangler": "^3.107.2", + }, + }, + "apps/beta": { + "name": "tiny-salad-4531", + "version": "0.0.0", + "dependencies": { + "@tsndr/cloudflare-worker-jwt": "^3.1.3", + "mimetext": "^3.0.27", + "resend": "^4.1.2", + "zod": "^3.24.2", + }, + "devDependencies": { + "@cloudflare/vitest-pool-workers": "^0.6.4", + "@cloudflare/workers-types": "^4.20250204.0", + "typescript": "^5.5.2", + "vitest": "~2.1.9", + "wrangler": "^3.109.0", + }, + }, + "apps/cli": { + "name": "@rocksky/cli", + "version": "0.2.0", + "bin": { + "rocksky": "./dist/index.js", + }, + "dependencies": { + "@modelcontextprotocol/sdk": "^1.10.2", + "axios": "^1.8.4", + "chalk": "^5.4.1", + "commander": "^13.1.0", + "cors": "^2.8.5", + "dayjs": "^1.11.13", + "express": "^5.1.0", + "md5": "^2.3.0", + "open": "^10.1.0", + "table": "^6.9.0", + "zod": "^3.24.3", + }, + "devDependencies": { + "@types/express": "^5.0.1", + "@types/node": "^22.14.1", + "pkgroll": "^2.12.1", + "tsx": "^4.19.3", + "typescript": "^5.8.3", + }, + }, + "apps/doc": { + "name": "white-scene-4cbd", + "version": "0.0.0", + "devDependencies": { + "@cloudflare/vitest-pool-workers": "^0.6.4", + "@cloudflare/workers-types": "^4.20250303.0", + "typescript": "^5.5.2", + "vitest": "~2.1.9", + "wrangler": "^3.113.0", + }, + }, + "apps/spotify-proxy": { + "name": "spotify-proxy", + "version": "0.0.0", + "devDependencies": { + "@cloudflare/vitest-pool-workers": "^0.8.19", + "@cloudflare/workers-types": "^4.20250427.0", + "typescript": "^5.5.2", + "vitest": "~3.0.7", + "wrangler": "^4.13.2", + }, + }, + "apps/uploads": { + "name": "patient-flower-7e0a", + "version": "0.0.0", + "dependencies": { + "@tsndr/cloudflare-worker-jwt": "^3.1.3", + }, + "devDependencies": { + "@cloudflare/vitest-pool-workers": "^0.6.4", + "@cloudflare/workers-types": "^4.20250129.0", + "typescript": "^5.5.2", + "vitest": "2.1.8", + "wrangler": "^3.107.3", + }, + }, + "apps/web": { + "name": "rocksky", + "version": "0.0.0", + "dependencies": { + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.0", + "@hookform/resolvers": "^4.0.0", + "@iconify-json/teenyicons": "^1.2.2", + "@styled-icons/bootstrap": "^10.47.0", + "@styled-icons/boxicons-logos": "^10.47.0", + "@styled-icons/boxicons-regular": "^10.47.0", + "@styled-icons/entypo": "^10.46.0", + "@styled-icons/evaicons-solid": "^10.46.0", + "@styled-icons/evil": "^10.46.0", + "@styled-icons/fa-solid": "^10.47.0", + "@styled-icons/feather": "^10.47.0", + "@styled-icons/fluentui-system-filled": "^10.47.0", + "@styled-icons/fluentui-system-regular": "^10.47.0", + "@styled-icons/ionicons-outline": "^10.46.0", + "@styled-icons/ionicons-sharp": "^10.46.0", + "@styled-icons/remix-fill": "^10.46.0", + "@styled-icons/simple-icons": "^10.46.0", + "@styled-icons/zondicons": "^10.46.0", + "@tailwindcss/vite": "^4.1.4", + "@tanstack/react-query": "^5.76.0", + "@tanstack/react-query-devtools": "^5.76.0", + "@tanstack/react-table": "^8.21.2", + "@types/numeral": "^2.0.5", + "@vitest/ui": "^3.0.4", + "axios": "^1.7.9", + "baseui": "15.0.0", + "copy-to-clipboard": "^3.3.3", + "date-fns": "^4.1.0", + "dayjs": "^1.11.13", + "effect": "^3.14.22", + "i18next": "^24.2.2", + "jotai": "^2.11.3", + "jotai-effect": "^2.0.1", + "lodash": "^4.17.21", + "numeral": "^2.0.6", + "posthog-js": "^1.234.6", + "ramda": "^0.30.1", + "react": "^18.3.1", + "react-content-loader": "^7.0.2", + "react-dom": "^18.3.1", + "react-hook-form": "^7.54.2", + "react-i18next": "^15.4.0", + "react-router": "^7.1.3", + "react-router-dom": "^7.1.3", + "recharts": "^2.15.1", + "styletron-engine-monolithic": "^1.0.0", + "styletron-react": "^6.1.1", + "swr": "^2.3.0", + "tailwindcss": "^4.1.4", + "vitest": "^3.0.4", + "zod": "^3.24.2", + }, + "devDependencies": { + "@chromatic-com/storybook": "^3.2.4", + "@cloudflare/workers-types": "^4.20250124.3", + "@eslint/js": "^9.17.0", + "@storybook/addon-essentials": "^8.5.2", + "@storybook/addon-interactions": "^8.5.2", + "@storybook/addon-onboarding": "^8.5.2", + "@storybook/blocks": "^8.5.2", + "@storybook/react": "^8.5.2", + "@storybook/react-vite": "^8.5.2", + "@storybook/test": "^8.5.2", + "@types/lodash": "^4.17.15", + "@types/ramda": "^0.30.2", + "@types/react": "^18.3.18", + "@types/react-dom": "^18.3.5", + "@vitejs/plugin-react-swc": "^3.5.0", + "eslint": "^9.17.0", + "eslint-plugin-react-hooks": "^5.0.0", + "eslint-plugin-react-refresh": "^0.4.16", + "eslint-plugin-storybook": "^0.11.2", + "globals": "^15.14.0", + "storybook": "^8.5.2", + "typescript": "~5.6.2", + "typescript-eslint": "^8.18.2", + "vite": "^6.0.5", + "wrangler": "^3.106.0", + }, + }, + "apps/web-mobile": { + "name": "rocksky-web-mobile", + "version": "0.0.0", + "dependencies": { + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.0", + "@hookform/resolvers": "^4.0.0", + "@styled-icons/bootstrap": "^10.47.0", + "@styled-icons/boxicons-logos": "^10.47.0", + "@styled-icons/boxicons-regular": "^10.47.0", + "@styled-icons/entypo": "^10.46.0", + "@styled-icons/evaicons-solid": "^10.46.0", + "@styled-icons/evil": "^10.46.0", + "@styled-icons/fa-solid": "^10.47.0", + "@styled-icons/feather": "^10.47.0", + "@styled-icons/fluentui-system-filled": "^10.47.0", + "@styled-icons/fluentui-system-regular": "^10.47.0", + "@styled-icons/ionicons-outline": "^10.46.0", + "@styled-icons/ionicons-sharp": "^10.46.0", + "@styled-icons/remix-fill": "^10.46.0", + "@styled-icons/simple-icons": "^10.46.0", + "@styled-icons/zondicons": "^10.46.0", + "@types/numeral": "^2.0.5", + "@vitest/ui": "^3.0.4", + "axios": "^1.7.9", + "baseui": "15.0.0", + "date-fns": "^4.1.0", + "dayjs": "^1.11.13", + "i18next": "^24.2.2", + "jotai": "^2.11.3", + "lodash": "^4.17.21", + "numeral": "^2.0.6", + "react": "^18.3.1", + "react-content-loader": "^7.0.2", + "react-dom": "^18.3.1", + "react-hook-form": "^7.54.2", + "react-i18next": "^15.4.0", + "react-router": "^7.1.3", + "react-router-dom": "^7.1.3", + "recharts": "^2.15.1", + "styletron-engine-monolithic": "^1.0.0", + "styletron-react": "^6.1.1", + "swr": "^2.3.0", + "vitest": "^3.0.4", + "zod": "^3.24.2", + }, + "devDependencies": { + "@chromatic-com/storybook": "^3.2.4", + "@cloudflare/workers-types": "^4.20250124.3", + "@eslint/js": "^9.17.0", + "@storybook/addon-essentials": "^8.5.2", + "@storybook/addon-interactions": "^8.5.2", + "@storybook/addon-onboarding": "^8.5.2", + "@storybook/blocks": "^8.5.2", + "@storybook/react": "^8.5.2", + "@storybook/react-vite": "^8.5.2", + "@storybook/test": "^8.5.2", + "@types/lodash": "^4.17.15", + "@types/react": "^18.3.18", + "@types/react-dom": "^18.3.5", + "@vitejs/plugin-react-swc": "^3.5.0", + "eslint": "^9.17.0", + "eslint-plugin-react-hooks": "^5.0.0", + "eslint-plugin-react-refresh": "^0.4.16", + "eslint-plugin-storybook": "^0.11.2", + "globals": "^15.14.0", + "storybook": "^8.5.2", + "typescript": "~5.6.2", + "typescript-eslint": "^8.18.2", + "vite": "^6.0.5", + "wrangler": "^3.106.0", + }, + }, + "apps/xata-proxy": { + "name": "late-shadow-299a", + "version": "0.0.0", + "devDependencies": { + "@cloudflare/vitest-pool-workers": "^0.6.4", + "@cloudflare/workers-types": "^4.20250204.0", + "typescript": "^5.5.2", + "vitest": "2.1.8", + "wrangler": "^3.107.3", + }, + }, + }, + "packages": { + "@0no-co/graphql.web": ["@0no-co/graphql.web@1.1.2", "", { "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" }, "optionalPeers": ["graphql"] }, "sha512-N2NGsU5FLBhT8NZ+3l2YrzZSHITjNXNuDhC4iDiikv0IujaJ0Xc6xIxQZ/Ek3Cb+rgPjnLHYyJm11tInuJn+cw=="], + + "@adobe/css-tools": ["@adobe/css-tools@4.4.3", "", {}, "sha512-VQKMkwriZbaOgVCby1UDY/LDk5fIjhQicCvVPFqfe+69fWaPWydbWJ3wRt59/YzIwda1I81loas3oCoHxnqvdA=="], + + "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="], + + "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="], + + "@asteasolutions/zod-to-openapi": ["@asteasolutions/zod-to-openapi@7.3.4", "", { "dependencies": { "openapi3-ts": "^4.1.2" }, "peerDependencies": { "zod": "^3.20.2" } }, "sha512-/2rThQ5zPi9OzVwes6U7lK1+Yvug0iXu25olp7S0XsYmOqnyMfxH7gdSQjn/+DSOHRg7wnotwGJSyL+fBKdnEA=="], + + "@atproto-labs/did-resolver": ["@atproto-labs/did-resolver@0.1.13", "", { "dependencies": { "@atproto-labs/fetch": "0.2.3", "@atproto-labs/pipe": "0.1.1", "@atproto-labs/simple-store": "0.2.0", "@atproto-labs/simple-store-memory": "0.1.3", "@atproto/did": "0.1.5", "zod": "^3.23.8" } }, "sha512-DG3YNaCKc6PAIv1Gsz3E1Kufw2t14OBxe4LdKK7KKLCNoex51hm+A5yMevShe3BSll+QosqWYIEgkPSc5xBoGQ=="], + + "@atproto-labs/fetch": ["@atproto-labs/fetch@0.2.3", "", { "dependencies": { "@atproto-labs/pipe": "0.1.1" } }, "sha512-NZtbJOCbxKUFRFKMpamT38PUQMY0hX0p7TG5AEYOPhZKZEP7dHZ1K2s1aB8MdVH0qxmqX7nQleNrrvLf09Zfdw=="], + + "@atproto-labs/fetch-node": ["@atproto-labs/fetch-node@0.1.9", "", { "dependencies": { "@atproto-labs/fetch": "0.2.3", "@atproto-labs/pipe": "0.1.1", "ipaddr.js": "^2.1.0", "undici": "^6.14.1" } }, "sha512-8sHDDXZEzQptLu8ddUU/8U+THS6dumgPynVX0/1PjUYd4S/FWyPcz6yMIiVChTfzKnZvYRRz47+qvOKhydrHQw=="], + + "@atproto-labs/handle-resolver": ["@atproto-labs/handle-resolver@0.1.8", "", { "dependencies": { "@atproto-labs/simple-store": "0.2.0", "@atproto-labs/simple-store-memory": "0.1.3", "@atproto/did": "0.1.5", "zod": "^3.23.8" } }, "sha512-Y0ckccoCGDo/3g4thPkgp9QcORmc+qqEaCBCYCZYtfLIQp4775u22wd+4fyEyJP4DqoReKacninkICgRGfs3dQ=="], + + "@atproto-labs/handle-resolver-node": ["@atproto-labs/handle-resolver-node@0.1.16", "", { "dependencies": { "@atproto-labs/fetch-node": "0.1.9", "@atproto-labs/handle-resolver": "0.1.8", "@atproto/did": "0.1.5" } }, "sha512-i2F989zjyC7b/odrV3/tOpIT1IDIxR3F0khPG4REfOWcmJ89QcP8BiejJ6KFJk3hbTJHq6X9/pTG1vesCvyIKA=="], + + "@atproto-labs/identity-resolver": ["@atproto-labs/identity-resolver@0.1.18", "", { "dependencies": { "@atproto-labs/did-resolver": "0.1.13", "@atproto-labs/handle-resolver": "0.1.8", "@atproto/syntax": "0.4.0" } }, "sha512-DArYXP1hzZJIBcojun0CWEF+TjAhlGKcVq/RwLiGfY1mKq2yPjCiXyHj+5L0+z9jBSZiAB7L65JgcjI2+MFiRg=="], + + "@atproto-labs/pipe": ["@atproto-labs/pipe@0.1.1", "", {}, "sha512-hdNw2oUs2B6BN1lp+32pF7cp8EMKuIN5Qok2Vvv/aOpG/3tNSJ9YkvfI0k6Zd188LeDDYRUpYpxcoFIcGH/FNg=="], + + "@atproto-labs/simple-store": ["@atproto-labs/simple-store@0.2.0", "", {}, "sha512-0bRbAlI8Ayh03wRwncAMEAyUKtZ+AuTS1jgPrfym1WVOAOiottI/ZmgccqLl6w5MbxVcClNQF7WYGKvGwGoIhA=="], + + "@atproto-labs/simple-store-memory": ["@atproto-labs/simple-store-memory@0.1.3", "", { "dependencies": { "@atproto-labs/simple-store": "0.2.0", "lru-cache": "^10.2.0" } }, "sha512-jkitT9+AtU+0b28DoN92iURLaCt/q/q4yX8q6V+9LSwYlUTqKoj/5NFKvF7x6EBuG+gpUdlcycbH7e60gjOhRQ=="], + + "@atproto/api": ["@atproto/api@0.15.15", "", { "dependencies": { "@atproto/common-web": "^0.4.2", "@atproto/lexicon": "^0.4.11", "@atproto/syntax": "^0.4.0", "@atproto/xrpc": "^0.7.0", "await-lock": "^2.2.2", "multiformats": "^9.9.0", "tlds": "^1.234.0", "zod": "^3.23.8" } }, "sha512-Wn8jv76pCvffnkNj68w0CGZ3PT4DJGM8DUZnYq9kEW2im6jbRBYI0yYrHNhSiE92A5Ox0HjL2jMhalsI2p9VlQ=="], + + "@atproto/common": ["@atproto/common@0.4.11", "", { "dependencies": { "@atproto/common-web": "^0.4.2", "@ipld/dag-cbor": "^7.0.3", "cbor-x": "^1.5.1", "iso-datestring-validator": "^2.2.2", "multiformats": "^9.9.0", "pino": "^8.21.0" } }, "sha512-Knv0viYXNMfCdIE7jLUiWJKnnMfEwg+vz2epJQi8WOjqtqCFb3W/3Jn72ZiuovIfpdm13MaOiny6w2NErUQC6g=="], + + "@atproto/common-web": ["@atproto/common-web@0.4.2", "", { "dependencies": { "graphemer": "^1.4.0", "multiformats": "^9.9.0", "uint8arrays": "3.0.0", "zod": "^3.23.8" } }, "sha512-vrXwGNoFGogodjQvJDxAeP3QbGtawgZute2ed1XdRO0wMixLk3qewtikZm06H259QDJVu6voKC5mubml+WgQUw=="], + + "@atproto/crypto": ["@atproto/crypto@0.4.4", "", { "dependencies": { "@noble/curves": "^1.7.0", "@noble/hashes": "^1.6.1", "uint8arrays": "3.0.0" } }, "sha512-Yq9+crJ7WQl7sxStVpHgie5Z51R05etaK9DLWYG/7bR5T4bhdcIgF6IfklLShtZwLYdVVj+K15s0BqW9a8PSDA=="], + + "@atproto/did": ["@atproto/did@0.1.5", "", { "dependencies": { "zod": "^3.23.8" } }, "sha512-8+1D08QdGE5TF0bB0vV8HLVrVZJeLNITpRTUVEoABNMRaUS7CoYSVb0+JNQDeJIVmqMjOL8dOjvCUDkp3gEaGQ=="], + + "@atproto/identity": ["@atproto/identity@0.4.8", "", { "dependencies": { "@atproto/common-web": "^0.4.2", "@atproto/crypto": "^0.4.4" } }, "sha512-Z0sLnJ87SeNdAifT+rqpgE1Rc3layMMW25gfWNo4u40RGuRODbdfAZlTwBSU2r+Vk45hU+iE+xeQspfednCEnA=="], + + "@atproto/jwk": ["@atproto/jwk@0.3.0", "", { "dependencies": { "multiformats": "^9.9.0", "zod": "^3.23.8" } }, "sha512-MIAXyNMGu1tCNHjqW/8jqfE/wgWCIoK2cJ0mR6UxwhNPvkbe35TcpRYJdtQu/E6MUd7TziyDBa/GO4dKAiePhQ=="], + + "@atproto/jwk-jose": ["@atproto/jwk-jose@0.1.8", "", { "dependencies": { "@atproto/jwk": "0.3.0", "jose": "^5.2.0" } }, "sha512-aoU2Q0GpIl388KhCcv9YvAxNscALUv3xzLq5gjVPdJ+zmqw94nGZNcjiNvpnbfS+VQM9e2DrrTuwmDXnxfrrSA=="], + + "@atproto/jwk-webcrypto": ["@atproto/jwk-webcrypto@0.1.8", "", { "dependencies": { "@atproto/jwk": "0.3.0", "@atproto/jwk-jose": "0.1.8", "zod": "^3.23.8" } }, "sha512-oOW/G40f6M0NbTOo8uZgiSsFtcvlfNFldyxm+V+fVo5yKe6cvgvPNqckpqMsoBe6JYfImdc/zdVak9fCSSh41A=="], + + "@atproto/lex-cli": ["@atproto/lex-cli@0.5.7", "", { "dependencies": { "@atproto/lexicon": "^0.4.6", "@atproto/syntax": "^0.3.2", "chalk": "^4.1.2", "commander": "^9.4.0", "prettier": "^3.2.5", "ts-morph": "^16.0.0", "yesno": "^0.4.0", "zod": "^3.23.8" }, "bin": { "lex": "dist/index.js" } }, "sha512-V5rsU95Th57KICxUGwTjudN5wmFBHL/fLkl7banl6izsQBiUrVvrj3EScNW/Wx2PnwlJwxtTpa1rTnP30+i5/A=="], + + "@atproto/lexicon": ["@atproto/lexicon@0.4.11", "", { "dependencies": { "@atproto/common-web": "^0.4.2", "@atproto/syntax": "^0.4.0", "iso-datestring-validator": "^2.2.2", "multiformats": "^9.9.0", "zod": "^3.23.8" } }, "sha512-btefdnvNz2Ao2I+qbmj0F06HC8IlrM/IBz6qOBS50r0S6uDf5tOO+Mv2tSVdimFkdzyDdLtBI1sV36ONxz2cOw=="], + + "@atproto/oauth-client": ["@atproto/oauth-client@0.4.0", "", { "dependencies": { "@atproto-labs/did-resolver": "0.1.13", "@atproto-labs/fetch": "0.2.3", "@atproto-labs/handle-resolver": "0.1.8", "@atproto-labs/identity-resolver": "0.1.18", "@atproto-labs/simple-store": "0.2.0", "@atproto-labs/simple-store-memory": "0.1.3", "@atproto/did": "0.1.5", "@atproto/jwk": "0.3.0", "@atproto/oauth-types": "0.3.0", "@atproto/xrpc": "0.7.0", "multiformats": "^9.9.0", "zod": "^3.23.8" } }, "sha512-uWVnlhennWkgvzqP0l53sFaw6DM6B4zmq0fv1xs05vt56Sjly8YirAj0GVDXlb37/BQRJQ1WOBzJVYDI3bH9uw=="], + + "@atproto/oauth-client-node": ["@atproto/oauth-client-node@0.2.24", "", { "dependencies": { "@atproto-labs/did-resolver": "0.1.13", "@atproto-labs/handle-resolver-node": "0.1.16", "@atproto-labs/simple-store": "0.2.0", "@atproto/did": "0.1.5", "@atproto/jwk": "0.3.0", "@atproto/jwk-jose": "0.1.8", "@atproto/jwk-webcrypto": "0.1.8", "@atproto/oauth-client": "0.4.0", "@atproto/oauth-types": "0.3.0" } }, "sha512-WsUiFkHjlm80J2d4czP7msYZoxvKB4hDpZGw34RgMD4VLA2jt03GMH4wTQPIZxfV3/9yrgMoOW/BDC9Iv4MavA=="], + + "@atproto/oauth-types": ["@atproto/oauth-types@0.3.0", "", { "dependencies": { "@atproto/jwk": "0.3.0", "zod": "^3.23.8" } }, "sha512-ptfsJARKODXfuOoDQag4a6PpEkDEj4Urz3jOmnQZy2YspPc/TNm1o0HglU0YehELv1vfhh9gEz40BJztPPhiLA=="], + + "@atproto/repo": ["@atproto/repo@0.8.2", "", { "dependencies": { "@atproto/common": "^0.4.11", "@atproto/common-web": "^0.4.2", "@atproto/crypto": "^0.4.4", "@atproto/lexicon": "^0.4.11", "@ipld/dag-cbor": "^7.0.0", "multiformats": "^9.9.0", "uint8arrays": "3.0.0", "varint": "^6.0.0", "zod": "^3.23.8" } }, "sha512-lP0g5Uw3TUC2Tc7te8YKCpRoIhBYI+Uvn11fupGEaMcMjgLdYtB0Kc0AiqWXF42KqlBG9dAEoJITi2GRzDNHUg=="], + + "@atproto/sync": ["@atproto/sync@0.1.26", "", { "dependencies": { "@atproto/common": "^0.4.11", "@atproto/identity": "^0.4.8", "@atproto/lexicon": "^0.4.11", "@atproto/repo": "^0.8.2", "@atproto/syntax": "^0.4.0", "@atproto/xrpc-server": "^0.8.0", "multiformats": "^9.9.0", "p-queue": "^6.6.2", "ws": "^8.12.0" } }, "sha512-bpUIajtPrE3RgFW8mIfrI4EM/LJ4JjQhI5fsqc78zCHZawuflpllf1aH70roDWWiskMWoiLWnVRxdYXdeEgbXA=="], + + "@atproto/syntax": ["@atproto/syntax@0.3.4", "", {}, "sha512-8CNmi5DipOLaVeSMPggMe7FCksVag0aO6XZy9WflbduTKM4dFZVCs4686UeMLfGRXX+X966XgwECHoLYrovMMg=="], + + "@atproto/xrpc": ["@atproto/xrpc@0.7.0", "", { "dependencies": { "@atproto/lexicon": "^0.4.11", "zod": "^3.23.8" } }, "sha512-SfhP9dGx2qclaScFDb58Jnrmim5nk4geZXCqg6sB0I/KZhZEkr9iIx1hLCp+sxkIfEsmEJjeWO4B0rjUIJW5cw=="], + + "@atproto/xrpc-server": ["@atproto/xrpc-server@0.7.19", "", { "dependencies": { "@atproto/common": "^0.4.11", "@atproto/crypto": "^0.4.4", "@atproto/lexicon": "^0.4.11", "@atproto/xrpc": "^0.7.0", "cbor-x": "^1.5.1", "express": "^4.17.2", "http-errors": "^2.0.0", "mime-types": "^2.1.35", "rate-limiter-flexible": "^2.4.1", "uint8arrays": "3.0.0", "ws": "^8.12.0", "zod": "^3.23.8" } }, "sha512-YSCl/tU2NDykgDYslFSOYCr96esUgDwncFiADKL59/fyIFPLoT0qY8Uq/budpxUh0qPzjow4HHgVWESOaOpUmA=="], + + "@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], + + "@babel/compat-data": ["@babel/compat-data@7.27.5", "", {}, "sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg=="], + + "@babel/core": ["@babel/core@7.27.4", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.27.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.27.3", "@babel/helpers": "^7.27.4", "@babel/parser": "^7.27.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.27.4", "@babel/types": "^7.27.3", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g=="], + + "@babel/generator": ["@babel/generator@7.27.5", "", { "dependencies": { "@babel/parser": "^7.27.5", "@babel/types": "^7.27.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" } }, "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw=="], + + "@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.27.3", "", { "dependencies": { "@babel/types": "^7.27.3" } }, "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg=="], + + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.27.2", "", { "dependencies": { "@babel/compat-data": "^7.27.2", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ=="], + + "@babel/helper-create-class-features-plugin": ["@babel/helper-create-class-features-plugin@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-member-expression-to-functions": "^7.27.1", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/traverse": "^7.27.1", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A=="], + + "@babel/helper-create-regexp-features-plugin": ["@babel/helper-create-regexp-features-plugin@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "regexpu-core": "^6.2.0", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ=="], + + "@babel/helper-define-polyfill-provider": ["@babel/helper-define-polyfill-provider@0.6.4", "", { "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-plugin-utils": "^7.22.5", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", "resolve": "^1.14.2" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw=="], + + "@babel/helper-member-expression-to-functions": ["@babel/helper-member-expression-to-functions@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA=="], + + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w=="], + + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.27.3", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", "@babel/traverse": "^7.27.3" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg=="], + + "@babel/helper-optimise-call-expression": ["@babel/helper-optimise-call-expression@7.27.1", "", { "dependencies": { "@babel/types": "^7.27.1" } }, "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw=="], + + "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.27.1", "", {}, "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw=="], + + "@babel/helper-remap-async-to-generator": ["@babel/helper-remap-async-to-generator@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-wrap-function": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA=="], + + "@babel/helper-replace-supers": ["@babel/helper-replace-supers@7.27.1", "", { "dependencies": { "@babel/helper-member-expression-to-functions": "^7.27.1", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA=="], + + "@babel/helper-skip-transparent-expression-wrappers": ["@babel/helper-skip-transparent-expression-wrappers@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg=="], + + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.27.1", "", {}, "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="], + + "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="], + + "@babel/helper-wrap-function": ["@babel/helper-wrap-function@7.27.1", "", { "dependencies": { "@babel/template": "^7.27.1", "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ=="], + + "@babel/helpers": ["@babel/helpers@7.27.6", "", { "dependencies": { "@babel/template": "^7.27.2", "@babel/types": "^7.27.6" } }, "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug=="], + + "@babel/highlight": ["@babel/highlight@7.25.9", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw=="], + + "@babel/parser": ["@babel/parser@7.27.5", "", { "dependencies": { "@babel/types": "^7.27.3" }, "bin": "./bin/babel-parser.js" }, "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg=="], + + "@babel/plugin-proposal-decorators": ["@babel/plugin-proposal-decorators@7.27.1", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-syntax-decorators": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-DTxe4LBPrtFdsWzgpmbBKevg3e9PBy+dXRt19kSbucbZvL2uqtdqwwpluL1jfxYE0wIDTFp1nTy/q6gNLsxXrg=="], + + "@babel/plugin-proposal-export-default-from": ["@babel/plugin-proposal-export-default-from@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw=="], + + "@babel/plugin-syntax-async-generators": ["@babel/plugin-syntax-async-generators@7.8.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw=="], + + "@babel/plugin-syntax-bigint": ["@babel/plugin-syntax-bigint@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg=="], + + "@babel/plugin-syntax-class-properties": ["@babel/plugin-syntax-class-properties@7.12.13", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA=="], + + "@babel/plugin-syntax-class-static-block": ["@babel/plugin-syntax-class-static-block@7.14.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw=="], + + "@babel/plugin-syntax-decorators": ["@babel/plugin-syntax-decorators@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A=="], + + "@babel/plugin-syntax-dynamic-import": ["@babel/plugin-syntax-dynamic-import@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ=="], + + "@babel/plugin-syntax-export-default-from": ["@babel/plugin-syntax-export-default-from@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-eBC/3KSekshx19+N40MzjWqJd7KTEdOoLesAfa4IDFI8eRz5a47i5Oszus6zG/cwIXN63YhgLOMSSNJx49sENg=="], + + "@babel/plugin-syntax-flow": ["@babel/plugin-syntax-flow@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA=="], + + "@babel/plugin-syntax-import-attributes": ["@babel/plugin-syntax-import-attributes@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww=="], + + "@babel/plugin-syntax-import-meta": ["@babel/plugin-syntax-import-meta@7.10.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g=="], + + "@babel/plugin-syntax-json-strings": ["@babel/plugin-syntax-json-strings@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA=="], + + "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w=="], + + "@babel/plugin-syntax-logical-assignment-operators": ["@babel/plugin-syntax-logical-assignment-operators@7.10.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig=="], + + "@babel/plugin-syntax-nullish-coalescing-operator": ["@babel/plugin-syntax-nullish-coalescing-operator@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ=="], + + "@babel/plugin-syntax-numeric-separator": ["@babel/plugin-syntax-numeric-separator@7.10.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug=="], + + "@babel/plugin-syntax-object-rest-spread": ["@babel/plugin-syntax-object-rest-spread@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA=="], + + "@babel/plugin-syntax-optional-catch-binding": ["@babel/plugin-syntax-optional-catch-binding@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q=="], + + "@babel/plugin-syntax-optional-chaining": ["@babel/plugin-syntax-optional-chaining@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg=="], + + "@babel/plugin-syntax-private-property-in-object": ["@babel/plugin-syntax-private-property-in-object@7.14.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg=="], + + "@babel/plugin-syntax-top-level-await": ["@babel/plugin-syntax-top-level-await@7.14.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw=="], + + "@babel/plugin-syntax-typescript": ["@babel/plugin-syntax-typescript@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ=="], + + "@babel/plugin-transform-arrow-functions": ["@babel/plugin-transform-arrow-functions@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA=="], + + "@babel/plugin-transform-async-generator-functions": ["@babel/plugin-transform-async-generator-functions@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-remap-async-to-generator": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA=="], + + "@babel/plugin-transform-async-to-generator": ["@babel/plugin-transform-async-to-generator@7.27.1", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-remap-async-to-generator": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA=="], + + "@babel/plugin-transform-block-scoping": ["@babel/plugin-transform-block-scoping@7.27.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-JF6uE2s67f0y2RZcm2kpAUEbD50vH62TyWVebxwHAlbSdM49VqPz8t4a1uIjp4NIOIZ4xzLfjY5emt/RCyC7TQ=="], + + "@babel/plugin-transform-class-properties": ["@babel/plugin-transform-class-properties@7.27.1", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA=="], + + "@babel/plugin-transform-classes": ["@babel/plugin-transform-classes@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-compilation-targets": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", "@babel/traverse": "^7.27.1", "globals": "^11.1.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA=="], + + "@babel/plugin-transform-computed-properties": ["@babel/plugin-transform-computed-properties@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/template": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw=="], + + "@babel/plugin-transform-destructuring": ["@babel/plugin-transform-destructuring@7.27.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-s4Jrok82JpiaIprtY2nHsYmrThKvvwgHwjgd7UMiYhZaN0asdXNLr0y+NjTfkA7SyQE5i2Fb7eawUOZmLvyqOA=="], + + "@babel/plugin-transform-export-namespace-from": ["@babel/plugin-transform-export-namespace-from@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ=="], + + "@babel/plugin-transform-flow-strip-types": ["@babel/plugin-transform-flow-strip-types@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-syntax-flow": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg=="], + + "@babel/plugin-transform-for-of": ["@babel/plugin-transform-for-of@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw=="], + + "@babel/plugin-transform-function-name": ["@babel/plugin-transform-function-name@7.27.1", "", { "dependencies": { "@babel/helper-compilation-targets": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ=="], + + "@babel/plugin-transform-literals": ["@babel/plugin-transform-literals@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA=="], + + "@babel/plugin-transform-logical-assignment-operators": ["@babel/plugin-transform-logical-assignment-operators@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw=="], + + "@babel/plugin-transform-modules-commonjs": ["@babel/plugin-transform-modules-commonjs@7.27.1", "", { "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw=="], + + "@babel/plugin-transform-named-capturing-groups-regex": ["@babel/plugin-transform-named-capturing-groups-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng=="], + + "@babel/plugin-transform-nullish-coalescing-operator": ["@babel/plugin-transform-nullish-coalescing-operator@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA=="], + + "@babel/plugin-transform-numeric-separator": ["@babel/plugin-transform-numeric-separator@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw=="], + + "@babel/plugin-transform-object-rest-spread": ["@babel/plugin-transform-object-rest-spread@7.27.3", "", { "dependencies": { "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-transform-destructuring": "^7.27.3", "@babel/plugin-transform-parameters": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-7ZZtznF9g4l2JCImCo5LNKFHB5eXnN39lLtLY5Tg+VkR0jwOt7TBciMckuiQIOIW7L5tkQOCh3bVGYeXgMx52Q=="], + + "@babel/plugin-transform-optional-catch-binding": ["@babel/plugin-transform-optional-catch-binding@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q=="], + + "@babel/plugin-transform-optional-chaining": ["@babel/plugin-transform-optional-chaining@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg=="], + + "@babel/plugin-transform-parameters": ["@babel/plugin-transform-parameters@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg=="], + + "@babel/plugin-transform-private-methods": ["@babel/plugin-transform-private-methods@7.27.1", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA=="], + + "@babel/plugin-transform-private-property-in-object": ["@babel/plugin-transform-private-property-in-object@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ=="], + + "@babel/plugin-transform-react-display-name": ["@babel/plugin-transform-react-display-name@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-p9+Vl3yuHPmkirRrg021XiP+EETmPMQTLr6Ayjj85RLNEbb3Eya/4VI0vAdzQG9SEAl2Lnt7fy5lZyMzjYoZQQ=="], + + "@babel/plugin-transform-react-jsx": ["@babel/plugin-transform-react-jsx@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-module-imports": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/types": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw=="], + + "@babel/plugin-transform-react-jsx-development": ["@babel/plugin-transform-react-jsx-development@7.27.1", "", { "dependencies": { "@babel/plugin-transform-react-jsx": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q=="], + + "@babel/plugin-transform-react-jsx-self": ["@babel/plugin-transform-react-jsx-self@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw=="], + + "@babel/plugin-transform-react-jsx-source": ["@babel/plugin-transform-react-jsx-source@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw=="], + + "@babel/plugin-transform-react-pure-annotations": ["@babel/plugin-transform-react-pure-annotations@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA=="], + + "@babel/plugin-transform-regenerator": ["@babel/plugin-transform-regenerator@7.27.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-uhB8yHerfe3MWnuLAhEbeQ4afVoqv8BQsPqrTv7e/jZ9y00kJL6l9a/f4OWaKxotmjzewfEyXE1vgDJenkQ2/Q=="], + + "@babel/plugin-transform-runtime": ["@babel/plugin-transform-runtime@7.27.4", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.11.0", "babel-plugin-polyfill-regenerator": "^0.6.1", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-D68nR5zxU64EUzV8i7T3R5XP0Xhrou/amNnddsRQssx6GrTLdZl1rLxyjtVZBd+v/NVX4AbTPOB5aU8thAZV1A=="], + + "@babel/plugin-transform-shorthand-properties": ["@babel/plugin-transform-shorthand-properties@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ=="], + + "@babel/plugin-transform-spread": ["@babel/plugin-transform-spread@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q=="], + + "@babel/plugin-transform-sticky-regex": ["@babel/plugin-transform-sticky-regex@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g=="], + + "@babel/plugin-transform-template-literals": ["@babel/plugin-transform-template-literals@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg=="], + + "@babel/plugin-transform-typescript": ["@babel/plugin-transform-typescript@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg=="], + + "@babel/plugin-transform-unicode-regex": ["@babel/plugin-transform-unicode-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw=="], + + "@babel/preset-react": ["@babel/preset-react@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-transform-react-display-name": "^7.27.1", "@babel/plugin-transform-react-jsx": "^7.27.1", "@babel/plugin-transform-react-jsx-development": "^7.27.1", "@babel/plugin-transform-react-pure-annotations": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA=="], + + "@babel/preset-typescript": ["@babel/preset-typescript@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.27.1", "@babel/plugin-transform-typescript": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ=="], + + "@babel/runtime": ["@babel/runtime@7.27.6", "", {}, "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q=="], + + "@babel/runtime-corejs3": ["@babel/runtime-corejs3@7.27.6", "", { "dependencies": { "core-js-pure": "^3.30.2" } }, "sha512-vDVrlmRAY8z9Ul/HxT+8ceAru95LQgkSKiXkSYZvqtbkPSfhZJgpRp45Cldbh1GJ1kxzQkI70AqyrTI58KpaWQ=="], + + "@babel/template": ["@babel/template@7.27.2", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/parser": "^7.27.2", "@babel/types": "^7.27.1" } }, "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw=="], + + "@babel/traverse": ["@babel/traverse@7.27.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.27.3", "@babel/parser": "^7.27.4", "@babel/template": "^7.27.2", "@babel/types": "^7.27.3", "debug": "^4.3.1", "globals": "^11.1.0" } }, "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA=="], + + "@babel/traverse--for-generate-function-map": ["@babel/traverse@7.27.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.27.3", "@babel/parser": "^7.27.4", "@babel/template": "^7.27.2", "@babel/types": "^7.27.3", "debug": "^4.3.1", "globals": "^11.1.0" } }, "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA=="], + + "@babel/types": ["@babel/types@7.27.6", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q=="], + + "@bcoe/v8-coverage": ["@bcoe/v8-coverage@0.2.3", "", {}, "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw=="], + + "@cbor-extract/cbor-extract-darwin-arm64": ["@cbor-extract/cbor-extract-darwin-arm64@2.2.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-P7swiOAdF7aSi0H+tHtHtr6zrpF3aAq/W9FXx5HektRvLTM2O89xCyXF3pk7pLc7QpaY7AoaE8UowVf9QBdh3w=="], + + "@cbor-extract/cbor-extract-darwin-x64": ["@cbor-extract/cbor-extract-darwin-x64@2.2.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-1liF6fgowph0JxBbYnAS7ZlqNYLf000Qnj4KjqPNW4GViKrEql2MgZnAsExhY9LSy8dnvA4C0qHEBgPrll0z0w=="], + + "@cbor-extract/cbor-extract-linux-arm": ["@cbor-extract/cbor-extract-linux-arm@2.2.0", "", { "os": "linux", "cpu": "arm" }, "sha512-QeBcBXk964zOytiedMPQNZr7sg0TNavZeuUCD6ON4vEOU/25+pLhNN6EDIKJ9VLTKaZ7K7EaAriyYQ1NQ05s/Q=="], + + "@cbor-extract/cbor-extract-linux-arm64": ["@cbor-extract/cbor-extract-linux-arm64@2.2.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-rQvhNmDuhjTVXSPFLolmQ47/ydGOFXtbR7+wgkSY0bdOxCFept1hvg59uiLPT2fVDuJFuEy16EImo5tE2x3RsQ=="], + + "@cbor-extract/cbor-extract-linux-x64": ["@cbor-extract/cbor-extract-linux-x64@2.2.0", "", { "os": "linux", "cpu": "x64" }, "sha512-cWLAWtT3kNLHSvP4RKDzSTX9o0wvQEEAj4SKvhWuOVZxiDAeQazr9A+PSiRILK1VYMLeDml89ohxCnUNQNQNCw=="], + + "@cbor-extract/cbor-extract-win32-x64": ["@cbor-extract/cbor-extract-win32-x64@2.2.0", "", { "os": "win32", "cpu": "x64" }, "sha512-l2M+Z8DO2vbvADOBNLbbh9y5ST1RY5sqkWOg/58GkUPBYou/cuNZ68SGQ644f1CvZ8kcOxyZtw06+dxWHIoN/w=="], + + "@chromatic-com/storybook": ["@chromatic-com/storybook@3.2.6", "", { "dependencies": { "chromatic": "^11.15.0", "filesize": "^10.0.12", "jsonfile": "^6.1.0", "react-confetti": "^6.1.0", "strip-ansi": "^7.1.0" }, "peerDependencies": { "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" } }, "sha512-FDmn5Ry2DzQdik+eq2sp/kJMMT36Ewe7ONXUXM2Izd97c7r6R/QyGli8eyh/F0iyqVvbLveNYFyF0dBOJNwLqw=="], + + "@cloudflare/kv-asset-handler": ["@cloudflare/kv-asset-handler@0.3.4", "", { "dependencies": { "mime": "^3.0.0" } }, "sha512-YLPHc8yASwjNkmcDMQMY35yiWjoKAKnhUbPRszBRS0YgH+IXtsMp61j+yTcnCE3oO2DgP0U3iejLC8FTtKDC8Q=="], + + "@cloudflare/unenv-preset": ["@cloudflare/unenv-preset@2.0.2", "", { "peerDependencies": { "unenv": "2.0.0-rc.14", "workerd": "^1.20250124.0" }, "optionalPeers": ["workerd"] }, "sha512-nyzYnlZjjV5xT3LizahG1Iu6mnrCaxglJ04rZLpDwlDVDZ7v46lNsfxhV3A/xtfgQuSHmLnc6SVI+KwBpc3Lwg=="], + + "@cloudflare/vitest-pool-workers": ["@cloudflare/vitest-pool-workers@0.6.16", "", { "dependencies": { "birpc": "0.2.14", "cjs-module-lexer": "^1.2.3", "devalue": "^4.3.0", "esbuild": "0.17.19", "miniflare": "3.20250204.1", "semver": "^7.5.1", "wrangler": "3.109.1", "zod": "^3.22.3" }, "peerDependencies": { "@vitest/runner": "2.0.x - 2.1.x", "@vitest/snapshot": "2.0.x - 2.1.x", "vitest": "2.0.x - 2.1.x" } }, "sha512-fKGP+jMyrIh54QncFa7A5NE3k8fWW6oCU4v9IW6Hiu7cAVKBvhdPUAfYBQS7EU1TsjGJl/y5N4Urds3PUFocoQ=="], + + "@cloudflare/workerd-darwin-64": ["@cloudflare/workerd-darwin-64@1.20250408.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-bxhIwBWxaNItZLXDNOKY2dCv0FHjDiDkfJFpwv4HvtvU5MKcrivZHVmmfDzLW85rqzfcDOmKbZeMPVfiKxdBZw=="], + + "@cloudflare/workerd-darwin-arm64": ["@cloudflare/workerd-darwin-arm64@1.20250408.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-5XZ2Oykr8bSo7zBmERtHh18h5BZYC/6H1YFWVxEj3PtalF3+6SHsO4KZsbGvDml9Pu7sHV277jiZE5eny8Hlyw=="], + + "@cloudflare/workerd-linux-64": ["@cloudflare/workerd-linux-64@1.20250408.0", "", { "os": "linux", "cpu": "x64" }, "sha512-WbgItXWln6G5d7GvYLWcuOzAVwafysZaWunH3UEfsm95wPuRofpYnlDD861gdWJX10IHSVgMStGESUcs7FLerQ=="], + + "@cloudflare/workerd-linux-arm64": ["@cloudflare/workerd-linux-arm64@1.20250408.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-pAhEywPPvr92SLylnQfZEPgXz+9pOG9G9haAPLpEatncZwYiYd9yiR6HYWhKp2erzCoNrOqKg9IlQwU3z1IDiw=="], + + "@cloudflare/workerd-windows-64": ["@cloudflare/workerd-windows-64@1.20250408.0", "", { "os": "win32", "cpu": "x64" }, "sha512-nJ3RjMKGae2aF2rZ/CNeBvQPM+W5V1SUK0FYWG/uomyr7uQ2l4IayHna1ODg/OHHTEgIjwom0Mbn58iXb0WOcQ=="], + + "@cloudflare/workers-types": ["@cloudflare/workers-types@4.20250617.0", "", {}, "sha512-oUJWWKCR9bLgb7ymvM1V3Q//OpMR7jG4etCJs45bRdidmAgCog+y8w8fpuvh27JS4B8KzFNWB0YUD9xBPIf5Qg=="], + + "@cspotcode/source-map-support": ["@cspotcode/source-map-support@0.8.1", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="], + + "@datadog/pprof": ["@datadog/pprof@5.8.2", "", { "dependencies": { "delay": "^5.0.0", "node-gyp-build": "<4.0", "p-limit": "^3.1.0", "pprof-format": "^2.1.0", "source-map": "^0.7.4" } }, "sha512-M+bO4v4TaxYK6k2qJBxnhf7Vh25Wode64y4LfxzGs5kLTFr8eFTp6HJai3/af7U5gjTHX/4s+CHv2bxja97pbw=="], + + "@date-io/core": ["@date-io/core@2.17.0", "", {}, "sha512-+EQE8xZhRM/hsY0CDTVyayMDDY5ihc4MqXCrPxooKw19yAzUIC6uUqsZeaOFNL9YKTNxYKrJP5DFgE8o5xRCOw=="], + + "@date-io/date-fns": ["@date-io/date-fns@2.17.0", "", { "dependencies": { "@date-io/core": "^2.17.0" }, "peerDependencies": { "date-fns": "^2.0.0" }, "optionalPeers": ["date-fns"] }, "sha512-L0hWZ/mTpy3Gx/xXJ5tq5CzHo0L7ry6KEO9/w/JWiFWFLZgiNVo3ex92gOl3zmzjHqY/3Ev+5sehAr8UnGLEng=="], + + "@date-io/moment": ["@date-io/moment@2.17.0", "", { "dependencies": { "@date-io/core": "^2.17.0" }, "peerDependencies": { "moment": "^2.24.0" }, "optionalPeers": ["moment"] }, "sha512-e4nb4CDZU4k0WRVhz1Wvl7d+hFsedObSauDHKtZwU9kt7gdYEAzKgnrSCTHsEaXrDumdrkCYTeZ0Tmyk7uV4tw=="], + + "@drizzle-team/brocli": ["@drizzle-team/brocli@0.10.2", "", {}, "sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w=="], + + "@egjs/hammerjs": ["@egjs/hammerjs@2.0.17", "", { "dependencies": { "@types/hammerjs": "^2.0.36" } }, "sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A=="], + + "@emnapi/core": ["@emnapi/core@1.4.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.2", "tslib": "^2.4.0" } }, "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g=="], + + "@emnapi/runtime": ["@emnapi/runtime@1.4.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ=="], + + "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.0.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA=="], + + "@emotion/babel-plugin": ["@emotion/babel-plugin@11.13.5", "", { "dependencies": { "@babel/helper-module-imports": "^7.16.7", "@babel/runtime": "^7.18.3", "@emotion/hash": "^0.9.2", "@emotion/memoize": "^0.9.0", "@emotion/serialize": "^1.3.3", "babel-plugin-macros": "^3.1.0", "convert-source-map": "^1.5.0", "escape-string-regexp": "^4.0.0", "find-root": "^1.1.0", "source-map": "^0.5.7", "stylis": "4.2.0" } }, "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ=="], + + "@emotion/cache": ["@emotion/cache@11.14.0", "", { "dependencies": { "@emotion/memoize": "^0.9.0", "@emotion/sheet": "^1.4.0", "@emotion/utils": "^1.4.2", "@emotion/weak-memoize": "^0.4.0", "stylis": "4.2.0" } }, "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA=="], + + "@emotion/hash": ["@emotion/hash@0.9.2", "", {}, "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g=="], + + "@emotion/is-prop-valid": ["@emotion/is-prop-valid@1.3.1", "", { "dependencies": { "@emotion/memoize": "^0.9.0" } }, "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw=="], + + "@emotion/memoize": ["@emotion/memoize@0.9.0", "", {}, "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ=="], + + "@emotion/react": ["@emotion/react@11.14.0", "", { "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", "@emotion/cache": "^11.14.0", "@emotion/serialize": "^1.3.3", "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", "@emotion/utils": "^1.4.2", "@emotion/weak-memoize": "^0.4.0", "hoist-non-react-statics": "^3.3.1" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA=="], + + "@emotion/serialize": ["@emotion/serialize@1.3.3", "", { "dependencies": { "@emotion/hash": "^0.9.2", "@emotion/memoize": "^0.9.0", "@emotion/unitless": "^0.10.0", "@emotion/utils": "^1.4.2", "csstype": "^3.0.2" } }, "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA=="], + + "@emotion/sheet": ["@emotion/sheet@1.4.0", "", {}, "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg=="], + + "@emotion/styled": ["@emotion/styled@11.14.0", "", { "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", "@emotion/is-prop-valid": "^1.3.0", "@emotion/serialize": "^1.3.3", "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", "@emotion/utils": "^1.4.2" }, "peerDependencies": { "@emotion/react": "^11.0.0-rc.0", "react": ">=16.8.0" } }, "sha512-XxfOnXFffatap2IyCeJyNov3kiDQWoR08gPUQxvbL7fxKryGBKUZUkG6Hz48DZwVrJSVh9sJboyV1Ds4OW6SgA=="], + + "@emotion/unitless": ["@emotion/unitless@0.10.0", "", {}, "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg=="], + + "@emotion/use-insertion-effect-with-fallbacks": ["@emotion/use-insertion-effect-with-fallbacks@1.2.0", "", { "peerDependencies": { "react": ">=16.8.0" } }, "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg=="], + + "@emotion/utils": ["@emotion/utils@1.4.2", "", {}, "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA=="], + + "@emotion/weak-memoize": ["@emotion/weak-memoize@0.4.0", "", {}, "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg=="], + + "@esbuild-kit/core-utils": ["@esbuild-kit/core-utils@3.3.2", "", { "dependencies": { "esbuild": "~0.18.20", "source-map-support": "^0.5.21" } }, "sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ=="], + + "@esbuild-kit/esm-loader": ["@esbuild-kit/esm-loader@2.6.5", "", { "dependencies": { "@esbuild-kit/core-utils": "^3.3.2", "get-tsconfig": "^4.7.0" } }, "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA=="], + + "@esbuild-plugins/node-globals-polyfill": ["@esbuild-plugins/node-globals-polyfill@0.2.3", "", { "peerDependencies": { "esbuild": "*" } }, "sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw=="], + + "@esbuild-plugins/node-modules-polyfill": ["@esbuild-plugins/node-modules-polyfill@0.2.2", "", { "dependencies": { "escape-string-regexp": "^4.0.0", "rollup-plugin-node-polyfills": "^0.2.1" }, "peerDependencies": { "esbuild": "*" } }, "sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA=="], + + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.25.5", "", { "os": "android", "cpu": "arm" }, "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.5", "", { "os": "android", "cpu": "arm64" }, "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.25.5", "", { "os": "android", "cpu": "x64" }, "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.5", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.5", "", { "os": "linux", "cpu": "arm" }, "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.5", "", { "os": "linux", "cpu": "ia32" }, "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.5", "", { "os": "linux", "cpu": "none" }, "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.5", "", { "os": "linux", "cpu": "none" }, "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.5", "", { "os": "linux", "cpu": "none" }, "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.5", "", { "os": "linux", "cpu": "x64" }, "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw=="], + + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.5", "", { "os": "none", "cpu": "arm64" }, "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.5", "", { "os": "none", "cpu": "x64" }, "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ=="], + + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.5", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.5", "", { "os": "openbsd", "cpu": "x64" }, "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.5", "", { "os": "sunos", "cpu": "x64" }, "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.5", "", { "os": "win32", "cpu": "x64" }, "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g=="], + + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.7.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw=="], + + "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], + + "@eslint/config-array": ["@eslint/config-array@0.20.1", "", { "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw=="], + + "@eslint/config-helpers": ["@eslint/config-helpers@0.2.3", "", {}, "sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg=="], + + "@eslint/core": ["@eslint/core@0.14.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg=="], + + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.1", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ=="], + + "@eslint/js": ["@eslint/js@9.29.0", "", {}, "sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ=="], + + "@eslint/object-schema": ["@eslint/object-schema@2.1.6", "", {}, "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA=="], + + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.3.2", "", { "dependencies": { "@eslint/core": "^0.15.0", "levn": "^0.4.1" } }, "sha512-4SaFZCNfJqvk/kenHpI8xvN42DMaoycy4PzKc5otHxRswww1kAt82OlBuwRVLofCACCTZEcla2Ydxv8scMXaTg=="], + + "@expo/cli": ["@expo/cli@0.24.14", "", { "dependencies": { "@0no-co/graphql.web": "^1.0.8", "@babel/runtime": "^7.20.0", "@expo/code-signing-certificates": "^0.0.5", "@expo/config": "~11.0.10", "@expo/config-plugins": "~10.0.2", "@expo/devcert": "^1.1.2", "@expo/env": "~1.0.5", "@expo/image-utils": "^0.7.4", "@expo/json-file": "^9.1.4", "@expo/metro-config": "~0.20.14", "@expo/osascript": "^2.2.4", "@expo/package-manager": "^1.8.4", "@expo/plist": "^0.3.4", "@expo/prebuild-config": "^9.0.6", "@expo/spawn-async": "^1.7.2", "@expo/ws-tunnel": "^1.0.1", "@expo/xcpretty": "^4.3.0", "@react-native/dev-middleware": "0.79.3", "@urql/core": "^5.0.6", "@urql/exchange-retry": "^1.3.0", "accepts": "^1.3.8", "arg": "^5.0.2", "better-opn": "~3.0.2", "bplist-creator": "0.1.0", "bplist-parser": "^0.3.1", "chalk": "^4.0.0", "ci-info": "^3.3.0", "compression": "^1.7.4", "connect": "^3.7.0", "debug": "^4.3.4", "env-editor": "^0.4.1", "freeport-async": "^2.0.0", "getenv": "^2.0.0", "glob": "^10.4.2", "lan-network": "^0.1.6", "minimatch": "^9.0.0", "node-forge": "^1.3.1", "npm-package-arg": "^11.0.0", "ora": "^3.4.0", "picomatch": "^3.0.1", "pretty-bytes": "^5.6.0", "pretty-format": "^29.7.0", "progress": "^2.0.3", "prompts": "^2.3.2", "qrcode-terminal": "0.11.0", "require-from-string": "^2.0.2", "requireg": "^0.2.2", "resolve": "^1.22.2", "resolve-from": "^5.0.0", "resolve.exports": "^2.0.3", "semver": "^7.6.0", "send": "^0.19.0", "slugify": "^1.3.4", "source-map-support": "~0.5.21", "stacktrace-parser": "^0.1.10", "structured-headers": "^0.4.1", "tar": "^7.4.3", "terminal-link": "^2.1.1", "undici": "^6.18.2", "wrap-ansi": "^7.0.0", "ws": "^8.12.1" }, "bin": { "expo-internal": "build/bin/cli" } }, "sha512-o+QYyfIBhSRTgaywKTLJhm2Fg5PrSeUVCXS+uQySamgoMjLNhHa8QwE64mW/FmJr5hZLiqUEQxb60FK4JcyqXg=="], + + "@expo/code-signing-certificates": ["@expo/code-signing-certificates@0.0.5", "", { "dependencies": { "node-forge": "^1.2.1", "nullthrows": "^1.1.1" } }, "sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw=="], + + "@expo/config": ["@expo/config@11.0.10", "", { "dependencies": { "@babel/code-frame": "~7.10.4", "@expo/config-plugins": "~10.0.2", "@expo/config-types": "^53.0.4", "@expo/json-file": "^9.1.4", "deepmerge": "^4.3.1", "getenv": "^1.0.0", "glob": "^10.4.2", "require-from-string": "^2.0.2", "resolve-from": "^5.0.0", "resolve-workspace-root": "^2.0.0", "semver": "^7.6.0", "slugify": "^1.3.4", "sucrase": "3.35.0" } }, "sha512-8S8Krr/c5lnl0eF03tA2UGY9rGBhZcbWKz2UWw5dpL/+zstwUmog8oyuuC8aRcn7GiTQLlbBkxcMeT8sOGlhbA=="], + + "@expo/config-plugins": ["@expo/config-plugins@10.0.2", "", { "dependencies": { "@expo/config-types": "^53.0.3", "@expo/json-file": "~9.1.4", "@expo/plist": "^0.3.4", "@expo/sdk-runtime-versions": "^1.0.0", "chalk": "^4.1.2", "debug": "^4.3.5", "getenv": "^1.0.0", "glob": "^10.4.2", "resolve-from": "^5.0.0", "semver": "^7.5.4", "slash": "^3.0.0", "slugify": "^1.6.6", "xcode": "^3.0.1", "xml2js": "0.6.0" } }, "sha512-TzUn3pPdpwCS0yYaSlZOClgDmCX8N4I2lfgitX5oStqmvpPtB+vqtdyqsVM02fQ2tlJIAqwBW+NHaHqqy8Jv7g=="], + + "@expo/config-types": ["@expo/config-types@53.0.4", "", {}, "sha512-0s+9vFx83WIToEr0Iwy4CcmiUXa5BgwBmEjylBB2eojX5XAMm9mJvw9KpjAb8m7zq2G0Q6bRbeufkzgbipuNQg=="], + + "@expo/devcert": ["@expo/devcert@1.2.0", "", { "dependencies": { "@expo/sudo-prompt": "^9.3.1", "debug": "^3.1.0", "glob": "^10.4.2" } }, "sha512-Uilcv3xGELD5t/b0eM4cxBFEKQRIivB3v7i+VhWLV/gL98aw810unLKKJbGAxAIhY6Ipyz8ChWibFsKFXYwstA=="], + + "@expo/env": ["@expo/env@1.0.5", "", { "dependencies": { "chalk": "^4.0.0", "debug": "^4.3.4", "dotenv": "~16.4.5", "dotenv-expand": "~11.0.6", "getenv": "^1.0.0" } }, "sha512-dtEZ4CAMaVrFu2+tezhU3FoGWtbzQl50xV+rNJE5lYVRjUflWiZkVHlHkWUlPAwDPifLy4TuissVfScGGPWR5g=="], + + "@expo/fingerprint": ["@expo/fingerprint@0.13.0", "", { "dependencies": { "@expo/spawn-async": "^1.7.2", "arg": "^5.0.2", "chalk": "^4.1.2", "debug": "^4.3.4", "find-up": "^5.0.0", "getenv": "^2.0.0", "ignore": "^5.3.1", "minimatch": "^9.0.0", "p-limit": "^3.1.0", "resolve-from": "^5.0.0", "semver": "^7.6.0" }, "bin": { "fingerprint": "bin/cli.js" } }, "sha512-3IwpH0p3uO8jrJSLOUNDzJVh7VEBod0emnCBq0hD72sy6ICmzauM6Xf4he+2Tip7fzImCJRd63GaehV+CCtpvA=="], + + "@expo/image-utils": ["@expo/image-utils@0.7.4", "", { "dependencies": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.0.0", "getenv": "^1.0.0", "jimp-compact": "0.16.1", "parse-png": "^2.1.0", "resolve-from": "^5.0.0", "semver": "^7.6.0", "temp-dir": "~2.0.0", "unique-string": "~2.0.0" } }, "sha512-LcZ82EJy/t/a1avwIboeZbO6hlw8CvsIRh2k6SWPcAOvW0RqynyKFzUJsvnjWlhUzfBEn4oI7y/Pu5Xkw3KkkA=="], + + "@expo/json-file": ["@expo/json-file@9.1.4", "", { "dependencies": { "@babel/code-frame": "~7.10.4", "json5": "^2.2.3" } }, "sha512-7Bv86X27fPERGhw8aJEZvRcH9sk+9BenDnEmrI3ZpywKodYSBgc8lX9Y32faNVQ/p0YbDK9zdJ0BfAKNAOyi0A=="], + + "@expo/metro-config": ["@expo/metro-config@0.20.14", "", { "dependencies": { "@babel/core": "^7.20.0", "@babel/generator": "^7.20.5", "@babel/parser": "^7.20.0", "@babel/types": "^7.20.0", "@expo/config": "~11.0.9", "@expo/env": "~1.0.5", "@expo/json-file": "~9.1.4", "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", "debug": "^4.3.2", "dotenv": "~16.4.5", "dotenv-expand": "~11.0.6", "getenv": "^1.0.0", "glob": "^10.4.2", "jsc-safe-url": "^0.2.4", "lightningcss": "~1.27.0", "minimatch": "^9.0.0", "postcss": "~8.4.32", "resolve-from": "^5.0.0" } }, "sha512-tYDDubuZycK+NX00XN7BMu73kBur/evOPcKfxc+UBeFfgN2EifOITtdwSUDdRsbtJ2OnXwMY1HfRUG3Lq3l4cw=="], + + "@expo/metro-runtime": ["@expo/metro-runtime@5.0.4", "", { "peerDependencies": { "react-native": "*" } }, "sha512-r694MeO+7Vi8IwOsDIDzH/Q5RPMt1kUDYbiTJwnO15nIqiDwlE8HU55UlRhffKZy6s5FmxQsZ8HA+T8DqUW8cQ=="], + + "@expo/osascript": ["@expo/osascript@2.2.4", "", { "dependencies": { "@expo/spawn-async": "^1.7.2", "exec-async": "^2.2.0" } }, "sha512-Q+Oyj+1pdRiHHpev9YjqfMZzByFH8UhKvSszxa0acTveijjDhQgWrq4e9T/cchBHi0GWZpGczWyiyJkk1wM1dg=="], + + "@expo/package-manager": ["@expo/package-manager@1.8.4", "", { "dependencies": { "@expo/json-file": "^9.1.4", "@expo/spawn-async": "^1.7.2", "chalk": "^4.0.0", "npm-package-arg": "^11.0.0", "ora": "^3.4.0", "resolve-workspace-root": "^2.0.0" } }, "sha512-8H8tLga/NS3iS7QaX/NneRPqbObnHvVCfMCo0ShudreOFmvmgqhYjRlkZTRstSyFqefai8ONaT4VmnLHneRYYg=="], + + "@expo/plist": ["@expo/plist@0.3.4", "", { "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.2.3", "xmlbuilder": "^15.1.1" } }, "sha512-MhBLaUJNe9FQDDU2xhSNS4SAolr6K2wuyi4+A79vYuXLkAoICsbTwcGEQJN5jPY6D9izO/jsXh5k0h+mIWQMdw=="], + + "@expo/prebuild-config": ["@expo/prebuild-config@9.0.6", "", { "dependencies": { "@expo/config": "~11.0.9", "@expo/config-plugins": "~10.0.2", "@expo/config-types": "^53.0.4", "@expo/image-utils": "^0.7.4", "@expo/json-file": "^9.1.4", "@react-native/normalize-colors": "0.79.2", "debug": "^4.3.1", "resolve-from": "^5.0.0", "semver": "^7.6.0", "xml2js": "0.6.0" } }, "sha512-HDTdlMkTQZ95rd6EpvuLM+xkZV03yGLc38FqI37qKFLJtUN1WnYVaWsuXKoljd1OrVEVsHe6CfqKwaPZ52D56Q=="], + + "@expo/sdk-runtime-versions": ["@expo/sdk-runtime-versions@1.0.0", "", {}, "sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ=="], + + "@expo/server": ["@expo/server@0.6.2", "", { "dependencies": { "abort-controller": "^3.0.0", "debug": "^4.3.4", "source-map-support": "~0.5.21", "undici": "^6.18.2 || ^7.0.0" } }, "sha512-ko+dq+1WEC126/iGVv3g+ChFCs9wGyKtGlnYphwrOQbFBBqX19sn6UV0oUks6UdhD+MyzUv+w/TOdktdcI0Cgg=="], + + "@expo/spawn-async": ["@expo/spawn-async@1.7.2", "", { "dependencies": { "cross-spawn": "^7.0.3" } }, "sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew=="], + + "@expo/sudo-prompt": ["@expo/sudo-prompt@9.3.2", "", {}, "sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw=="], + + "@expo/vector-icons": ["@expo/vector-icons@14.1.0", "", { "peerDependencies": { "expo-font": "*", "react": "*", "react-native": "*" } }, "sha512-7T09UE9h8QDTsUeMGymB4i+iqvtEeaO5VvUjryFB4tugDTG/bkzViWA74hm5pfjjDEhYMXWaX112mcvhccmIwQ=="], + + "@expo/ws-tunnel": ["@expo/ws-tunnel@1.0.6", "", {}, "sha512-nDRbLmSrJar7abvUjp3smDwH8HcbZcoOEa5jVPUv9/9CajgmWw20JNRwTuBRzWIWIkEJDkz20GoNA+tSwUqk0Q=="], + + "@expo/xcpretty": ["@expo/xcpretty@4.3.2", "", { "dependencies": { "@babel/code-frame": "7.10.4", "chalk": "^4.1.0", "find-up": "^5.0.0", "js-yaml": "^4.1.0" }, "bin": { "excpretty": "build/cli.js" } }, "sha512-ReZxZ8pdnoI3tP/dNnJdnmAk7uLT4FjsKDGW7YeDdvdOMz2XCQSmSCM9IWlrXuWtMF9zeSB6WJtEhCQ41gQOfw=="], + + "@fastify/busboy": ["@fastify/busboy@2.1.1", "", {}, "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA=="], + + "@gorhom/bottom-sheet": ["@gorhom/bottom-sheet@5.1.6", "", { "dependencies": { "@gorhom/portal": "1.0.14", "invariant": "^2.2.4" }, "peerDependencies": { "@types/react": "*", "@types/react-native": "*", "react": "*", "react-native": "*", "react-native-gesture-handler": ">=2.16.1", "react-native-reanimated": ">=3.16.0" }, "optionalPeers": ["@types/react", "@types/react-native"] }, "sha512-0b5tQj4fTaZAjST1PnkCp0p7d8iRqMezibTcqc8Kkn3N23Vn6upORNTD1fH0bLfwRt6e0WnZ7DjAmq315lrcKQ=="], + + "@gorhom/portal": ["@gorhom/portal@1.0.14", "", { "dependencies": { "nanoid": "^3.3.1" }, "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-MXyL4xvCjmgaORr/rtryDNFy3kU4qUbKlwtQqqsygd0xX3mhKjOLn6mQK8wfu0RkoE0pBE0nAasRoHua+/QZ7A=="], + + "@grpc/grpc-js": ["@grpc/grpc-js@1.13.4", "", { "dependencies": { "@grpc/proto-loader": "^0.7.13", "@js-sdsl/ordered-map": "^4.4.2" } }, "sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg=="], + + "@grpc/proto-loader": ["@grpc/proto-loader@0.7.15", "", { "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", "protobufjs": "^7.2.5", "yargs": "^17.7.2" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" } }, "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ=="], + + "@hono/node-server": ["@hono/node-server@1.14.4", "", { "peerDependencies": { "hono": "^4" } }, "sha512-DnxpshhYewr2q9ZN8ez/M5mmc3sucr8CT1sIgIy1bkeUXut9XWDkqHoFHRhWIQgkYnKpVRxunyhK7WzpJeJ6qQ=="], + + "@hono/node-ws": ["@hono/node-ws@1.1.7", "", { "dependencies": { "ws": "^8.17.0" }, "peerDependencies": { "@hono/node-server": "^1.11.1", "hono": "^4.6.0" } }, "sha512-O+sJXeruHlAAdSHUoyol8s2kTVqixdGIfKqakyN6z2RKR2O8LDOFr1CpTye7xfwmUsBe6uoXKSLmGvLbCfPFgw=="], + + "@hookform/resolvers": ["@hookform/resolvers@4.1.3", "", { "dependencies": { "@standard-schema/utils": "^0.3.0" }, "peerDependencies": { "react-hook-form": "^7.0.0" } }, "sha512-Jsv6UOWYTrEFJ/01ZrnwVXs7KDvP8XIo115i++5PWvNkNvkrsTfGiLS6w+eJ57CYtUtDQalUWovCZDHFJ8u1VQ=="], + + "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], + + "@humanfs/node": ["@humanfs/node@0.16.6", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" } }, "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw=="], + + "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], + + "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], + + "@iconify-json/teenyicons": ["@iconify-json/teenyicons@1.2.2", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-Do08DrvNpT+pKVeyFqn7nZiIviAAY8KbduSfpNKzE1bgVekAIJ/AAJtOBSUFpV4vTk+hXw195+jmCv8/0cJSKA=="], + + "@iconify/types": ["@iconify/types@2.0.0", "", {}, "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="], + + "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.0.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ=="], + + "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.0.4" }, "os": "darwin", "cpu": "x64" }, "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q=="], + + "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.0.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg=="], + + "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.0.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ=="], + + "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.0.5", "", { "os": "linux", "cpu": "arm" }, "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g=="], + + "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA=="], + + "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.0.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA=="], + + "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw=="], + + "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA=="], + + "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw=="], + + "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.0.5" }, "os": "linux", "cpu": "arm" }, "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ=="], + + "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA=="], + + "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.0.4" }, "os": "linux", "cpu": "s390x" }, "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q=="], + + "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA=="], + + "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g=="], + + "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw=="], + + "@img/sharp-wasm32": ["@img/sharp-wasm32@0.33.5", "", { "dependencies": { "@emnapi/runtime": "^1.2.0" }, "cpu": "none" }, "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg=="], + + "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.33.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ=="], + + "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.33.5", "", { "os": "win32", "cpu": "x64" }, "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg=="], + + "@ipld/dag-cbor": ["@ipld/dag-cbor@9.2.4", "", { "dependencies": { "cborg": "^4.0.0", "multiformats": "^13.1.0" } }, "sha512-GbDWYl2fdJgkYtIJN0HY9oO0o50d1nB4EQb7uYWKUd2ztxCjxiEW3PjwGG0nqUpN1G4Cug6LX8NzbA7fKT+zfA=="], + + "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], + + "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="], + + "@isaacs/ttlcache": ["@isaacs/ttlcache@1.4.1", "", {}, "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA=="], + + "@istanbuljs/load-nyc-config": ["@istanbuljs/load-nyc-config@1.1.0", "", { "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", "get-package-type": "^0.1.0", "js-yaml": "^3.13.1", "resolve-from": "^5.0.0" } }, "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ=="], + + "@istanbuljs/schema": ["@istanbuljs/schema@0.1.3", "", {}, "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA=="], + + "@jest/console": ["@jest/console@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0", "slash": "^3.0.0" } }, "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg=="], + + "@jest/core": ["@jest/core@29.7.0", "", { "dependencies": { "@jest/console": "^29.7.0", "@jest/reporters": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "jest-changed-files": "^29.7.0", "jest-config": "^29.7.0", "jest-haste-map": "^29.7.0", "jest-message-util": "^29.7.0", "jest-regex-util": "^29.6.3", "jest-resolve": "^29.7.0", "jest-resolve-dependencies": "^29.7.0", "jest-runner": "^29.7.0", "jest-runtime": "^29.7.0", "jest-snapshot": "^29.7.0", "jest-util": "^29.7.0", "jest-validate": "^29.7.0", "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"] }, "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg=="], + + "@jest/create-cache-key-function": ["@jest/create-cache-key-function@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3" } }, "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA=="], + + "@jest/environment": ["@jest/environment@29.7.0", "", { "dependencies": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "jest-mock": "^29.7.0" } }, "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw=="], + + "@jest/expect": ["@jest/expect@29.7.0", "", { "dependencies": { "expect": "^29.7.0", "jest-snapshot": "^29.7.0" } }, "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ=="], + + "@jest/expect-utils": ["@jest/expect-utils@29.7.0", "", { "dependencies": { "jest-get-type": "^29.6.3" } }, "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA=="], + + "@jest/fake-timers": ["@jest/fake-timers@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", "jest-message-util": "^29.7.0", "jest-mock": "^29.7.0", "jest-util": "^29.7.0" } }, "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ=="], + + "@jest/globals": ["@jest/globals@29.7.0", "", { "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", "@jest/types": "^29.6.3", "jest-mock": "^29.7.0" } }, "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ=="], + + "@jest/reporters": ["@jest/reporters@29.7.0", "", { "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-instrument": "^6.0.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0", "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", "v8-to-istanbul": "^9.0.1" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"] }, "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg=="], + + "@jest/schemas": ["@jest/schemas@29.6.3", "", { "dependencies": { "@sinclair/typebox": "^0.27.8" } }, "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA=="], + + "@jest/source-map": ["@jest/source-map@29.6.3", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", "graceful-fs": "^4.2.9" } }, "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw=="], + + "@jest/test-result": ["@jest/test-result@29.7.0", "", { "dependencies": { "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA=="], + + "@jest/test-sequencer": ["@jest/test-sequencer@29.7.0", "", { "dependencies": { "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "slash": "^3.0.0" } }, "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw=="], + + "@jest/transform": ["@jest/transform@29.7.0", "", { "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", "write-file-atomic": "^4.0.2" } }, "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw=="], + + "@jest/types": ["@jest/types@29.6.3", "", { "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw=="], + + "@joshwooding/vite-plugin-react-docgen-typescript": ["@joshwooding/vite-plugin-react-docgen-typescript@0.5.0", "", { "dependencies": { "glob": "^10.0.0", "magic-string": "^0.27.0", "react-docgen-typescript": "^2.2.2" }, "peerDependencies": { "typescript": ">= 4.3.x", "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" }, "optionalPeers": ["typescript"] }, "sha512-qYDdL7fPwLRI+bJNurVcis+tNgJmvWjH4YTBGXTA8xMuxFrnAz6E5o35iyzyKbq5J5Lr8mJGfrR5GXl+WGwhgQ=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/set-array": ["@jridgewell/set-array@1.2.1", "", {}, "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A=="], + + "@jridgewell/source-map": ["@jridgewell/source-map@0.3.6", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" } }, "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], + + "@js-sdsl/ordered-map": ["@js-sdsl/ordered-map@4.4.2", "", {}, "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw=="], + + "@mapbox/geojson-rewind": ["@mapbox/geojson-rewind@0.5.2", "", { "dependencies": { "get-stream": "^6.0.1", "minimist": "^1.2.6" }, "bin": { "geojson-rewind": "geojson-rewind" } }, "sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA=="], + + "@mapbox/geojson-types": ["@mapbox/geojson-types@1.0.2", "", {}, "sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw=="], + + "@mapbox/jsonlint-lines-primitives": ["@mapbox/jsonlint-lines-primitives@2.0.2", "", {}, "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ=="], + + "@mapbox/mapbox-gl-supported": ["@mapbox/mapbox-gl-supported@1.5.0", "", { "peerDependencies": { "mapbox-gl": ">=0.32.1 <2.0.0" } }, "sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg=="], + + "@mapbox/point-geometry": ["@mapbox/point-geometry@0.1.0", "", {}, "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ=="], + + "@mapbox/tiny-sdf": ["@mapbox/tiny-sdf@1.2.5", "", {}, "sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw=="], + + "@mapbox/unitbezier": ["@mapbox/unitbezier@0.0.0", "", {}, "sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA=="], + + "@mapbox/vector-tile": ["@mapbox/vector-tile@1.3.1", "", { "dependencies": { "@mapbox/point-geometry": "~0.1.0" } }, "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw=="], + + "@mapbox/whoots-js": ["@mapbox/whoots-js@3.1.0", "", {}, "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q=="], + + "@math.gl/web-mercator": ["@math.gl/web-mercator@3.6.3", "", { "dependencies": { "@babel/runtime": "^7.12.0", "gl-matrix": "^3.4.0" } }, "sha512-UVrkSOs02YLehKaehrxhAejYMurehIHPfFQvPFZmdJHglHOU4V2cCUApTVEwOksvCp161ypEqVp+9H6mGhTTcw=="], + + "@mdx-js/react": ["@mdx-js/react@3.1.0", "", { "dependencies": { "@types/mdx": "^2.0.0" }, "peerDependencies": { "@types/react": ">=16", "react": ">=16" } }, "sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ=="], + + "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.12.3", "", { "dependencies": { "ajv": "^6.12.6", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-DyVYSOafBvk3/j1Oka4z5BWT8o4AFmoNyZY9pALOm7Lh3GZglR71Co4r4dEUoqDWdDazIZQHBe7J2Nwkg6gHgQ=="], + + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.11", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.9.0" } }, "sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA=="], + + "@noble/curves": ["@noble/curves@1.9.2", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-HxngEd2XUcg9xi20JkwlLCtYwfoFw4JGkuZpT+WlsPD4gB/cxkvTD8fSsoAnphGZhFdZYKeQIPCuFlWPm1uE0g=="], + + "@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], + + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], + + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], + + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + + "@nolyfill/is-core-module": ["@nolyfill/is-core-module@1.0.39", "", {}, "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA=="], + + "@opentelemetry/api": ["@opentelemetry/api@1.9.0", "", {}, "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg=="], + + "@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.200.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-IKJBQxh91qJ+3ssRly5hYEJ8NDHu9oY/B1PXVSCWf7zytmYO9RNLB0Ox9XQ/fJ8m6gY6Q6NtBWlmXfaXt5Uc4Q=="], + + "@opentelemetry/auto-instrumentations-node": ["@opentelemetry/auto-instrumentations-node@0.58.1", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/instrumentation-amqplib": "^0.47.0", "@opentelemetry/instrumentation-aws-lambda": "^0.51.1", "@opentelemetry/instrumentation-aws-sdk": "^0.52.0", "@opentelemetry/instrumentation-bunyan": "^0.46.0", "@opentelemetry/instrumentation-cassandra-driver": "^0.46.0", "@opentelemetry/instrumentation-connect": "^0.44.0", "@opentelemetry/instrumentation-cucumber": "^0.15.0", "@opentelemetry/instrumentation-dataloader": "^0.17.0", "@opentelemetry/instrumentation-dns": "^0.44.0", "@opentelemetry/instrumentation-express": "^0.49.0", "@opentelemetry/instrumentation-fastify": "^0.45.0", "@opentelemetry/instrumentation-fs": "^0.20.0", "@opentelemetry/instrumentation-generic-pool": "^0.44.0", "@opentelemetry/instrumentation-graphql": "^0.48.0", "@opentelemetry/instrumentation-grpc": "^0.200.0", "@opentelemetry/instrumentation-hapi": "^0.46.0", "@opentelemetry/instrumentation-http": "^0.200.0", "@opentelemetry/instrumentation-ioredis": "^0.48.0", "@opentelemetry/instrumentation-kafkajs": "^0.9.2", "@opentelemetry/instrumentation-knex": "^0.45.0", "@opentelemetry/instrumentation-koa": "^0.48.0", "@opentelemetry/instrumentation-lru-memoizer": "^0.45.0", "@opentelemetry/instrumentation-memcached": "^0.44.0", "@opentelemetry/instrumentation-mongodb": "^0.53.0", "@opentelemetry/instrumentation-mongoose": "^0.47.1", "@opentelemetry/instrumentation-mysql": "^0.46.0", "@opentelemetry/instrumentation-mysql2": "^0.46.0", "@opentelemetry/instrumentation-nestjs-core": "^0.46.0", "@opentelemetry/instrumentation-net": "^0.44.0", "@opentelemetry/instrumentation-pg": "^0.52.0", "@opentelemetry/instrumentation-pino": "^0.47.0", "@opentelemetry/instrumentation-redis": "^0.47.0", "@opentelemetry/instrumentation-redis-4": "^0.47.0", "@opentelemetry/instrumentation-restify": "^0.46.0", "@opentelemetry/instrumentation-router": "^0.45.0", "@opentelemetry/instrumentation-runtime-node": "^0.14.0", "@opentelemetry/instrumentation-socket.io": "^0.47.0", "@opentelemetry/instrumentation-tedious": "^0.19.0", "@opentelemetry/instrumentation-undici": "^0.11.0", "@opentelemetry/instrumentation-winston": "^0.45.0", "@opentelemetry/resource-detector-alibaba-cloud": "^0.31.0", "@opentelemetry/resource-detector-aws": "^2.0.0", "@opentelemetry/resource-detector-azure": "^0.7.0", "@opentelemetry/resource-detector-container": "^0.7.0", "@opentelemetry/resource-detector-gcp": "^0.34.0", "@opentelemetry/resources": "^2.0.0", "@opentelemetry/sdk-node": "^0.200.0" }, "peerDependencies": { "@opentelemetry/api": "^1.4.1", "@opentelemetry/core": "^2.0.0" } }, "sha512-hAsNw5XtFTytQ6GrCspIwKKSamXQGfAvRfqOL93VTqaI1WFBhndyXsNrjAzqULvK0JwMJOuZb77ckdrvJrW3vA=="], + + "@opentelemetry/context-async-hooks": ["@opentelemetry/context-async-hooks@2.0.0", "", { "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-IEkJGzK1A9v3/EHjXh3s2IiFc6L4jfK+lNgKVgUjeUJQRRhnVFMIO3TAvKwonm9O1HebCuoOt98v8bZW7oVQHA=="], + + "@opentelemetry/core": ["@opentelemetry/core@2.0.1", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw=="], + + "@opentelemetry/exporter-logs-otlp-grpc": ["@opentelemetry/exporter-logs-otlp-grpc@0.200.0", "", { "dependencies": { "@grpc/grpc-js": "^1.7.1", "@opentelemetry/core": "2.0.0", "@opentelemetry/otlp-exporter-base": "0.200.0", "@opentelemetry/otlp-grpc-exporter-base": "0.200.0", "@opentelemetry/otlp-transformer": "0.200.0", "@opentelemetry/sdk-logs": "0.200.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-+3MDfa5YQPGM3WXxW9kqGD85Q7s9wlEMVNhXXG7tYFLnIeaseUt9YtCeFhEDFzfEktacdFpOtXmJuNW8cHbU5A=="], + + "@opentelemetry/exporter-logs-otlp-http": ["@opentelemetry/exporter-logs-otlp-http@0.200.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.200.0", "@opentelemetry/core": "2.0.0", "@opentelemetry/otlp-exporter-base": "0.200.0", "@opentelemetry/otlp-transformer": "0.200.0", "@opentelemetry/sdk-logs": "0.200.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-KfWw49htbGGp9s8N4KI8EQ9XuqKJ0VG+yVYVYFiCYSjEV32qpQ5qZ9UZBzOZ6xRb+E16SXOSCT3RkqBVSABZ+g=="], + + "@opentelemetry/exporter-logs-otlp-proto": ["@opentelemetry/exporter-logs-otlp-proto@0.200.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.200.0", "@opentelemetry/core": "2.0.0", "@opentelemetry/otlp-exporter-base": "0.200.0", "@opentelemetry/otlp-transformer": "0.200.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/sdk-logs": "0.200.0", "@opentelemetry/sdk-trace-base": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-GmahpUU/55hxfH4TP77ChOfftADsCq/nuri73I/AVLe2s4NIglvTsaACkFVZAVmnXXyPS00Fk3x27WS3yO07zA=="], + + "@opentelemetry/exporter-metrics-otlp-grpc": ["@opentelemetry/exporter-metrics-otlp-grpc@0.200.0", "", { "dependencies": { "@grpc/grpc-js": "^1.7.1", "@opentelemetry/core": "2.0.0", "@opentelemetry/exporter-metrics-otlp-http": "0.200.0", "@opentelemetry/otlp-exporter-base": "0.200.0", "@opentelemetry/otlp-grpc-exporter-base": "0.200.0", "@opentelemetry/otlp-transformer": "0.200.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/sdk-metrics": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uHawPRvKIrhqH09GloTuYeq2BjyieYHIpiklOvxm9zhrCL2eRsnI/6g9v2BZTVtGp8tEgIa7rCQ6Ltxw6NBgew=="], + + "@opentelemetry/exporter-metrics-otlp-http": ["@opentelemetry/exporter-metrics-otlp-http@0.200.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/otlp-exporter-base": "0.200.0", "@opentelemetry/otlp-transformer": "0.200.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/sdk-metrics": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-5BiR6i8yHc9+qW7F6LqkuUnIzVNA7lt0qRxIKcKT+gq3eGUPHZ3DY29sfxI3tkvnwMgtnHDMNze5DdxW39HsAw=="], + + "@opentelemetry/exporter-metrics-otlp-proto": ["@opentelemetry/exporter-metrics-otlp-proto@0.200.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/exporter-metrics-otlp-http": "0.200.0", "@opentelemetry/otlp-exporter-base": "0.200.0", "@opentelemetry/otlp-transformer": "0.200.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/sdk-metrics": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-E+uPj0yyvz81U9pvLZp3oHtFrEzNSqKGVkIViTQY1rH3TOobeJPSpLnTVXACnCwkPR5XeTvPnK3pZ2Kni8AFMg=="], + + "@opentelemetry/exporter-prometheus": ["@opentelemetry/exporter-prometheus@0.200.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/sdk-metrics": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-ZYdlU9r0USuuYppiDyU2VFRA0kFl855ylnb3N/2aOlXrbA4PMCznen7gmPbetGQu7pz8Jbaf4fwvrDnVdQQXSw=="], + + "@opentelemetry/exporter-trace-otlp-grpc": ["@opentelemetry/exporter-trace-otlp-grpc@0.200.0", "", { "dependencies": { "@grpc/grpc-js": "^1.7.1", "@opentelemetry/core": "2.0.0", "@opentelemetry/otlp-exporter-base": "0.200.0", "@opentelemetry/otlp-grpc-exporter-base": "0.200.0", "@opentelemetry/otlp-transformer": "0.200.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/sdk-trace-base": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-hmeZrUkFl1YMsgukSuHCFPYeF9df0hHoKeHUthRKFCxiURs+GwF1VuabuHmBMZnjTbsuvNjOB+JSs37Csem/5Q=="], + + "@opentelemetry/exporter-trace-otlp-http": ["@opentelemetry/exporter-trace-otlp-http@0.200.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/otlp-exporter-base": "0.200.0", "@opentelemetry/otlp-transformer": "0.200.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/sdk-trace-base": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-Goi//m/7ZHeUedxTGVmEzH19NgqJY+Bzr6zXo1Rni1+hwqaksEyJ44gdlEMREu6dzX1DlAaH/qSykSVzdrdafA=="], + + "@opentelemetry/exporter-trace-otlp-proto": ["@opentelemetry/exporter-trace-otlp-proto@0.200.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/otlp-exporter-base": "0.200.0", "@opentelemetry/otlp-transformer": "0.200.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/sdk-trace-base": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-V9TDSD3PjK1OREw2iT9TUTzNYEVWJk4Nhodzhp9eiz4onDMYmPy3LaGbPv81yIR6dUb/hNp/SIhpiCHwFUq2Vg=="], + + "@opentelemetry/exporter-zipkin": ["@opentelemetry/exporter-zipkin@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/sdk-trace-base": "2.0.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-icxaKZ+jZL/NHXX8Aru4HGsrdhK0MLcuRXkX5G5IRmCgoRLw+Br6I/nMVozX2xjGGwV7hw2g+4Slj8K7s4HbVg=="], + + "@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.200.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.200.0", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-pmPlzfJd+vvgaZd/reMsC8RWgTXn2WY1OWT5RT42m3aOn5532TozwXNDhg1vzqJ+jnvmkREcdLr27ebJEQt0Jg=="], + + "@opentelemetry/instrumentation-amqplib": ["@opentelemetry/instrumentation-amqplib@0.47.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-bQboBxolOVDcD4l5QAwqKYpJVKQ8BW82+8tiD5uheu0hDuYgdmDziSAByc8yKS7xpkJw4AYocVP7JwSpQ1hgjg=="], + + "@opentelemetry/instrumentation-aws-lambda": ["@opentelemetry/instrumentation-aws-lambda@0.51.1", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0", "@types/aws-lambda": "8.10.147" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-DxUihz1ZcJtkCKFMnsr5IpQtU1TFnz/QhTEkcb95yfVvmdWx97ezbcxE4lGFjvQYMT8q2NsZjor8s8W/jrMU2w=="], + + "@opentelemetry/instrumentation-aws-sdk": ["@opentelemetry/instrumentation-aws-sdk@0.52.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/propagation-utils": "^0.31.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-xMnghwQP/vO9hNNufaHW3SgNprifLPqmssAQ/zjRopbxa6wpBqunWfKYRRoyu89Xlw0X8/hGNoPEh+CIocCryg=="], + + "@opentelemetry/instrumentation-bunyan": ["@opentelemetry/instrumentation-bunyan@0.46.0", "", { "dependencies": { "@opentelemetry/api-logs": "^0.200.0", "@opentelemetry/instrumentation": "^0.200.0", "@types/bunyan": "1.8.11" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-7ERXBAMIVi1rtFG5odsLTLVy6IJZnLLB74fFlPstV7/ZZG04UZ8YFOYVS14jXArcPohY8HFYLbm56dIFCXYI9w=="], + + "@opentelemetry/instrumentation-cassandra-driver": ["@opentelemetry/instrumentation-cassandra-driver@0.46.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-ItT2C32afignjHQosleI/iBjzlHhF+F7tJIK9ty47/CceVNlA9oK39ss9f7o9jmnKvQfhNWffvkXdjc0afwnSQ=="], + + "@opentelemetry/instrumentation-connect": ["@opentelemetry/instrumentation-connect@0.44.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0", "@types/connect": "3.4.38" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-eChFPViU/nkHsCYSp2PCnHnxt/ZmI/N5reHcwmjXbKhEj6TRNJcjLpI+OQksP8lLu0CS9DlDosHEhknCsxLdjQ=="], + + "@opentelemetry/instrumentation-cucumber": ["@opentelemetry/instrumentation-cucumber@0.15.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-MOHDzttn5TSBqt4j3/XjBhYNH0iLQP7oX2pumIzXP7dJFTcUtaq6PVakKPtIaqBTTabOKqCJhrF240XGwWefPQ=="], + + "@opentelemetry/instrumentation-dataloader": ["@opentelemetry/instrumentation-dataloader@0.17.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-JqovxOo7a65+3A/W+eiqUv7DrDsSvsY0NemHJ4uyVrzD4bpDYofVRdnz/ehYcNerlxVIKU+HcybDmiaoj41DPw=="], + + "@opentelemetry/instrumentation-dns": ["@opentelemetry/instrumentation-dns@0.44.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-+tAFXkFPldOpIba2akqKQ1ukqHET1pZ4pqhrr5x0p+RJ+1a1pPmTt1vCyvSSr634WOY8qMSmzZps++16yxnMbA=="], + + "@opentelemetry/instrumentation-express": ["@opentelemetry/instrumentation-express@0.49.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-j1hbIZzbu7jLQfI/Hz0wHDaniiSWdC3B8/UdH0CEd4lcO8y0pQlz4UTReBaL1BzbkwUhbg6oHuK+m8DXklQPtA=="], + + "@opentelemetry/instrumentation-fastify": ["@opentelemetry/instrumentation-fastify@0.45.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-m94anTFZ6jpvK0G5fXIiq1sB0gCgY2rAL7Cg7svuOh9Roya2RIQz2E5KfCsO1kWCmnHNeTo7wIofoGN7WLPvsA=="], + + "@opentelemetry/instrumentation-fs": ["@opentelemetry/instrumentation-fs@0.20.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.200.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-30l45ovjwHb16ImCGVjKCvw5U7X1zKuYY26ii5S+goV8BZ4a/TCpBf2kQxteQjWD05Gl3fzPMZI5aScfPI6Rjw=="], + + "@opentelemetry/instrumentation-generic-pool": ["@opentelemetry/instrumentation-generic-pool@0.44.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-bY7locZDqmQLEtY2fIJbSnAbHilxfhflaEQHjevFGkaiXc9UMtOvITOy5JKHhYQISpgrvY2WGXKG7YlVyI7uMg=="], + + "@opentelemetry/instrumentation-graphql": ["@opentelemetry/instrumentation-graphql@0.48.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-w1sbf9F9bQTpIWGnKWhH1A+9N9rKxS4eM+AzczgMWp272ZM9lQv4zLTrH5NRST2ltY3nmZ72wkfFrSR0rECi0g=="], + + "@opentelemetry/instrumentation-grpc": ["@opentelemetry/instrumentation-grpc@0.200.0", "", { "dependencies": { "@opentelemetry/instrumentation": "0.200.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-iaPHlO1qb1WlGUq0oTx0rJND/BtBeTAtyEfflu2VwKDe8XZeia7UEOfiSQxnGqVSTwW5F0P1S5UzqeDJotreWQ=="], + + "@opentelemetry/instrumentation-hapi": ["@opentelemetry/instrumentation-hapi@0.46.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-573y+ZxywEcq+3+Z3KqcbV45lrVwUKvQiP9OhABVFNX8wHbtM6DPRBmYfqiUkSbIBcOEihm5qH6Gs73Xq0RBEA=="], + + "@opentelemetry/instrumentation-http": ["@opentelemetry/instrumentation-http@0.200.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/instrumentation": "0.200.0", "@opentelemetry/semantic-conventions": "^1.29.0", "forwarded-parse": "2.1.2" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-9tqGbCJikhYU68y3k9mi6yWsMyMeCcwoQuHvIXan5VvvPPQ5WIZaV6Mxu/MCVe4swRNoFs8Th+qyj0TZV5ELvw=="], + + "@opentelemetry/instrumentation-ioredis": ["@opentelemetry/instrumentation-ioredis@0.48.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/redis-common": "^0.37.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-kQhdrn/CAfJIObqbyyGtagWNxPvglJ9FwnWmsfXKodaGskJv/nyvdC9yIcgwzjbkG1pokVUROrvJ0mizqm29Tg=="], + + "@opentelemetry/instrumentation-kafkajs": ["@opentelemetry/instrumentation-kafkajs@0.9.2", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.30.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-aRnrLK3gQv6LP64oiXEDdRVwxNe7AvS98SCtNWEGhHy4nv3CdxpN7b7NU53g3PCF7uPQZ1fVW2C6Xc2tt1SIkg=="], + + "@opentelemetry/instrumentation-knex": ["@opentelemetry/instrumentation-knex@0.45.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-2kkyTDUzK/3G3jxTc+NqHSdgi1Mjw2irZ98T/cSyNdlbsnDOMSTHjbm0AxJCV4QYQ4cKW7a8W/BBgxDGlu+mXQ=="], + + "@opentelemetry/instrumentation-koa": ["@opentelemetry/instrumentation-koa@0.48.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-LV63v3pxFpjKC0IJO+y5nsGdcH+9Y8Wnn0fhu673XZ5auxqJk2t4nIHuSmls08oRKaX+5q1e+h70XmP/45NJsw=="], + + "@opentelemetry/instrumentation-lru-memoizer": ["@opentelemetry/instrumentation-lru-memoizer@0.45.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-W2MNx7hPtvSIgEFxFrqdBykdfN0UrShCbJxvMU9fwgqbOdxIrcubPt0i1vmy3Ap6QwSi+HmsRNQD2w3ucbLG3A=="], + + "@opentelemetry/instrumentation-memcached": ["@opentelemetry/instrumentation-memcached@0.44.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0", "@types/memcached": "^2.2.6" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-1zABdJlF9Tk0yUv2ELpF6Mk2kw81k+bnB3Sw+D/ssRDcGGCnCNbz+fKJE8dwAPkDP+OcTmiKm6ySREbcyRFzCg=="], + + "@opentelemetry/instrumentation-mongodb": ["@opentelemetry/instrumentation-mongodb@0.53.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-zS2gQJQuG7RZw5yaNG/TnxsOtv1fFkn3ypuDrVLJtJLZtcOr4GYn31jbIA8od+QW/ChZLVcH364iDs+z/xS9wA=="], + + "@opentelemetry/instrumentation-mongoose": ["@opentelemetry/instrumentation-mongoose@0.47.1", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-0OcL5YpZX9PtF55Oi1RtWUdjElJscR9u6NzAdww81EQc3wFfQWmdREUEBeWaDH5jpiomdFp6zDXms622ofEOjg=="], + + "@opentelemetry/instrumentation-mysql": ["@opentelemetry/instrumentation-mysql@0.46.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0", "@types/mysql": "2.15.26" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-Z1NDAv07suIukgL7kxk9cAQX1t/smRMLNOU+q5Aqnhnf/0FIF/N4cX2wg+25IWy0m2PoaPbAVYCKB0aOt5vzAw=="], + + "@opentelemetry/instrumentation-mysql2": ["@opentelemetry/instrumentation-mysql2@0.46.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0", "@opentelemetry/sql-common": "^0.41.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-JsmIA+aTfHqy2tahjnVWChRipYpYrTy+XFAuUPia9CTaspCx8ZrirPUqYnbnaPEtnzYff2a4LX0B2LT1hKlOiA=="], + + "@opentelemetry/instrumentation-nestjs-core": ["@opentelemetry/instrumentation-nestjs-core@0.46.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.30.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-5cYnBIMZuTSLFUt0pMH+NQNdI5/2YeCVuz29Mo2lkudbBUOvzGmzl/Y6LG1JEw2j6zuJx5IgO5CKNrJqAIzTWA=="], + + "@opentelemetry/instrumentation-net": ["@opentelemetry/instrumentation-net@0.44.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-SmAbOKTi0lgdTN9XMXOaf+4jw670MpiK3pw9/to/kRlTvNWwWA4RD34trCcoL7Gf2IYoXuj56Oo4Z5C7N98ukw=="], + + "@opentelemetry/instrumentation-pg": ["@opentelemetry/instrumentation-pg@0.52.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0", "@opentelemetry/sql-common": "^0.41.0", "@types/pg": "8.6.1", "@types/pg-pool": "2.0.6" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-OBpqlxTqmFkZGHaHV4Pzd95HkyKVS+vf0N5wVX3BSb8uqsvOrW62I1qt+2jNsZ13dtG5eOzvcsQTMGND76wizA=="], + + "@opentelemetry/instrumentation-pino": ["@opentelemetry/instrumentation-pino@0.47.0", "", { "dependencies": { "@opentelemetry/api-logs": "^0.200.0", "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.200.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-OFOy/TGtGXMYWrF4xPKhLN1evdqUpbuoKODzeh3GSjFkcooZZf4m/Hpzu12FV+s0wDBf43oAjXbNJWeCJQMrug=="], + + "@opentelemetry/instrumentation-redis": ["@opentelemetry/instrumentation-redis@0.47.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/redis-common": "^0.37.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-T2YvuX/LaJEQKgKvIQJlbSMSzxp6oBm+9PMgfn7QcBXzSY9tyeyDF6QjLAKNvxs+BJeQzFmDlahjoEyatzxRWA=="], + + "@opentelemetry/instrumentation-redis-4": ["@opentelemetry/instrumentation-redis-4@0.47.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/redis-common": "^0.37.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-9LywJGp1fmmLj6g1+Rv91pVE3ATle1C/qIya9ZLwPywXTOdFIARI/gvvvlI7uFABoLojj2dSaI/5JQrq4C1HSg=="], + + "@opentelemetry/instrumentation-restify": ["@opentelemetry/instrumentation-restify@0.46.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-du1FjKsTGQH6q8QjG0Bxlg0L79Co/Ey0btKKb2sg7fvg0YX6LKdR2N1fzfne/A9k+WjQ5v28JuUXOk2cEPYU/Q=="], + + "@opentelemetry/instrumentation-router": ["@opentelemetry/instrumentation-router@0.45.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-CGEeT73Wy/nLQw+obG/mBCIgMbZQKrGG6hzbEdtQ4G2jqI97w7pLWdM4DvkpWVBNcxMpO13dX1nn2OiyZXND3Q=="], + + "@opentelemetry/instrumentation-runtime-node": ["@opentelemetry/instrumentation-runtime-node@0.14.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-y78dGoFMKwHSz0SD113Gt1dFTcfunpPZXIJh2SzJN27Lyb9FIzuMfjc3Iu3+s/N6qNOLuS9mKnPe3/qVGG4Waw=="], + + "@opentelemetry/instrumentation-socket.io": ["@opentelemetry/instrumentation-socket.io@0.47.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-qAc+XCcRmZYjs8KJIPv+MMR2wPPPOppwoarzKRR4G+yvOBs1xMwbbkqNHifKga0XcfFX4KVr7Z5QQ6ZZzWyLtg=="], + + "@opentelemetry/instrumentation-tedious": ["@opentelemetry/instrumentation-tedious@0.19.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/semantic-conventions": "^1.27.0", "@types/tedious": "^4.0.14" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-hNC/Bz+g4RvwaKsbA1VD+9x8X2Ml+fN2uba4dniIdQIrAItLdet4xx/7TEoWYtyVJQozphvpnIsUp52Rw4djCA=="], + + "@opentelemetry/instrumentation-undici": ["@opentelemetry/instrumentation-undici@0.11.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.200.0" }, "peerDependencies": { "@opentelemetry/api": "^1.7.0" } }, "sha512-H6ijJnKVZBB0Lhm6NsaBt0rUz+i52LriLhrpGAE8SazB0jCIVY4MrL2dNib/4w8zA+Fw9zFwERJvKXUIbSD1ew=="], + + "@opentelemetry/instrumentation-winston": ["@opentelemetry/instrumentation-winston@0.45.0", "", { "dependencies": { "@opentelemetry/api-logs": "^0.200.0", "@opentelemetry/instrumentation": "^0.200.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-LZz3/6QvzoneSqD/xnB8wq/g1fy8oe2PwfZ15zS2YA5mnjuSqlqgl+k3sib7wfIYHMP1D3ajfbDB6UOJBALj/w=="], + + "@opentelemetry/otlp-exporter-base": ["@opentelemetry/otlp-exporter-base@0.200.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/otlp-transformer": "0.200.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-IxJgA3FD7q4V6gGq4bnmQM5nTIyMDkoGFGrBrrDjB6onEiq1pafma55V+bHvGYLWvcqbBbRfezr1GED88lacEQ=="], + + "@opentelemetry/otlp-grpc-exporter-base": ["@opentelemetry/otlp-grpc-exporter-base@0.200.0", "", { "dependencies": { "@grpc/grpc-js": "^1.7.1", "@opentelemetry/core": "2.0.0", "@opentelemetry/otlp-exporter-base": "0.200.0", "@opentelemetry/otlp-transformer": "0.200.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-CK2S+bFgOZ66Bsu5hlDeOX6cvW5FVtVjFFbWuaJP0ELxJKBB6HlbLZQ2phqz/uLj1cWap5xJr/PsR3iGoB7Vqw=="], + + "@opentelemetry/otlp-transformer": ["@opentelemetry/otlp-transformer@0.200.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.200.0", "@opentelemetry/core": "2.0.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/sdk-logs": "0.200.0", "@opentelemetry/sdk-metrics": "2.0.0", "@opentelemetry/sdk-trace-base": "2.0.0", "protobufjs": "^7.3.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-+9YDZbYybOnv7sWzebWOeK6gKyt2XE7iarSyBFkwwnP559pEevKOUD8NyDHhRjCSp13ybh9iVXlMfcj/DwF/yw=="], + + "@opentelemetry/propagation-utils": ["@opentelemetry/propagation-utils@0.31.2", "", { "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-FlJzdZ0cQY8qqOsJ/A+L/t05LvZtnsMq6vbamunVMYRi9TAy+xq37t+nT/dx3dKJ/2k409jDj9eA0Yhj9RtTug=="], + + "@opentelemetry/propagator-b3": ["@opentelemetry/propagator-b3@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-blx9S2EI49Ycuw6VZq+bkpaIoiJFhsDuvFGhBIoH3vJ5oYjJ2U0s3fAM5jYft99xVIAv6HqoPtlP9gpVA2IZtA=="], + + "@opentelemetry/propagator-jaeger": ["@opentelemetry/propagator-jaeger@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-Mbm/LSFyAtQKP0AQah4AfGgsD+vsZcyreZoQ5okFBk33hU7AquU4TltgyL9dvaO8/Zkoud8/0gEvwfOZ5d7EPA=="], + + "@opentelemetry/redis-common": ["@opentelemetry/redis-common@0.37.0", "", {}, "sha512-tJwgE6jt32bLs/9J6jhQRKU2EZnsD8qaO13aoFyXwF6s4LhpT7YFHf3Z03MqdILk6BA2BFUhoyh7k9fj9i032A=="], + + "@opentelemetry/resource-detector-alibaba-cloud": ["@opentelemetry/resource-detector-alibaba-cloud@0.31.2", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/resources": "^2.0.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-Itp6duMXkAIQzmDHIf1kc6Llj/fa0BxilaELp0K6Fp9y+b0ex9LksNAQfTDFPHNine7tFoXauvvHbJFXIB6mqw=="], + + "@opentelemetry/resource-detector-aws": ["@opentelemetry/resource-detector-aws@2.2.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/resources": "^2.0.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-6k7//RWAv4U1PeZhv0Too0Sv7sp7/A6s6g9h5ZYauPcroh2t4gOmkQSspSLYCynn34YZwn3FGbuaMwTDjHEJig=="], + + "@opentelemetry/resource-detector-azure": ["@opentelemetry/resource-detector-azure@0.7.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/resources": "^2.0.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-aR2ALsK+b/+5lLDhK9KTK8rcuKg7+sqa/Cg+QCeasqoy7qby70FRtAbQcZGljJ5BLBcVPYjl1hcTYIUyL3Laww=="], + + "@opentelemetry/resource-detector-container": ["@opentelemetry/resource-detector-container@0.7.2", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/resources": "^2.0.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-St3Krrbpvq7k0UoUNlm7Z4Xqf9HdS9R5yPslwl/WPaZpj/Bf/54WZTPmNQat+93Ey6PTX0ISKg26DfcjPemUhg=="], + + "@opentelemetry/resource-detector-gcp": ["@opentelemetry/resource-detector-gcp@0.34.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/resources": "^2.0.0", "@opentelemetry/semantic-conventions": "^1.27.0", "gcp-metadata": "^6.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-Mug9Oing1nVQE8pYT33UKuPSEa/wjQTMk3feS9F84h4U7oZIx5Mz3yddj3OHOPgrW/7d1Ve/mG7jmYqBI9tpTg=="], + + "@opentelemetry/resources": ["@opentelemetry/resources@2.0.1", "", { "dependencies": { "@opentelemetry/core": "2.0.1", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw=="], + + "@opentelemetry/sdk-logs": ["@opentelemetry/sdk-logs@0.200.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.200.0", "@opentelemetry/core": "2.0.0", "@opentelemetry/resources": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.4.0 <1.10.0" } }, "sha512-VZG870063NLfObmQQNtCVcdXXLzI3vOjjrRENmU37HYiPFa0ZXpXVDsTD02Nh3AT3xYJzQaWKl2X2lQ2l7TWJA=="], + + "@opentelemetry/sdk-metrics": ["@opentelemetry/sdk-metrics@2.0.1", "", { "dependencies": { "@opentelemetry/core": "2.0.1", "@opentelemetry/resources": "2.0.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, "sha512-wf8OaJoSnujMAHWR3g+/hGvNcsC16rf9s1So4JlMiFaFHiE4HpIA3oUh+uWZQ7CNuK8gVW/pQSkgoa5HkkOl0g=="], + + "@opentelemetry/sdk-node": ["@opentelemetry/sdk-node@0.200.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.200.0", "@opentelemetry/core": "2.0.0", "@opentelemetry/exporter-logs-otlp-grpc": "0.200.0", "@opentelemetry/exporter-logs-otlp-http": "0.200.0", "@opentelemetry/exporter-logs-otlp-proto": "0.200.0", "@opentelemetry/exporter-metrics-otlp-grpc": "0.200.0", "@opentelemetry/exporter-metrics-otlp-http": "0.200.0", "@opentelemetry/exporter-metrics-otlp-proto": "0.200.0", "@opentelemetry/exporter-prometheus": "0.200.0", "@opentelemetry/exporter-trace-otlp-grpc": "0.200.0", "@opentelemetry/exporter-trace-otlp-http": "0.200.0", "@opentelemetry/exporter-trace-otlp-proto": "0.200.0", "@opentelemetry/exporter-zipkin": "2.0.0", "@opentelemetry/instrumentation": "0.200.0", "@opentelemetry/propagator-b3": "2.0.0", "@opentelemetry/propagator-jaeger": "2.0.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/sdk-logs": "0.200.0", "@opentelemetry/sdk-metrics": "2.0.0", "@opentelemetry/sdk-trace-base": "2.0.0", "@opentelemetry/sdk-trace-node": "2.0.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-S/YSy9GIswnhYoDor1RusNkmRughipvTCOQrlF1dzI70yQaf68qgf5WMnzUxdlCl3/et/pvaO75xfPfuEmCK5A=="], + + "@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-qQnYdX+ZCkonM7tA5iU4fSRsVxbFGml8jbxOgipRGMFHKaXKHQ30js03rTobYjKjIfnOsZSbHKWF0/0v0OQGfw=="], + + "@opentelemetry/sdk-trace-node": ["@opentelemetry/sdk-trace-node@2.0.0", "", { "dependencies": { "@opentelemetry/context-async-hooks": "2.0.0", "@opentelemetry/core": "2.0.0", "@opentelemetry/sdk-trace-base": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-omdilCZozUjQwY3uZRBwbaRMJ3p09l4t187Lsdf0dGMye9WKD4NGcpgZRvqhI1dwcH6og+YXQEtoO9Wx3ykilg=="], + + "@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.34.0", "", {}, "sha512-aKcOkyrorBGlajjRdVoJWHTxfxO1vCNHLJVlSDaRHDIdjU+pX8IYQPvPDkYiujKLbRnWU+1TBwEt0QRgSm4SGA=="], + + "@opentelemetry/sql-common": ["@opentelemetry/sql-common@0.41.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0" } }, "sha512-pmzXctVbEERbqSfiAgdes9Y63xjoOyXcD7B6IXBkVb+vbM7M9U98mn33nGXxPf4dfYR0M+vhcKRZmbSJ7HfqFA=="], + + "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], + + "@pkl-community/pkl": ["@pkl-community/pkl@0.28.2", "", { "optionalDependencies": { "@pkl-community/pkl-darwin-arm64": "0.28.2", "@pkl-community/pkl-darwin-x64": "0.28.2", "@pkl-community/pkl-linux-arm64": "0.28.2", "@pkl-community/pkl-linux-x64": "0.28.2" }, "bin": { "pkl": "lib/main.js" } }, "sha512-seSZrwGvDEd1BeT9+dRRnqvyNit8vpFL2I+YBEJ+t3pBYpnpHaVHwQNPlMLvDQ0KZUCQkiWGZnbCMF9WtaxHNA=="], + + "@pkl-community/pkl-darwin-arm64": ["@pkl-community/pkl-darwin-arm64@0.28.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-1CP5VayKnZeL1BUTaQUltiBu5wbn/pNizP3aSK1zbWMHDGK/S/rIs1X0GWEyOHWG7P/h9EBsNzHmJqg4kCn5jw=="], + + "@pkl-community/pkl-darwin-x64": ["@pkl-community/pkl-darwin-x64@0.28.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-gGV3S9Hnyclga3/8wvspXWxKKEPMJrWzgeafIPpFPDa49DDlPCrf4zNkN0T29yylWd4aLwMUGRE15vswkjhdjA=="], + + "@pkl-community/pkl-linux-arm64": ["@pkl-community/pkl-linux-arm64@0.28.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-IGJDm0maESl7Q+x2XukC7ia39m7Z++/C92cknrvTtyNdEROufGDobUv96ekq4e1gdcEgDvvDqCXLEQNC871Trg=="], + + "@pkl-community/pkl-linux-x64": ["@pkl-community/pkl-linux-x64@0.28.2", "", { "os": "linux", "cpu": "x64" }, "sha512-9MndyTuiRhBRdrDqgcNadi6mT8mCNcLChwh28D5t5EDko8maUDTKHwHeuIzdBI5P0ZLNYPnT4McPufkeBu67vQ=="], + + "@polka/url": ["@polka/url@1.0.0-next.29", "", {}, "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww=="], + + "@protobufjs/aspromise": ["@protobufjs/aspromise@1.1.2", "", {}, "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="], + + "@protobufjs/base64": ["@protobufjs/base64@1.1.2", "", {}, "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="], + + "@protobufjs/codegen": ["@protobufjs/codegen@2.0.4", "", {}, "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="], + + "@protobufjs/eventemitter": ["@protobufjs/eventemitter@1.1.0", "", {}, "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="], + + "@protobufjs/fetch": ["@protobufjs/fetch@1.1.0", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.1", "@protobufjs/inquire": "^1.1.0" } }, "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ=="], + + "@protobufjs/float": ["@protobufjs/float@1.0.2", "", {}, "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="], + + "@protobufjs/inquire": ["@protobufjs/inquire@1.1.0", "", {}, "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="], + + "@protobufjs/path": ["@protobufjs/path@1.1.2", "", {}, "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="], + + "@protobufjs/pool": ["@protobufjs/pool@1.1.0", "", {}, "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="], + + "@protobufjs/utf8": ["@protobufjs/utf8@1.1.0", "", {}, "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="], + + "@pyroscope/nodejs": ["@pyroscope/nodejs@0.4.5", "", { "dependencies": { "@datadog/pprof": "^5.4.1", "debug": "^4.3.3", "p-limit": "^3.1.0", "regenerator-runtime": "^0.13.11", "source-map": "^0.7.3" } }, "sha512-39YVwmLA2QhmLEd/yZjkjvAdU16kH0CiH6KY4wd1O4Lz7CszLW3/q2b33RAegdpnFmu8pPMhDcrPl/79mkjI0g=="], + + "@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg=="], + + "@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.0", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w=="], + + "@react-email/render": ["@react-email/render@1.1.2", "", { "dependencies": { "html-to-text": "^9.0.5", "prettier": "^3.5.3", "react-promise-suspense": "^0.3.4" }, "peerDependencies": { "react": "^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-RnRehYN3v9gVlNMehHPHhyp2RQo7+pSkHDtXPvg3s0GbzM9SQMW4Qrf8GRNvtpLC4gsI+Wt0VatNRUFqjvevbw=="], + + "@react-native-async-storage/async-storage": ["@react-native-async-storage/async-storage@2.2.0", "", { "dependencies": { "merge-options": "^3.0.4" }, "peerDependencies": { "react-native": "^0.0.0-0 || >=0.65 <1.0" } }, "sha512-gvRvjR5JAaUZF8tv2Kcq/Gbt3JHwbKFYfmb445rhOj6NUMx3qPLixmDx5pZAyb9at1bYvJ4/eTUipU5aki45xw=="], + + "@react-native-community/datetimepicker": ["@react-native-community/datetimepicker@8.4.1", "", { "dependencies": { "invariant": "^2.2.4" }, "peerDependencies": { "expo": ">=52.0.0", "react": "*", "react-native": "*", "react-native-windows": "*" }, "optionalPeers": ["expo", "react-native-windows"] }, "sha512-DrK+CUS5fZnz8dhzBezirkzQTcNDdaXer3oDLh0z4nc2tbdIdnzwvXCvi8IEOIvleoc9L95xS5tKUl0/Xv71Mg=="], + + "@react-native-community/slider": ["@react-native-community/slider@4.5.7", "", {}, "sha512-WMDDZjNF2Bd8M8TrSqKf5xhM9ikdfCHtSPur64Ow3bB/OVrKufUQZ59NmYdNZNeGPvcHHTsafuYTY8zfZfbchQ=="], + + "@react-native-menu/menu": ["@react-native-menu/menu@1.2.3", "", { "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-sEfiVIivsa0lSelFm9Wbm/RAi+XoEHc75GGhjwvSrj9KSCVvNNXwr9F8l42e1t/lzYvVYzmkYxLG6VKxrDYJiw=="], + + "@react-native/assets-registry": ["@react-native/assets-registry@0.79.2", "", {}, "sha512-5h2Z7/+/HL/0h88s0JHOdRCW4CXMCJoROxqzHqxdrjGL6EBD1DdaB4ZqkCOEVSW4Vjhir5Qb97C8i/MPWEYPtg=="], + + "@react-native/babel-plugin-codegen": ["@react-native/babel-plugin-codegen@0.79.3", "", { "dependencies": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.79.3" } }, "sha512-Zb8F4bSEKKZfms5n1MQ0o5mudDcpAINkKiFuFTU0PErYGjY3kZ+JeIP+gS6KCXsckxCfMEKQwqKicP/4DWgsZQ=="], + + "@react-native/babel-preset": ["@react-native/babel-preset@0.79.3", "", { "dependencies": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-default-from": "^7.24.7", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-transform-arrow-functions": "^7.24.7", "@babel/plugin-transform-async-generator-functions": "^7.25.4", "@babel/plugin-transform-async-to-generator": "^7.24.7", "@babel/plugin-transform-block-scoping": "^7.25.0", "@babel/plugin-transform-class-properties": "^7.25.4", "@babel/plugin-transform-classes": "^7.25.4", "@babel/plugin-transform-computed-properties": "^7.24.7", "@babel/plugin-transform-destructuring": "^7.24.8", "@babel/plugin-transform-flow-strip-types": "^7.25.2", "@babel/plugin-transform-for-of": "^7.24.7", "@babel/plugin-transform-function-name": "^7.25.1", "@babel/plugin-transform-literals": "^7.25.2", "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", "@babel/plugin-transform-modules-commonjs": "^7.24.8", "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", "@babel/plugin-transform-numeric-separator": "^7.24.7", "@babel/plugin-transform-object-rest-spread": "^7.24.7", "@babel/plugin-transform-optional-catch-binding": "^7.24.7", "@babel/plugin-transform-optional-chaining": "^7.24.8", "@babel/plugin-transform-parameters": "^7.24.7", "@babel/plugin-transform-private-methods": "^7.24.7", "@babel/plugin-transform-private-property-in-object": "^7.24.7", "@babel/plugin-transform-react-display-name": "^7.24.7", "@babel/plugin-transform-react-jsx": "^7.25.2", "@babel/plugin-transform-react-jsx-self": "^7.24.7", "@babel/plugin-transform-react-jsx-source": "^7.24.7", "@babel/plugin-transform-regenerator": "^7.24.7", "@babel/plugin-transform-runtime": "^7.24.7", "@babel/plugin-transform-shorthand-properties": "^7.24.7", "@babel/plugin-transform-spread": "^7.24.7", "@babel/plugin-transform-sticky-regex": "^7.24.7", "@babel/plugin-transform-typescript": "^7.25.2", "@babel/plugin-transform-unicode-regex": "^7.24.7", "@babel/template": "^7.25.0", "@react-native/babel-plugin-codegen": "0.79.3", "babel-plugin-syntax-hermes-parser": "0.25.1", "babel-plugin-transform-flow-enums": "^0.0.2", "react-refresh": "^0.14.0" } }, "sha512-VHGNP02bDD2Ul1my0pLVwe/0dsEBHxR343ySpgnkCNEEm9C1ANQIL2wvnJrHZPcqfAkWfFQ8Ln3t+6fdm4A/Dg=="], + + "@react-native/codegen": ["@react-native/codegen@0.79.2", "", { "dependencies": { "glob": "^7.1.1", "hermes-parser": "0.25.1", "invariant": "^2.2.4", "nullthrows": "^1.1.1", "yargs": "^17.6.2" }, "peerDependencies": { "@babel/core": "*" } }, "sha512-8JTlGLuLi1p8Jx2N/enwwEd7/2CfrqJpv90Cp77QLRX3VHF2hdyavRIxAmXMwN95k+Me7CUuPtqn2X3IBXOWYg=="], + + "@react-native/community-cli-plugin": ["@react-native/community-cli-plugin@0.79.2", "", { "dependencies": { "@react-native/dev-middleware": "0.79.2", "chalk": "^4.0.0", "debug": "^2.2.0", "invariant": "^2.2.4", "metro": "^0.82.0", "metro-config": "^0.82.0", "metro-core": "^0.82.0", "semver": "^7.1.3" }, "peerDependencies": { "@react-native-community/cli": "*" }, "optionalPeers": ["@react-native-community/cli"] }, "sha512-E+YEY2dL+68HyR2iahsZdyBKBUi9QyPyaN9vsnda1jNgCjNpSPk2yAF5cXsho+zKK5ZQna3JSeE1Kbi2IfGJbw=="], + + "@react-native/debugger-frontend": ["@react-native/debugger-frontend@0.79.3", "", {}, "sha512-ImNDuEeKH6lEsLXms3ZsgIrNF94jymfuhPcVY5L0trzaYNo9ZFE9Ni2/18E1IbfXxdeIHrCSBJlWD6CTm7wu5A=="], + + "@react-native/dev-middleware": ["@react-native/dev-middleware@0.79.3", "", { "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.79.3", "chrome-launcher": "^0.15.2", "chromium-edge-launcher": "^0.2.0", "connect": "^3.6.5", "debug": "^2.2.0", "invariant": "^2.2.4", "nullthrows": "^1.1.1", "open": "^7.0.3", "serve-static": "^1.16.2", "ws": "^6.2.3" } }, "sha512-x88+RGOyG71+idQefnQg7wLhzjn/Scs+re1O5vqCkTVzRAc/f7SdHMlbmECUxJPd08FqMcOJr7/X3nsJBrNuuw=="], + + "@react-native/gradle-plugin": ["@react-native/gradle-plugin@0.79.2", "", {}, "sha512-6MJFemrwR0bOT0QM+2BxX9k3/pvZQNmJ3Js5pF/6owsA0cUDiCO57otiEU8Fz+UywWEzn1FoQfOfQ8vt2GYmoA=="], + + "@react-native/js-polyfills": ["@react-native/js-polyfills@0.79.2", "", {}, "sha512-IaY87Ckd4GTPMkO1/Fe8fC1IgIx3vc3q9Tyt/6qS3Mtk9nC0x9q4kSR5t+HHq0/MuvGtu8HpdxXGy5wLaM+zUw=="], + + "@react-native/normalize-colors": ["@react-native/normalize-colors@0.79.3", "", {}, "sha512-T75NIQPRFCj6DFMxtcVMJTZR+3vHXaUMSd15t+CkJpc5LnyX91GVaPxpRSAdjFh7m3Yppl5MpdjV/fntImheYQ=="], + + "@react-native/virtualized-lists": ["@react-native/virtualized-lists@0.79.2", "", { "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" }, "peerDependencies": { "@types/react": "^19.0.0", "react": "*", "react-native": "*" }, "optionalPeers": ["@types/react"] }, "sha512-9G6ROJeP+rdw9Bvr5ruOlag11ET7j1z/En1riFFNo6W3xZvJY+alCuH1ttm12y9+zBm4n8jwCk4lGhjYaV4dKw=="], + + "@react-navigation/bottom-tabs": ["@react-navigation/bottom-tabs@7.3.15", "", { "dependencies": { "@react-navigation/elements": "^2.4.4", "color": "^4.2.3" }, "peerDependencies": { "@react-navigation/native": "^7.1.11", "react": ">= 18.2.0", "react-native": "*", "react-native-safe-area-context": ">= 4.0.0", "react-native-screens": ">= 4.0.0" } }, "sha512-jKCfawtK3qB9VtKgrQtNfkeafRVmU3ZBL3oht97jkp3ApA2we/I0XZcRakw/1cWRgQjGX8DQ72dyQw7SdOdWAQ=="], + + "@react-navigation/core": ["@react-navigation/core@7.10.1", "", { "dependencies": { "@react-navigation/routers": "^7.4.1", "escape-string-regexp": "^4.0.0", "nanoid": "^3.3.11", "query-string": "^7.1.3", "react-is": "^19.1.0", "use-latest-callback": "^0.2.4", "use-sync-external-store": "^1.5.0" }, "peerDependencies": { "react": ">= 18.2.0" } }, "sha512-6+bdalOqfDzc968s3Xz7VaUpPzMKzVay48dW+C/cd6sga01Iqjp4XAzQ7FNHdT7wgJYdvZaBOAlyvnok0OsFZw=="], + + "@react-navigation/drawer": ["@react-navigation/drawer@7.4.2", "", { "dependencies": { "@react-navigation/elements": "^2.4.4", "color": "^4.2.3", "react-native-drawer-layout": "^4.1.11", "use-latest-callback": "^0.2.4" }, "peerDependencies": { "@react-navigation/native": "^7.1.11", "react": ">= 18.2.0", "react-native": "*", "react-native-gesture-handler": ">= 2.0.0", "react-native-reanimated": ">= 2.0.0", "react-native-safe-area-context": ">= 4.0.0", "react-native-screens": ">= 4.0.0" } }, "sha512-iS/suh+M8viq8Q2v2k/ykyhK+uk5VLVzOH08ep2HxO/5nd2cm8O2+qiEWbfAJx82X/z4g0crbU8xthvTRodP7g=="], + + "@react-navigation/elements": ["@react-navigation/elements@2.4.4", "", { "dependencies": { "color": "^4.2.3", "use-latest-callback": "^0.2.4" }, "peerDependencies": { "@react-native-masked-view/masked-view": ">= 0.2.0", "@react-navigation/native": "^7.1.11", "react": ">= 18.2.0", "react-native": "*", "react-native-safe-area-context": ">= 4.0.0" }, "optionalPeers": ["@react-native-masked-view/masked-view"] }, "sha512-6OAzrg6mn8s3qv6DZSFHxYRZv/3hUZTtkrq1XNBqLNlVIv89Iv7XKukYbZIxNoUss8r+RLJea0aNAOq5jbBkfw=="], + + "@react-navigation/native": ["@react-navigation/native@7.1.11", "", { "dependencies": { "@react-navigation/core": "^7.10.1", "escape-string-regexp": "^4.0.0", "fast-deep-equal": "^3.1.3", "nanoid": "^3.3.11", "use-latest-callback": "^0.2.4" }, "peerDependencies": { "react": ">= 18.2.0", "react-native": "*" } }, "sha512-f/UETxy2Nahr8jko9mSSRBvIaDubGc3M2yx5pWxMPxZgLkB4TqPB0O1OFdbcAuRDwLgzXXK+Joh7nTdGug9v2A=="], + + "@react-navigation/native-stack": ["@react-navigation/native-stack@7.3.16", "", { "dependencies": { "@react-navigation/elements": "^2.4.4", "warn-once": "^0.1.1" }, "peerDependencies": { "@react-navigation/native": "^7.1.11", "react": ">= 18.2.0", "react-native": "*", "react-native-safe-area-context": ">= 4.0.0", "react-native-screens": ">= 4.0.0" } }, "sha512-tK29buswgQtHE/8+HMeYfsio/t6Y0Yk+YlEBckaYvNbxOrCwQ/s2FrM4dyV3dHkSefT6eEae3NKSgD0Q2ARMAA=="], + + "@react-navigation/routers": ["@react-navigation/routers@7.4.1", "", { "dependencies": { "nanoid": "^3.3.11" } }, "sha512-42mZrMzQ0LfKxUb5OHIurYrPYyRsXFLolucILrvm21f0O40Sw0Ufh1bnn/jRqnxZZu7wvpUGIGYM8nS9zVE1Aw=="], + + "@redis/bloom": ["@redis/bloom@1.2.0", "", { "peerDependencies": { "@redis/client": "^1.0.0" } }, "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg=="], + + "@redis/client": ["@redis/client@1.6.1", "", { "dependencies": { "cluster-key-slot": "1.1.2", "generic-pool": "3.9.0", "yallist": "4.0.0" } }, "sha512-/KCsg3xSlR+nCK8/8ZYSknYxvXHwubJrU82F3Lm1Fp6789VQ0/3RJKfsmRXjqfaTA++23CvC3hqmqe/2GEt6Kw=="], + + "@redis/graph": ["@redis/graph@1.1.1", "", { "peerDependencies": { "@redis/client": "^1.0.0" } }, "sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw=="], + + "@redis/json": ["@redis/json@1.0.7", "", { "peerDependencies": { "@redis/client": "^1.0.0" } }, "sha512-6UyXfjVaTBTJtKNG4/9Z8PSpKE6XgSyEb8iwaqDcy+uKrd/DGYHTWkUdnQDyzm727V7p21WUMhsqz5oy65kPcQ=="], + + "@redis/search": ["@redis/search@1.2.0", "", { "peerDependencies": { "@redis/client": "^1.0.0" } }, "sha512-tYoDBbtqOVigEDMAcTGsRlMycIIjwMCgD8eR2t0NANeQmgK/lvxNAvYyb6bZDD4frHRhIHkJu2TBRvB0ERkOmw=="], + + "@redis/time-series": ["@redis/time-series@1.1.0", "", { "peerDependencies": { "@redis/client": "^1.0.0" } }, "sha512-c1Q99M5ljsIuc4YdaCwfUEXsofakb9c8+Zse2qxTadu8TalLXuAESzLvFAvNVbkmSlvlzIQOLpBCmWI9wTOt+g=="], + + "@rocksky/cli": ["@rocksky/cli@workspace:apps/cli"], + + "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.11", "", {}, "sha512-L/gAA/hyCSuzTF1ftlzUSI/IKr2POHsv1Dd78GfqkR83KMNuswWD61JxGV2L7nRwBBBSDr6R1gCkdTmoN7W4ag=="], + + "@rollup/plugin-alias": ["@rollup/plugin-alias@5.1.1", "", { "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ=="], + + "@rollup/plugin-commonjs": ["@rollup/plugin-commonjs@28.0.6", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "commondir": "^1.0.1", "estree-walker": "^2.0.2", "fdir": "^6.2.0", "is-reference": "1.2.1", "magic-string": "^0.30.3", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^2.68.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-XSQB1K7FUU5QP+3lOQmVCE3I0FcbbNvmNT4VJSj93iUjayaARrTQeoRdiYQoftAJBLrR9t2agwAd3ekaTgHNlw=="], + + "@rollup/plugin-dynamic-import-vars": ["@rollup/plugin-dynamic-import-vars@2.1.5", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "astring": "^1.8.5", "estree-walker": "^2.0.2", "fast-glob": "^3.2.12", "magic-string": "^0.30.3" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-Mymi24fd9hlRifdZV/jYIFj1dn99F34imiYu3KzlAcgBcRi3i9SucgW/VRo5SQ9K4NuQ7dCep6pFWgNyhRdFHQ=="], + + "@rollup/plugin-inject": ["@rollup/plugin-inject@5.0.5", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "estree-walker": "^2.0.2", "magic-string": "^0.30.3" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg=="], + + "@rollup/plugin-json": ["@rollup/plugin-json@6.1.0", "", { "dependencies": { "@rollup/pluginutils": "^5.1.0" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA=="], + + "@rollup/plugin-node-resolve": ["@rollup/plugin-node-resolve@16.0.1", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "@types/resolve": "1.20.2", "deepmerge": "^4.2.2", "is-module": "^1.0.0", "resolve": "^1.22.1" }, "peerDependencies": { "rollup": "^2.78.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-tk5YCxJWIG81umIvNkSod2qK5KyQW19qcBF/B78n1bjtOON6gzKoVeSzAE8yHCZEDmqkHKkxplExA8KzdJLJpA=="], + + "@rollup/pluginutils": ["@rollup/pluginutils@5.2.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw=="], + + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.43.0", "", { "os": "android", "cpu": "arm" }, "sha512-Krjy9awJl6rKbruhQDgivNbD1WuLb8xAclM4IR4cN5pHGAs2oIMMQJEiC3IC/9TZJ+QZkmZhlMO/6MBGxPidpw=="], + + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.43.0", "", { "os": "android", "cpu": "arm64" }, "sha512-ss4YJwRt5I63454Rpj+mXCXicakdFmKnUNxr1dLK+5rv5FJgAxnN7s31a5VchRYxCFWdmnDWKd0wbAdTr0J5EA=="], + + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.43.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-eKoL8ykZ7zz8MjgBenEF2OoTNFAPFz1/lyJ5UmmFSz5jW+7XbH1+MAgCVHy72aG59rbuQLcJeiMrP8qP5d/N0A=="], + + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.43.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-SYwXJgaBYW33Wi/q4ubN+ldWC4DzQY62S4Ll2dgfr/dbPoF50dlQwEaEHSKrQdSjC6oIe1WgzosoaNoHCdNuMg=="], + + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.43.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-SV+U5sSo0yujrjzBF7/YidieK2iF6E7MdF6EbYxNz94lA+R0wKl3SiixGyG/9Klab6uNBIqsN7j4Y/Fya7wAjQ=="], + + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.43.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-J7uCsiV13L/VOeHJBo5SjasKiGxJ0g+nQTrBkAsmQBIdil3KhPnSE9GnRon4ejX1XDdsmK/l30IYLiAaQEO0Cg=="], + + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.43.0", "", { "os": "linux", "cpu": "arm" }, "sha512-gTJ/JnnjCMc15uwB10TTATBEhK9meBIY+gXP4s0sHD1zHOaIh4Dmy1X9wup18IiY9tTNk5gJc4yx9ctj/fjrIw=="], + + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.43.0", "", { "os": "linux", "cpu": "arm" }, "sha512-ZJ3gZynL1LDSIvRfz0qXtTNs56n5DI2Mq+WACWZ7yGHFUEirHBRt7fyIk0NsCKhmRhn7WAcjgSkSVVxKlPNFFw=="], + + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.43.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-8FnkipasmOOSSlfucGYEu58U8cxEdhziKjPD2FIa0ONVMxvl/hmONtX/7y4vGjdUhjcTHlKlDhw3H9t98fPvyA=="], + + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.43.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-KPPyAdlcIZ6S9C3S2cndXDkV0Bb1OSMsX0Eelr2Bay4EsF9yi9u9uzc9RniK3mcUGCLhWY9oLr6er80P5DE6XA=="], + + "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.43.0", "", { "os": "linux", "cpu": "none" }, "sha512-HPGDIH0/ZzAZjvtlXj6g+KDQ9ZMHfSP553za7o2Odegb/BEfwJcR0Sw0RLNpQ9nC6Gy8s+3mSS9xjZ0n3rhcYg=="], + + "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.43.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-gEmwbOws4U4GLAJDhhtSPWPXUzDfMRedT3hFMyRAvM9Mrnj+dJIFIeL7otsv2WF3D7GrV0GIewW0y28dOYWkmw=="], + + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.43.0", "", { "os": "linux", "cpu": "none" }, "sha512-XXKvo2e+wFtXZF/9xoWohHg+MuRnvO29TI5Hqe9xwN5uN8NKUYy7tXUG3EZAlfchufNCTHNGjEx7uN78KsBo0g=="], + + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.43.0", "", { "os": "linux", "cpu": "none" }, "sha512-ruf3hPWhjw6uDFsOAzmbNIvlXFXlBQ4nk57Sec8E8rUxs/AI4HD6xmiiasOOx/3QxS2f5eQMKTAwk7KHwpzr/Q=="], + + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.43.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-QmNIAqDiEMEvFV15rsSnjoSmO0+eJLoKRD9EAa9rrYNwO/XRCtOGM3A5A0X+wmG+XRrw9Fxdsw+LnyYiZWWcVw=="], + + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.43.0", "", { "os": "linux", "cpu": "x64" }, "sha512-jAHr/S0iiBtFyzjhOkAics/2SrXE092qyqEg96e90L3t9Op8OTzS6+IX0Fy5wCt2+KqeHAkti+eitV0wvblEoQ=="], + + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.43.0", "", { "os": "linux", "cpu": "x64" }, "sha512-3yATWgdeXyuHtBhrLt98w+5fKurdqvs8B53LaoKD7P7H7FKOONLsBVMNl9ghPQZQuYcceV5CDyPfyfGpMWD9mQ=="], + + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.43.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-wVzXp2qDSCOpcBCT5WRWLmpJRIzv23valvcTwMHEobkjippNf+C3ys/+wf07poPkeNix0paTNemB2XrHr2TnGw=="], + + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.43.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-fYCTEyzf8d+7diCw8b+asvWDCLMjsCEA8alvtAutqJOJp/wL5hs1rWSqJ1vkjgW0L2NB4bsYJrpKkiIPRR9dvw=="], + + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.43.0", "", { "os": "win32", "cpu": "x64" }, "sha512-SnGhLiE5rlK0ofq8kzuDkM0g7FN1s5VYY+YSMTibP7CqShxCQvqtNxTARS4xX4PFJfHjG0ZQYX9iGzI3FQh5Aw=="], + + "@rtsao/csstype": ["@rtsao/csstype@2.6.5-forked.0", "", {}, "sha512-0HwnY8uPWcCloTgdbbaJG3MbDUfNf6yKWZfCKxFv9yj2Sbp4mSKaIjC7Cr/5L4hMxvrrk85CU3wlAg7EtBBJ1Q=="], + + "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="], + + "@selderee/plugin-htmlparser2": ["@selderee/plugin-htmlparser2@0.11.0", "", { "dependencies": { "domhandler": "^5.0.3", "selderee": "^0.11.0" } }, "sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ=="], + + "@sentry-internal/browser-utils": ["@sentry-internal/browser-utils@8.54.0", "", { "dependencies": { "@sentry/core": "8.54.0" } }, "sha512-DKWCqb4YQosKn6aD45fhKyzhkdG7N6goGFDeyTaJFREJDFVDXiNDsYZu30nJ6BxMM7uQIaARhPAC5BXfoED3pQ=="], + + "@sentry-internal/feedback": ["@sentry-internal/feedback@8.54.0", "", { "dependencies": { "@sentry/core": "8.54.0" } }, "sha512-nQqRacOXoElpE0L0ADxUUII0I3A94niqG9Z4Fmsw6057QvyrV/LvTiMQBop6r5qLjwMqK+T33iR4/NQI5RhsXQ=="], + + "@sentry-internal/replay": ["@sentry-internal/replay@8.54.0", "", { "dependencies": { "@sentry-internal/browser-utils": "8.54.0", "@sentry/core": "8.54.0" } }, "sha512-8xuBe06IaYIGJec53wUC12tY2q4z2Z0RPS2s1sLtbA00EvK1YDGuXp96IDD+HB9mnDMrQ/jW5f97g9TvPsPQUg=="], + + "@sentry-internal/replay-canvas": ["@sentry-internal/replay-canvas@8.54.0", "", { "dependencies": { "@sentry-internal/replay": "8.54.0", "@sentry/core": "8.54.0" } }, "sha512-K/On3OAUBeq/TV2n+1EvObKC+WMV9npVXpVyJqCCyn8HYMm8FUGzuxeajzm0mlW4wDTPCQor6mK9/IgOquUzCw=="], + + "@sentry/babel-plugin-component-annotate": ["@sentry/babel-plugin-component-annotate@3.5.0", "", {}, "sha512-s2go8w03CDHbF9luFGtBHKJp4cSpsQzNVqgIa9Pfa4wnjipvrK6CxVT4icpLA3YO6kg5u622Yoa5GF3cJdippw=="], + + "@sentry/browser": ["@sentry/browser@8.54.0", "", { "dependencies": { "@sentry-internal/browser-utils": "8.54.0", "@sentry-internal/feedback": "8.54.0", "@sentry-internal/replay": "8.54.0", "@sentry-internal/replay-canvas": "8.54.0", "@sentry/core": "8.54.0" } }, "sha512-BgUtvxFHin0fS0CmJVKTLXXZcke0Av729IVfi+2fJ4COX8HO7/HAP02RKaSQGmL2HmvWYTfNZ7529AnUtrM4Rg=="], + + "@sentry/cli": ["@sentry/cli@2.46.0", "", { "dependencies": { "https-proxy-agent": "^5.0.0", "node-fetch": "^2.6.7", "progress": "^2.0.3", "proxy-from-env": "^1.1.0", "which": "^2.0.2" }, "optionalDependencies": { "@sentry/cli-darwin": "2.46.0", "@sentry/cli-linux-arm": "2.46.0", "@sentry/cli-linux-arm64": "2.46.0", "@sentry/cli-linux-i686": "2.46.0", "@sentry/cli-linux-x64": "2.46.0", "@sentry/cli-win32-arm64": "2.46.0", "@sentry/cli-win32-i686": "2.46.0", "@sentry/cli-win32-x64": "2.46.0" }, "bin": { "sentry-cli": "bin/sentry-cli" } }, "sha512-nqoPl7UCr446QFkylrsRrUXF51x8Z9dGquyf4jaQU+OzbOJMqclnYEvU6iwbwvaw3tu/2DnoZE/Og+Nq1h63sA=="], + + "@sentry/cli-darwin": ["@sentry/cli-darwin@2.46.0", "", { "os": "darwin" }, "sha512-5Ll+e5KAdIk9OYiZO8aifMBRNWmNyPjSqdjaHlBC1Qfh7pE3b1zyzoHlsUazG0bv0sNrSGea8e7kF5wIO1hvyg=="], + + "@sentry/cli-linux-arm": ["@sentry/cli-linux-arm@2.46.0", "", { "os": [ "linux", "android", "freebsd", ], "cpu": "arm" }, "sha512-WRrLNq/TEX/TNJkGqq6Ad0tGyapd5dwlxtsPbVBrIdryuL1mA7VCBoaHBr3kcwJLsgBHFH0lmkMee2ubNZZdkg=="], + + "@sentry/cli-linux-arm64": ["@sentry/cli-linux-arm64@2.46.0", "", { "os": [ "linux", "android", "freebsd", ], "cpu": "arm64" }, "sha512-OEJN8yAjI9y5B4telyqzu27Hi3+S4T8VxZCqJz1+z2Mp0Q/MZ622AahVPpcrVq/5bxrnlZR16+lKh8L1QwNFPg=="], + + "@sentry/cli-linux-i686": ["@sentry/cli-linux-i686@2.46.0", "", { "os": [ "linux", "android", "freebsd", ], "cpu": "ia32" }, "sha512-xko3/BVa4LX8EmRxVOCipV+PwfcK5Xs8lP6lgF+7NeuAHMNL4DqF6iV9rrN8gkGUHCUI9RXSve37uuZnFy55+Q=="], + + "@sentry/cli-linux-x64": ["@sentry/cli-linux-x64@2.46.0", "", { "os": [ "linux", "android", "freebsd", ], "cpu": "x64" }, "sha512-hJ1g5UEboYcOuRia96LxjJ0jhnmk8EWLDvlGnXLnYHkwy3ree/L7sNgdp/QsY8Z4j2PGO5f22Va+UDhSjhzlfQ=="], + + "@sentry/cli-win32-arm64": ["@sentry/cli-win32-arm64@2.46.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-mN7cpPoCv2VExFRGHt+IoK11yx4pM4ADZQGEso5BAUZ5duViXB2WrAXCLd8DrwMnP0OE978a7N8OtzsFqjkbNA=="], + + "@sentry/cli-win32-i686": ["@sentry/cli-win32-i686@2.46.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-6F73AUE3lm71BISUO19OmlnkFD5WVe4/wA1YivtLZTc1RU3eUYJLYxhDfaH3P77+ycDppQ2yCgemLRaA4A8mNQ=="], + + "@sentry/cli-win32-x64": ["@sentry/cli-win32-x64@2.46.0", "", { "os": "win32", "cpu": "x64" }, "sha512-yuGVcfepnNL84LGA0GjHzdMIcOzMe0bjPhq/rwPsPN+zu11N+nPR2wV2Bum4U0eQdqYH3iAlMdL5/BEQfuLJww=="], + + "@sentry/core": ["@sentry/core@8.54.0", "", {}, "sha512-03bWf+D1j28unOocY/5FDB6bUHtYlm6m6ollVejhg45ZmK9iPjdtxNWbrLsjT1WRym0Tjzowu+A3p+eebYEv0Q=="], + + "@sentry/react": ["@sentry/react@8.54.0", "", { "dependencies": { "@sentry/browser": "8.54.0", "@sentry/core": "8.54.0", "hoist-non-react-statics": "^3.3.2" }, "peerDependencies": { "react": "^16.14.0 || 17.x || 18.x || 19.x" } }, "sha512-42T/fp8snYN19Fy/2P0Mwotu4gcdy+1Lx+uYCNcYP1o7wNGigJ7qb27sW7W34GyCCHjoCCfQgeOqDQsyY8LC9w=="], + + "@sentry/react-native": ["@sentry/react-native@6.15.1", "", { "dependencies": { "@sentry/babel-plugin-component-annotate": "3.5.0", "@sentry/browser": "8.54.0", "@sentry/cli": "2.46.0", "@sentry/core": "8.54.0", "@sentry/react": "8.54.0", "@sentry/types": "8.54.0", "@sentry/utils": "8.54.0" }, "peerDependencies": { "expo": ">=49.0.0", "react": ">=17.0.0", "react-native": ">=0.65.0" }, "optionalPeers": ["expo"], "bin": { "sentry-expo-upload-sourcemaps": "scripts/expo-upload-sourcemaps.js" } }, "sha512-uNYjkhi7LUeXe+a3ui3N+sUZ4PbBh/P3Q6Pz5esOQOAEV1N7hxkdnHVic1cVHsirEQvy9rUJPBnja47Va7OpQA=="], + + "@sentry/types": ["@sentry/types@8.54.0", "", { "dependencies": { "@sentry/core": "8.54.0" } }, "sha512-wztdtr7dOXQKi0iRvKc8XJhJ7HaAfOv8lGu0yqFOFwBZucO/SHnu87GOPi8mvrTiy1bentQO5l+zXWAaMvG4uw=="], + + "@sentry/utils": ["@sentry/utils@8.54.0", "", { "dependencies": { "@sentry/core": "8.54.0" } }, "sha512-JL8UDjrsKxKclTdLXfuHfE7B3KbrAPEYP7tMyN/xiO2vsF6D84fjwYyalO0ZMtuFZE6vpSze8ZOLEh6hLnPYsw=="], + + "@sinclair/typebox": ["@sinclair/typebox@0.27.8", "", {}, "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA=="], + + "@sinonjs/commons": ["@sinonjs/commons@3.0.1", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ=="], + + "@sinonjs/fake-timers": ["@sinonjs/fake-timers@10.3.0", "", { "dependencies": { "@sinonjs/commons": "^3.0.0" } }, "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA=="], + + "@standard-schema/spec": ["@standard-schema/spec@1.0.0", "", {}, "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA=="], + + "@standard-schema/utils": ["@standard-schema/utils@0.3.0", "", {}, "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g=="], + + "@storybook/addon-actions": ["@storybook/addon-actions@8.6.14", "", { "dependencies": { "@storybook/global": "^5.0.0", "@types/uuid": "^9.0.1", "dequal": "^2.0.2", "polished": "^4.2.2", "uuid": "^9.0.0" }, "peerDependencies": { "storybook": "^8.6.14" } }, "sha512-mDQxylxGGCQSK7tJPkD144J8jWh9IU9ziJMHfB84PKpI/V5ZgqMDnpr2bssTrUaGDqU5e1/z8KcRF+Melhs9pQ=="], + + "@storybook/addon-backgrounds": ["@storybook/addon-backgrounds@8.6.14", "", { "dependencies": { "@storybook/global": "^5.0.0", "memoizerific": "^1.11.3", "ts-dedent": "^2.0.0" }, "peerDependencies": { "storybook": "^8.6.14" } }, "sha512-l9xS8qWe5n4tvMwth09QxH2PmJbCctEvBAc1tjjRasAfrd69f7/uFK4WhwJAstzBTNgTc8VXI4w8ZR97i1sFbg=="], + + "@storybook/addon-controls": ["@storybook/addon-controls@8.6.14", "", { "dependencies": { "@storybook/global": "^5.0.0", "dequal": "^2.0.2", "ts-dedent": "^2.0.0" }, "peerDependencies": { "storybook": "^8.6.14" } }, "sha512-IiQpkNJdiRyA4Mq9mzjZlvQugL/aE7hNgVxBBGPiIZG6wb6Ht9hNnBYpap5ZXXFKV9p2qVI0FZK445ONmAa+Cw=="], + + "@storybook/addon-docs": ["@storybook/addon-docs@8.6.14", "", { "dependencies": { "@mdx-js/react": "^3.0.0", "@storybook/blocks": "8.6.14", "@storybook/csf-plugin": "8.6.14", "@storybook/react-dom-shim": "8.6.14", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "ts-dedent": "^2.0.0" }, "peerDependencies": { "storybook": "^8.6.14" } }, "sha512-Obpd0OhAF99JyU5pp5ci17YmpcQtMNgqW2pTXV8jAiiipWpwO++hNDeQmLmlSXB399XjtRDOcDVkoc7rc6JzdQ=="], + + "@storybook/addon-essentials": ["@storybook/addon-essentials@8.6.14", "", { "dependencies": { "@storybook/addon-actions": "8.6.14", "@storybook/addon-backgrounds": "8.6.14", "@storybook/addon-controls": "8.6.14", "@storybook/addon-docs": "8.6.14", "@storybook/addon-highlight": "8.6.14", "@storybook/addon-measure": "8.6.14", "@storybook/addon-outline": "8.6.14", "@storybook/addon-toolbars": "8.6.14", "@storybook/addon-viewport": "8.6.14", "ts-dedent": "^2.0.0" }, "peerDependencies": { "storybook": "^8.6.14" } }, "sha512-5ZZSHNaW9mXMOFkoPyc3QkoNGdJHETZydI62/OASR0lmPlJ1065TNigEo5dJddmZNn0/3bkE8eKMAzLnO5eIdA=="], + + "@storybook/addon-highlight": ["@storybook/addon-highlight@8.6.14", "", { "dependencies": { "@storybook/global": "^5.0.0" }, "peerDependencies": { "storybook": "^8.6.14" } }, "sha512-4H19OJlapkofiE9tM6K/vsepf4ir9jMm9T+zw5L85blJZxhKZIbJ6FO0TCG9PDc4iPt3L6+aq5B0X29s9zicNQ=="], + + "@storybook/addon-interactions": ["@storybook/addon-interactions@8.6.14", "", { "dependencies": { "@storybook/global": "^5.0.0", "@storybook/instrumenter": "8.6.14", "@storybook/test": "8.6.14", "polished": "^4.2.2", "ts-dedent": "^2.2.0" }, "peerDependencies": { "storybook": "^8.6.14" } }, "sha512-8VmElhm2XOjh22l/dO4UmXxNOolGhNiSpBcls2pqWSraVh4a670EyYBZsHpkXqfNHo2YgKyZN3C91+9zfH79qQ=="], + + "@storybook/addon-measure": ["@storybook/addon-measure@8.6.14", "", { "dependencies": { "@storybook/global": "^5.0.0", "tiny-invariant": "^1.3.1" }, "peerDependencies": { "storybook": "^8.6.14" } }, "sha512-1Tlyb72NX8aAqm6I6OICsUuGOP6hgnXcuFlXucyhKomPa6j3Eu2vKu561t/f0oGtAK2nO93Z70kVaEh5X+vaGw=="], + + "@storybook/addon-onboarding": ["@storybook/addon-onboarding@8.6.14", "", { "peerDependencies": { "storybook": "^8.6.14" } }, "sha512-bHdHiGJFigVcSzMIsNLHY5IODZHr+nKwyz5/QOZLMkLcGH2IaUbOJfm4RyGOaTTPsUtAKbdsVXNEG3Otf+qO9A=="], + + "@storybook/addon-ondevice-actions": ["@storybook/addon-ondevice-actions@8.6.4", "", { "dependencies": { "@storybook/addon-actions": "^8.6.6", "@storybook/core": "^8.6.6", "@storybook/global": "^5.0.0", "fast-deep-equal": "^2.0.1" }, "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-jDS9lcz5z0gDCptQ8kqTMUkQrug0KdTOyr25Ri8zftmvnT0Zph2/IsEPPendqyoszzYfDvsoW3kQ6VDONEX7tg=="], + + "@storybook/addon-ondevice-controls": ["@storybook/addon-ondevice-controls@8.6.4", "", { "dependencies": { "@storybook/addon-controls": "^8.6.6", "@storybook/core": "^8.6.6", "@storybook/react-native-theming": "^8.6.4", "@storybook/react-native-ui": "^8.6.4", "deep-equal": "^1.0.1", "prop-types": "^15.7.2", "react-native-modal-datetime-picker": "^18.0.0", "tinycolor2": "^1.4.1" }, "peerDependencies": { "@gorhom/bottom-sheet": ">=4", "@react-native-community/datetimepicker": "*", "@react-native-community/slider": "*", "react": "*", "react-native": "*" } }, "sha512-HfgA4+711eyHjDa+fbO2TyvU8HOpDs27oKKPSAY+KMGrBUoZ19Gkt0bjY3F4KB+AmHM5qzwhqjc8rw1vzoIaQg=="], + + "@storybook/addon-outline": ["@storybook/addon-outline@8.6.14", "", { "dependencies": { "@storybook/global": "^5.0.0", "ts-dedent": "^2.0.0" }, "peerDependencies": { "storybook": "^8.6.14" } }, "sha512-CW857JvN6OxGWElqjlzJO2S69DHf+xO3WsEfT5mT3ZtIjmsvRDukdWfDU9bIYUFyA2lFvYjncBGjbK+I91XR7w=="], + + "@storybook/addon-toolbars": ["@storybook/addon-toolbars@8.6.14", "", { "peerDependencies": { "storybook": "^8.6.14" } }, "sha512-W/wEXT8h3VyZTVfWK/84BAcjAxTdtRiAkT2KAN0nbSHxxB5KEM1MjKpKu2upyzzMa3EywITqbfy4dP6lpkVTwQ=="], + + "@storybook/addon-viewport": ["@storybook/addon-viewport@8.6.14", "", { "dependencies": { "memoizerific": "^1.11.3" }, "peerDependencies": { "storybook": "^8.6.14" } }, "sha512-gNzVQbMqRC+/4uQTPI2ZrWuRHGquTMZpdgB9DrD88VTEjNudP+J6r8myLfr2VvGksBbUMHkGHMXHuIhrBEnXYA=="], + + "@storybook/blocks": ["@storybook/blocks@8.6.14", "", { "dependencies": { "@storybook/icons": "^1.2.12", "ts-dedent": "^2.0.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "storybook": "^8.6.14" }, "optionalPeers": ["react", "react-dom"] }, "sha512-rBMHAfA39AGHgkrDze4RmsnQTMw1ND5fGWobr9pDcJdnDKWQWNRD7Nrlxj0gFlN3n4D9lEZhWGdFrCbku7FVAQ=="], + + "@storybook/builder-vite": ["@storybook/builder-vite@8.6.14", "", { "dependencies": { "@storybook/csf-plugin": "8.6.14", "browser-assert": "^1.2.1", "ts-dedent": "^2.0.0" }, "peerDependencies": { "storybook": "^8.6.14", "vite": "^4.0.0 || ^5.0.0 || ^6.0.0" } }, "sha512-ajWYhy32ksBWxwWHrjwZzyC0Ii5ZTeu5lsqA95Q/EQBB0P5qWlHWGM3AVyv82Mz/ND03ebGy123uVwgf6olnYQ=="], + + "@storybook/components": ["@storybook/components@8.6.14", "", { "peerDependencies": { "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" } }, "sha512-HNR2mC5I4Z5ek8kTrVZlIY/B8gJGs5b3XdZPBPBopTIN6U/YHXiDyOjY3JlaS4fSG1fVhp/Qp1TpMn1w/9m1pw=="], + + "@storybook/core": ["@storybook/core@8.6.14", "", { "dependencies": { "@storybook/theming": "8.6.14", "better-opn": "^3.0.2", "browser-assert": "^1.2.1", "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0", "esbuild-register": "^3.5.0", "jsdoc-type-pratt-parser": "^4.0.0", "process": "^0.11.10", "recast": "^0.23.5", "semver": "^7.6.2", "util": "^0.12.5", "ws": "^8.2.3" }, "peerDependencies": { "prettier": "^2 || ^3" }, "optionalPeers": ["prettier"] }, "sha512-1P/w4FSNRqP8j3JQBOi3yGt8PVOgSRbP66Ok520T78eJBeqx9ukCfl912PQZ7SPbW3TIunBwLXMZOjZwBB/JmA=="], + + "@storybook/csf": ["@storybook/csf@0.1.13", "", { "dependencies": { "type-fest": "^2.19.0" } }, "sha512-7xOOwCLGB3ebM87eemep89MYRFTko+D8qE7EdAAq74lgdqRR5cOUtYWJLjO2dLtP94nqoOdHJo6MdLLKzg412Q=="], + + "@storybook/csf-plugin": ["@storybook/csf-plugin@8.6.14", "", { "dependencies": { "unplugin": "^1.3.1" }, "peerDependencies": { "storybook": "^8.6.14" } }, "sha512-dErtc9teAuN+eelN8FojzFE635xlq9cNGGGEu0WEmMUQ4iJ8pingvBO1N8X3scz4Ry7KnxX++NNf3J3gpxS8qQ=="], + + "@storybook/global": ["@storybook/global@5.0.0", "", {}, "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ=="], + + "@storybook/icons": ["@storybook/icons@1.4.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta" } }, "sha512-Td73IeJxOyalzvjQL+JXx72jlIYHgs+REaHiREOqfpo3A2AYYG71AUbcv+lg7mEDIweKVCxsMQ0UKo634c8XeA=="], + + "@storybook/instrumenter": ["@storybook/instrumenter@8.6.14", "", { "dependencies": { "@storybook/global": "^5.0.0", "@vitest/utils": "^2.1.1" }, "peerDependencies": { "storybook": "^8.6.14" } }, "sha512-iG4MlWCcz1L7Yu8AwgsnfVAmMbvyRSk700Mfy2g4c8y5O+Cv1ejshE1LBBsCwHgkuqU0H4R0qu4g23+6UnUemQ=="], + + "@storybook/manager-api": ["@storybook/manager-api@8.6.14", "", { "peerDependencies": { "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" } }, "sha512-ez0Zihuy17udLbfHZQXkGqwtep0mSGgHcNzGN7iZrMP1m+VmNo+7aGCJJdvXi7+iU3yq8weXSQFWg5DqWgLS7g=="], + + "@storybook/preview-api": ["@storybook/preview-api@8.6.14", "", { "peerDependencies": { "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" } }, "sha512-2GhcCd4dNMrnD7eooEfvbfL4I83qAqEyO0CO7JQAmIO6Rxb9BsOLLI/GD5HkvQB73ArTJ+PT50rfaO820IExOQ=="], + + "@storybook/react": ["@storybook/react@8.6.14", "", { "dependencies": { "@storybook/components": "8.6.14", "@storybook/global": "^5.0.0", "@storybook/manager-api": "8.6.14", "@storybook/preview-api": "8.6.14", "@storybook/react-dom-shim": "8.6.14", "@storybook/theming": "8.6.14" }, "peerDependencies": { "@storybook/test": "8.6.14", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "storybook": "^8.6.14", "typescript": ">= 4.2.x" }, "optionalPeers": ["@storybook/test", "typescript"] }, "sha512-BOepx5bBFwl/CPI+F+LnmMmsG1wQYmrX/UQXgUbHQUU9Tj7E2ndTnNbpIuSLc8IrM03ru+DfwSg1Co3cxWtT+g=="], + + "@storybook/react-dom-shim": ["@storybook/react-dom-shim@8.6.14", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "storybook": "^8.6.14" } }, "sha512-0hixr3dOy3f3M+HBofp3jtMQMS+sqzjKNgl7Arfuj3fvjmyXOks/yGjDImySR4imPtEllvPZfhiQNlejheaInw=="], + + "@storybook/react-native": ["@storybook/react-native@8.6.4", "", { "dependencies": { "@storybook/core": "^8.6.6", "@storybook/csf": "^0.1.13", "@storybook/global": "^5.0.0", "@storybook/react": "^8.6.6", "@storybook/react-native-theming": "^8.6.4", "@storybook/react-native-ui": "^8.6.4", "commander": "^8.2.0", "dedent": "^1.5.1", "deepmerge": "^4.3.0", "prettier": "^2.4.1", "react-native-url-polyfill": "^2.0.0", "setimmediate": "^1.0.5", "storybook": "^8.6.6", "type-fest": "~2.19", "util": "^0.12.4", "ws": "^8.18.0" }, "peerDependencies": { "@gorhom/bottom-sheet": ">=4", "react": "*", "react-native": ">=0.72.0", "react-native-gesture-handler": ">=2", "react-native-safe-area-context": "*" }, "bin": { "sb-rn-get-stories": "./bin/get-stories.js" } }, "sha512-J6pbFthZLwRdf48PrxkDYOOdvrA8r8AESsBeclmKqJRjanelxcID+U5b/C+7MBlMZnDeb18yVzV03Qs10+hIRg=="], + + "@storybook/react-native-theming": ["@storybook/react-native-theming@8.6.4", "", { "dependencies": { "polished": "^4.3.1" }, "peerDependencies": { "react": "*", "react-native": ">=0.57.0" } }, "sha512-3CI1yXO59eX5Jf1cd8Q+cvStocdJw8QxrzY5j0nbcj872SHzNtIh/kt0bR60O2AioaBYtSweZK1LuIQqTl58SQ=="], + + "@storybook/react-native-ui": ["@storybook/react-native-ui@8.6.4", "", { "dependencies": { "@storybook/core": "^8.6.6", "@storybook/react": "^8.6.6", "@storybook/react-native-theming": "^8.6.4", "fuse.js": "^7.0.0", "lodash": "^4.17.21", "memoizerific": "^1.11.3", "polished": "^4.3.1", "store2": "^2.14.3" }, "peerDependencies": { "@gorhom/bottom-sheet": ">=4", "react": "*", "react-native": ">=0.57.0", "react-native-gesture-handler": ">=2", "react-native-reanimated": ">=3", "react-native-safe-area-context": "*", "react-native-svg": ">=14" } }, "sha512-ueFfn2IrCd4kJPqzD+3NHT7B2rbqH032+uryInsEGCB13tzUhDrjE5TNRnVctOw1FU2OB2YXbBtMfXdIsE37Bg=="], + + "@storybook/react-vite": ["@storybook/react-vite@8.6.14", "", { "dependencies": { "@joshwooding/vite-plugin-react-docgen-typescript": "0.5.0", "@rollup/pluginutils": "^5.0.2", "@storybook/builder-vite": "8.6.14", "@storybook/react": "8.6.14", "find-up": "^5.0.0", "magic-string": "^0.30.0", "react-docgen": "^7.0.0", "resolve": "^1.22.8", "tsconfig-paths": "^4.2.0" }, "peerDependencies": { "@storybook/test": "8.6.14", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "storybook": "^8.6.14", "vite": "^4.0.0 || ^5.0.0 || ^6.0.0" }, "optionalPeers": ["@storybook/test"] }, "sha512-FZU0xMPxa4/TO87FgcWwappOxLBHZV5HSRK5K+2bJD7rFJAoNorbHvB4Q1zvIAk7eCMjkr2GPCPHx9PRB9vJFg=="], + + "@storybook/test": ["@storybook/test@8.6.14", "", { "dependencies": { "@storybook/global": "^5.0.0", "@storybook/instrumenter": "8.6.14", "@testing-library/dom": "10.4.0", "@testing-library/jest-dom": "6.5.0", "@testing-library/user-event": "14.5.2", "@vitest/expect": "2.0.5", "@vitest/spy": "2.0.5" }, "peerDependencies": { "storybook": "^8.6.14" } }, "sha512-GkPNBbbZmz+XRdrhMtkxPotCLOQ1BaGNp/gFZYdGDk2KmUWBKmvc5JxxOhtoXM2703IzNFlQHSSNnhrDZYuLlw=="], + + "@storybook/theming": ["@storybook/theming@8.6.14", "", { "peerDependencies": { "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" } }, "sha512-r4y+LsiB37V5hzpQo+BM10PaCsp7YlZ0YcZzQP1OCkPlYXmUAFy2VvDKaFRpD8IeNPKug2u4iFm/laDEbs03dg=="], + + "@styled-icons/bootstrap": ["@styled-icons/bootstrap@10.47.0", "", { "dependencies": { "@babel/runtime": "^7.20.7", "@styled-icons/styled-icon": "^10.7.0" }, "peerDependencies": { "react": "*", "styled-components": "*" } }, "sha512-xpnPdrLhAhpTRE4iljQIEK73twVj7VPglwHSL+8nQdH7EsW5RJIOWsmlkZMyqhQHN0H7fGmT10F3/6OQhSpfGg=="], + + "@styled-icons/boxicons-logos": ["@styled-icons/boxicons-logos@10.47.0", "", { "dependencies": { "@babel/runtime": "^7.20.7", "@styled-icons/styled-icon": "^10.7.0" }, "peerDependencies": { "react": "*", "styled-components": "*" } }, "sha512-eDZfiTjBth4MsCX83ZfiWIoYGU494NxZgAxyf7S0ky2ZRsJnq/Cs7crH4hKWUTaLvCo0XRJmLeA3Us2tZFiItg=="], + + "@styled-icons/boxicons-regular": ["@styled-icons/boxicons-regular@10.47.0", "", { "dependencies": { "@babel/runtime": "^7.20.7", "@styled-icons/styled-icon": "^10.7.0" }, "peerDependencies": { "react": "*", "styled-components": "*" } }, "sha512-z8KczDp4VArXvOn8i2j66Xs4oX9oiiJEhMoHydY3uC9kdtImcxhZ/xHPrgTJLkbK6f5ikwB4CKVnSqQGzzAJNw=="], + + "@styled-icons/entypo": ["@styled-icons/entypo@10.46.0", "", { "dependencies": { "@babel/runtime": "^7.19.0", "@styled-icons/styled-icon": "^10.7.0" }, "peerDependencies": { "react": "*", "styled-components": "*" } }, "sha512-0ChIqx3EMlMeout4Aa5AwEYtKsgTqrY/NnVQGvhlGfMYq9mC7jq7JuaKvt5SJ9/0cEnVhgW5zwAe4LeyrsJl5g=="], + + "@styled-icons/evaicons-solid": ["@styled-icons/evaicons-solid@10.46.0", "", { "dependencies": { "@babel/runtime": "^7.19.0", "@styled-icons/styled-icon": "^10.7.0" }, "peerDependencies": { "react": "*", "styled-components": "*" } }, "sha512-tRw2/TkmRNV4N2badKPFnnRy+WbVtUkrloNo94CgF5rpxoL0eK+ki3OYZYqbl0T66bJ07hqduqTc3rbxvT/vfw=="], + + "@styled-icons/evil": ["@styled-icons/evil@10.46.0", "", { "dependencies": { "@babel/runtime": "^7.19.0", "@styled-icons/styled-icon": "^10.7.0" }, "peerDependencies": { "react": "*", "styled-components": "*" } }, "sha512-r1g2jZmz84XGLgJbAPkMDmuToUF+KyNWkS6GNoP+ygzriNgzgoHkcEvIb/bx/I2/UUHeotRMOknvhvh5C2CwFg=="], + + "@styled-icons/fa-solid": ["@styled-icons/fa-solid@10.47.0", "", { "dependencies": { "@babel/runtime": "^7.20.7", "@styled-icons/styled-icon": "^10.7.0" }, "peerDependencies": { "react": "*", "styled-components": "*" } }, "sha512-8AJjbOAkvPlB/ypFzWo++CZxRDlFQfvWQSjWzVU/v/4kjGRWIiVB+rJrTB7joDUd5Oas/se4cSiDkSA+XR/Fqg=="], + + "@styled-icons/feather": ["@styled-icons/feather@10.47.0", "", { "dependencies": { "@babel/runtime": "^7.20.7", "@styled-icons/styled-icon": "^10.7.0" }, "peerDependencies": { "react": "*", "styled-components": "*" } }, "sha512-w6F3s1B4DaQGLr4AZZ0PffZQOnPSRqr3npHoTvk4Juz4uTjw9/oHolcrTxPyJas9gXAV1kCLbeiaxTR6JVxJPw=="], + + "@styled-icons/fluentui-system-filled": ["@styled-icons/fluentui-system-filled@10.47.0", "", { "dependencies": { "@babel/runtime": "^7.20.7", "@styled-icons/styled-icon": "^10.7.0" }, "peerDependencies": { "react": "*", "styled-components": "*" } }, "sha512-jAO8bs9SY/5Xu2vxg5sJmnD5YA966G2m2qU4ezlDbLDIXSaX/1qUBUivBFSWCDn4q5rslegzD1rhc9FncgPbSw=="], + + "@styled-icons/fluentui-system-regular": ["@styled-icons/fluentui-system-regular@10.47.0", "", { "dependencies": { "@babel/runtime": "^7.20.7", "@styled-icons/styled-icon": "^10.7.0" }, "peerDependencies": { "react": "*", "styled-components": "*" } }, "sha512-x1TmxKS6mpX+QJw8ismT3rNa6TPvKYftmQRy57LbdNE9L5FkyWldrumPboZGKWi/oNiBn6SBelPeqv8LPFXNHQ=="], + + "@styled-icons/ionicons-outline": ["@styled-icons/ionicons-outline@10.46.0", "", { "dependencies": { "@babel/runtime": "^7.19.0", "@styled-icons/styled-icon": "^10.7.0" }, "peerDependencies": { "react": "*", "styled-components": "*" } }, "sha512-BEFEBGQDhPssEshbHyrsAXbEb7hNsrsHa0Zh0zLlfCIB3Vxc2GrQU9Qibto443ZRVw5qgF7iBdSwQHiwY8dQJw=="], + + "@styled-icons/ionicons-sharp": ["@styled-icons/ionicons-sharp@10.46.0", "", { "dependencies": { "@babel/runtime": "^7.19.0", "@styled-icons/styled-icon": "^10.7.0" }, "peerDependencies": { "react": "*", "styled-components": "*" } }, "sha512-ZMkS+zBe04odi/4llkKMZkNEz8K3whta7Chzk81vvCTtR7jMnGEyw+tMUZbARliOOyaELBeTbgeUwNRNTibiSA=="], + + "@styled-icons/remix-fill": ["@styled-icons/remix-fill@10.46.0", "", { "dependencies": { "@babel/runtime": "^7.19.0", "@styled-icons/styled-icon": "^10.7.0" }, "peerDependencies": { "react": "*", "styled-components": "*" } }, "sha512-D2rWGJ9/7BR+3TMvmIoWGASMfyhWT4lTF+we8h9Pya5Ye+69cftvp817DMuaR/6czCugXTrB++HTQX0XJfoBFw=="], + + "@styled-icons/simple-icons": ["@styled-icons/simple-icons@10.46.0", "", { "dependencies": { "@babel/runtime": "^7.19.0", "@styled-icons/styled-icon": "^10.7.0" }, "peerDependencies": { "react": "*", "styled-components": "*" } }, "sha512-zHkbGqAqFOwpqDjbhKTKsAXNxtBOXb7Ot2eKoDaDFckJGr2shAXRchclUS6wSixSPwQIPGAUcdO7Cq744Ollng=="], + + "@styled-icons/styled-icon": ["@styled-icons/styled-icon@10.7.1", "", { "dependencies": { "@babel/runtime": "^7.20.7" }, "peerDependencies": { "react": "*", "styled-components": ">=4.1.0" } }, "sha512-WLYaeMTMhMkSxE+v+of+r2ovIk0tceDGfv8iqWHRMxvbm+6zxngVcQ4ELx6Zt/LFxqckmmoAdvo6ehiiYj6I6A=="], + + "@styled-icons/zondicons": ["@styled-icons/zondicons@10.46.0", "", { "dependencies": { "@babel/runtime": "^7.19.0", "@styled-icons/styled-icon": "^10.7.0" }, "peerDependencies": { "react": "*", "styled-components": "*" } }, "sha512-DUlww6TeFsFjHD/1qd+DtMutm44r3ssOYtPiMJrOVolX1NqdW6XzrJ5dTbVCA2s7Ucd+Vp25cWfXnLcJBfas3w=="], + + "@swc/core": ["@swc/core@1.12.1", "", { "dependencies": { "@swc/counter": "^0.1.3", "@swc/types": "^0.1.23" }, "optionalDependencies": { "@swc/core-darwin-arm64": "1.12.1", "@swc/core-darwin-x64": "1.12.1", "@swc/core-linux-arm-gnueabihf": "1.12.1", "@swc/core-linux-arm64-gnu": "1.12.1", "@swc/core-linux-arm64-musl": "1.12.1", "@swc/core-linux-x64-gnu": "1.12.1", "@swc/core-linux-x64-musl": "1.12.1", "@swc/core-win32-arm64-msvc": "1.12.1", "@swc/core-win32-ia32-msvc": "1.12.1", "@swc/core-win32-x64-msvc": "1.12.1" }, "peerDependencies": { "@swc/helpers": ">=0.5.17" }, "optionalPeers": ["@swc/helpers"] }, "sha512-aKXdDTqxTVFl/bKQZ3EQUjEMBEoF6JBv29moMZq0kbVO43na6u/u+3Vcbhbrh+A2N0X5OL4RaveuWfAjEgOmeA=="], + + "@swc/core-darwin-arm64": ["@swc/core-darwin-arm64@1.12.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-nUjWVcJ3YS2N40ZbKwYO2RJ4+o2tWYRzNOcIQp05FqW0+aoUCVMdAUUzQinPDynfgwVshDAXCKemY8X7nN5MaA=="], + + "@swc/core-darwin-x64": ["@swc/core-darwin-x64@1.12.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-OGm4a4d3OeJn+tRt8H/eiHgTFrJbS6r8mi/Ob65tAEXZGHN900T2kR7c5ALr0V2hBOQ8BfhexwPoQlGQP/B95w=="], + + "@swc/core-linux-arm-gnueabihf": ["@swc/core-linux-arm-gnueabihf@1.12.1", "", { "os": "linux", "cpu": "arm" }, "sha512-76YeeQKyK0EtNkQiNBZ0nbVGooPf9IucY0WqVXVpaU4wuG7ZyLEE2ZAIgXafIuzODGQoLfetue7I8boMxh1/MA=="], + + "@swc/core-linux-arm64-gnu": ["@swc/core-linux-arm64-gnu@1.12.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-BxJDIJPq1+aCh9UsaSAN6wo3tuln8UhNXruOrzTI8/ElIig/3sAueDM6Eq7GvZSGGSA7ljhNATMJ0elD7lFatQ=="], + + "@swc/core-linux-arm64-musl": ["@swc/core-linux-arm64-musl@1.12.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-NhLdbffSXvY0/FwUSAl4hKBlpe5GHQGXK8DxTo3HHjLsD9sCPYieo3vG0NQoUYAy4ZUY1WeGjyxeq4qZddJzEQ=="], + + "@swc/core-linux-x64-gnu": ["@swc/core-linux-x64-gnu@1.12.1", "", { "os": "linux", "cpu": "x64" }, "sha512-CrYnV8SZIgArQ9LKH0xEF95PKXzX9WkRSc5j55arOSBeDCeDUQk1Bg/iKdnDiuj5HC1hZpvzwMzSBJjv+Z70jA=="], + + "@swc/core-linux-x64-musl": ["@swc/core-linux-x64-musl@1.12.1", "", { "os": "linux", "cpu": "x64" }, "sha512-BQMl3d0HaGB0/h2xcKlGtjk/cGRn2tnbsaChAKcjFdCepblKBCz1pgO/mL7w5iXq3s57wMDUn++71/a5RAkZOA=="], + + "@swc/core-win32-arm64-msvc": ["@swc/core-win32-arm64-msvc@1.12.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-b7NeGnpqTfmIGtUqXBl0KqoSmOnH64nRZoT5l4BAGdvwY7nxitWR94CqZuwyLPty/bLywmyDA9uO12Kvgb3+gg=="], + + "@swc/core-win32-ia32-msvc": ["@swc/core-win32-ia32-msvc@1.12.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-iU/29X2D7cHBp1to62cUg/5Xk8K+lyOJiKIGGW5rdzTW/c2zz3d/ehgpzVP/rqC4NVr88MXspqHU4il5gmDajw=="], + + "@swc/core-win32-x64-msvc": ["@swc/core-win32-x64-msvc@1.12.1", "", { "os": "win32", "cpu": "x64" }, "sha512-+Zh+JKDwiFqV5N9yAd2DhYVGPORGh9cfenu1ptr9yge+eHAf7vZJcC3rnj6QMR1QJh0Y5VC9+YBjRFjZVA7XDw=="], + + "@swc/counter": ["@swc/counter@0.1.3", "", {}, "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="], + + "@swc/types": ["@swc/types@0.1.23", "", { "dependencies": { "@swc/counter": "^0.1.3" } }, "sha512-u1iIVZV9Q0jxY+yM2vw/hZGDNudsN85bBpTqzAQ9rzkxW9D+e3aEM4Han+ow518gSewkXgjmEK0BD79ZcNVgPw=="], + + "@tailwindcss/node": ["@tailwindcss/node@4.1.10", "", { "dependencies": { "@ampproject/remapping": "^2.3.0", "enhanced-resolve": "^5.18.1", "jiti": "^2.4.2", "lightningcss": "1.30.1", "magic-string": "^0.30.17", "source-map-js": "^1.2.1", "tailwindcss": "4.1.10" } }, "sha512-2ACf1znY5fpRBwRhMgj9ZXvb2XZW8qs+oTfotJ2C5xR0/WNL7UHZ7zXl6s+rUqedL1mNi+0O+WQr5awGowS3PQ=="], + + "@tailwindcss/oxide": ["@tailwindcss/oxide@4.1.10", "", { "dependencies": { "detect-libc": "^2.0.4", "tar": "^7.4.3" }, "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.1.10", "@tailwindcss/oxide-darwin-arm64": "4.1.10", "@tailwindcss/oxide-darwin-x64": "4.1.10", "@tailwindcss/oxide-freebsd-x64": "4.1.10", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.10", "@tailwindcss/oxide-linux-arm64-gnu": "4.1.10", "@tailwindcss/oxide-linux-arm64-musl": "4.1.10", "@tailwindcss/oxide-linux-x64-gnu": "4.1.10", "@tailwindcss/oxide-linux-x64-musl": "4.1.10", "@tailwindcss/oxide-wasm32-wasi": "4.1.10", "@tailwindcss/oxide-win32-arm64-msvc": "4.1.10", "@tailwindcss/oxide-win32-x64-msvc": "4.1.10" } }, "sha512-v0C43s7Pjw+B9w21htrQwuFObSkio2aV/qPx/mhrRldbqxbWJK6KizM+q7BF1/1CmuLqZqX3CeYF7s7P9fbA8Q=="], + + "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.1.10", "", { "os": "android", "cpu": "arm64" }, "sha512-VGLazCoRQ7rtsCzThaI1UyDu/XRYVyH4/EWiaSX6tFglE+xZB5cvtC5Omt0OQ+FfiIVP98su16jDVHDEIuH4iQ=="], + + "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.1.10", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ZIFqvR1irX2yNjWJzKCqTCcHZbgkSkSkZKbRM3BPzhDL/18idA8uWCoopYA2CSDdSGFlDAxYdU2yBHwAwx8euQ=="], + + "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.1.10", "", { "os": "darwin", "cpu": "x64" }, "sha512-eCA4zbIhWUFDXoamNztmS0MjXHSEJYlvATzWnRiTqJkcUteSjO94PoRHJy1Xbwp9bptjeIxxBHh+zBWFhttbrQ=="], + + "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.1.10", "", { "os": "freebsd", "cpu": "x64" }, "sha512-8/392Xu12R0cc93DpiJvNpJ4wYVSiciUlkiOHOSOQNH3adq9Gi/dtySK7dVQjXIOzlpSHjeCL89RUUI8/GTI6g=="], + + "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.1.10", "", { "os": "linux", "cpu": "arm" }, "sha512-t9rhmLT6EqeuPT+MXhWhlRYIMSfh5LZ6kBrC4FS6/+M1yXwfCtp24UumgCWOAJVyjQwG+lYva6wWZxrfvB+NhQ=="], + + "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.1.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-3oWrlNlxLRxXejQ8zImzrVLuZ/9Z2SeKoLhtCu0hpo38hTO2iL86eFOu4sVR8cZc6n3z7eRXXqtHJECa6mFOvA=="], + + "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.1.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-saScU0cmWvg/Ez4gUmQWr9pvY9Kssxt+Xenfx1LG7LmqjcrvBnw4r9VjkFcqmbBb7GCBwYNcZi9X3/oMda9sqQ=="], + + "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.1.10", "", { "os": "linux", "cpu": "x64" }, "sha512-/G3ao/ybV9YEEgAXeEg28dyH6gs1QG8tvdN9c2MNZdUXYBaIY/Gx0N6RlJzfLy/7Nkdok4kaxKPHKJUlAaoTdA=="], + + "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.1.10", "", { "os": "linux", "cpu": "x64" }, "sha512-LNr7X8fTiKGRtQGOerSayc2pWJp/9ptRYAa4G+U+cjw9kJZvkopav1AQc5HHD+U364f71tZv6XamaHKgrIoVzA=="], + + "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.1.10", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@emnapi/wasi-threads": "^1.0.2", "@napi-rs/wasm-runtime": "^0.2.10", "@tybys/wasm-util": "^0.9.0", "tslib": "^2.8.0" }, "cpu": "none" }, "sha512-d6ekQpopFQJAcIK2i7ZzWOYGZ+A6NzzvQ3ozBvWFdeyqfOZdYHU66g5yr+/HC4ipP1ZgWsqa80+ISNILk+ae/Q=="], + + "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.1.10", "", { "os": "win32", "cpu": "arm64" }, "sha512-i1Iwg9gRbwNVOCYmnigWCCgow8nDWSFmeTUU5nbNx3rqbe4p0kRbEqLwLJbYZKmSSp23g4N6rCDmm7OuPBXhDA=="], + + "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.1.10", "", { "os": "win32", "cpu": "x64" }, "sha512-sGiJTjcBSfGq2DVRtaSljq5ZgZS2SDHSIfhOylkBvHVjwOsodBhnb3HdmiKkVuUGKD0I7G63abMOVaskj1KpOA=="], + + "@tailwindcss/vite": ["@tailwindcss/vite@4.1.10", "", { "dependencies": { "@tailwindcss/node": "4.1.10", "@tailwindcss/oxide": "4.1.10", "tailwindcss": "4.1.10" }, "peerDependencies": { "vite": "^5.2.0 || ^6" } }, "sha512-QWnD5HDY2IADv+vYR82lOhqOlS1jSCUUAmfem52cXAhRTKxpDh3ARX8TTXJTCCO7Rv7cD2Nlekabv02bwP3a2A=="], + + "@tanstack/query-core": ["@tanstack/query-core@5.80.7", "", {}, "sha512-s09l5zeUKC8q7DCCCIkVSns8zZrK4ZDT6ryEjxNBFi68G4z2EBobBS7rdOY3r6W1WbUDpc1fe5oY+YO/+2UVUg=="], + + "@tanstack/query-devtools": ["@tanstack/query-devtools@5.80.0", "", {}, "sha512-D6gH4asyjaoXrCOt5vG5Og/YSj0D/TxwNQgtLJIgWbhbWCC/emu2E92EFoVHh4ppVWg1qT2gKHvKyQBEFZhCuA=="], + + "@tanstack/react-query": ["@tanstack/react-query@5.80.7", "", { "dependencies": { "@tanstack/query-core": "5.80.7" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-u2F0VK6+anItoEvB3+rfvTO9GEh2vb00Je05OwlUe/A0lkJBgW1HckiY3f9YZa+jx6IOe4dHPh10dyp9aY3iRQ=="], + + "@tanstack/react-query-devtools": ["@tanstack/react-query-devtools@5.80.7", "", { "dependencies": { "@tanstack/query-devtools": "5.80.0" }, "peerDependencies": { "@tanstack/react-query": "^5.80.7", "react": "^18 || ^19" } }, "sha512-7Dz/19fVo0i+jgLVBabV5vfGOlLyN5L1w8w1/ogFhe6ItNNsNA+ZgNTbtiKpbR3CcX2WDRRTInz1uMSmHzTsoQ=="], + + "@tanstack/react-table": ["@tanstack/react-table@8.21.3", "", { "dependencies": { "@tanstack/table-core": "8.21.3" }, "peerDependencies": { "react": ">=16.8", "react-dom": ">=16.8" } }, "sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww=="], + + "@tanstack/table-core": ["@tanstack/table-core@8.21.3", "", {}, "sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg=="], + + "@testing-library/dom": ["@testing-library/dom@10.4.0", "", { "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", "aria-query": "5.3.0", "chalk": "^4.1.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", "pretty-format": "^27.0.2" } }, "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ=="], + + "@testing-library/jest-dom": ["@testing-library/jest-dom@6.5.0", "", { "dependencies": { "@adobe/css-tools": "^4.4.0", "aria-query": "^5.0.0", "chalk": "^3.0.0", "css.escape": "^1.5.1", "dom-accessibility-api": "^0.6.3", "lodash": "^4.17.21", "redent": "^3.0.0" } }, "sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA=="], + + "@testing-library/react-native": ["@testing-library/react-native@13.2.0", "", { "dependencies": { "chalk": "^4.1.2", "jest-matcher-utils": "^29.7.0", "pretty-format": "^29.7.0", "redent": "^3.0.0" }, "peerDependencies": { "jest": ">=29.0.0", "react": ">=18.2.0", "react-native": ">=0.71", "react-test-renderer": ">=18.2.0" }, "optionalPeers": ["jest"] }, "sha512-3FX+vW/JScXkoH8VSCRTYF4KCHC56y4AI6TMDISfLna6r+z8kaSEmxH1I6NVaFOxoWX9yaHDyI26xh7BykmqKw=="], + + "@testing-library/user-event": ["@testing-library/user-event@14.5.2", "", { "peerDependencies": { "@testing-library/dom": ">=7.21.4" } }, "sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ=="], + + "@trysound/sax": ["@trysound/sax@0.2.0", "", {}, "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA=="], + + "@ts-morph/common": ["@ts-morph/common@0.17.0", "", { "dependencies": { "fast-glob": "^3.2.11", "minimatch": "^5.1.0", "mkdirp": "^1.0.4", "path-browserify": "^1.0.1" } }, "sha512-RMSSvSfs9kb0VzkvQ2NWobwnj7TxCA9vI/IjR9bDHqgAyVbu2T0DN4wiKVqomyDWqO7dPr/tErSfq7urQ1Q37g=="], + + "@tsndr/cloudflare-worker-jwt": ["@tsndr/cloudflare-worker-jwt@3.2.0", "", {}, "sha512-y45452JzKxFDfCUHNGrdgIcrJTkYa6xtrKtCQTjKj+hjzw8dOHF9R0uGuU8WxvCCMi4sMzZ1KREnZTsTy7DsiQ=="], + + "@tybys/wasm-util": ["@tybys/wasm-util@0.9.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw=="], + + "@types/aria-query": ["@types/aria-query@5.0.4", "", {}, "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw=="], + + "@types/aws-lambda": ["@types/aws-lambda@8.10.147", "", {}, "sha512-nD0Z9fNIZcxYX5Mai2CTmFD7wX7UldCkW2ezCF8D1T5hdiLsnTWDGRpfRYntU6VjTdLQjOvyszru7I1c1oCQew=="], + + "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], + + "@types/babel__generator": ["@types/babel__generator@7.27.0", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="], + + "@types/babel__template": ["@types/babel__template@7.4.4", "", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="], + + "@types/babel__traverse": ["@types/babel__traverse@7.20.7", "", { "dependencies": { "@babel/types": "^7.20.7" } }, "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng=="], + + "@types/body-parser": ["@types/body-parser@1.19.6", "", { "dependencies": { "@types/connect": "*", "@types/node": "*" } }, "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g=="], + + "@types/bunyan": ["@types/bunyan@1.8.11", "", { "dependencies": { "@types/node": "*" } }, "sha512-758fRH7umIMk5qt5ELmRMff4mLDlN+xyYzC+dkPTdKwbSkJFvz6xwyScrytPU0QIBbRRwbiE8/BIg8bpajerNQ=="], + + "@types/chai": ["@types/chai@5.2.2", "", { "dependencies": { "@types/deep-eql": "*" } }, "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg=="], + + "@types/connect": ["@types/connect@3.4.38", "", { "dependencies": { "@types/node": "*" } }, "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug=="], + + "@types/d3-array": ["@types/d3-array@3.2.1", "", {}, "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg=="], + + "@types/d3-color": ["@types/d3-color@3.1.3", "", {}, "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A=="], + + "@types/d3-ease": ["@types/d3-ease@3.0.2", "", {}, "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA=="], + + "@types/d3-interpolate": ["@types/d3-interpolate@3.0.4", "", { "dependencies": { "@types/d3-color": "*" } }, "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA=="], + + "@types/d3-path": ["@types/d3-path@3.1.1", "", {}, "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg=="], + + "@types/d3-scale": ["@types/d3-scale@4.0.9", "", { "dependencies": { "@types/d3-time": "*" } }, "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw=="], + + "@types/d3-shape": ["@types/d3-shape@3.1.7", "", { "dependencies": { "@types/d3-path": "*" } }, "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg=="], + + "@types/d3-time": ["@types/d3-time@3.0.4", "", {}, "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g=="], + + "@types/d3-timer": ["@types/d3-timer@3.0.2", "", {}, "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw=="], + + "@types/deep-eql": ["@types/deep-eql@4.0.2", "", {}, "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw=="], + + "@types/doctrine": ["@types/doctrine@0.0.9", "", {}, "sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA=="], + + "@types/eslint": ["@types/eslint@9.6.1", "", { "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag=="], + + "@types/eslint-scope": ["@types/eslint-scope@3.7.7", "", { "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg=="], + + "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "@types/express": ["@types/express@5.0.3", "", { "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^5.0.0", "@types/serve-static": "*" } }, "sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw=="], + + "@types/express-serve-static-core": ["@types/express-serve-static-core@5.0.6", "", { "dependencies": { "@types/node": "*", "@types/qs": "*", "@types/range-parser": "*", "@types/send": "*" } }, "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA=="], + + "@types/graceful-fs": ["@types/graceful-fs@4.1.9", "", { "dependencies": { "@types/node": "*" } }, "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ=="], + + "@types/hammerjs": ["@types/hammerjs@2.0.46", "", {}, "sha512-ynRvcq6wvqexJ9brDMS4BnBLzmr0e14d6ZJTEShTBWKymQiHwlAyGu0ZPEFI2Fh1U53F7tN9ufClWM5KvqkKOw=="], + + "@types/http-errors": ["@types/http-errors@2.0.5", "", {}, "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg=="], + + "@types/istanbul-lib-coverage": ["@types/istanbul-lib-coverage@2.0.6", "", {}, "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w=="], + + "@types/istanbul-lib-report": ["@types/istanbul-lib-report@3.0.3", "", { "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA=="], + + "@types/istanbul-reports": ["@types/istanbul-reports@3.0.4", "", { "dependencies": { "@types/istanbul-lib-report": "*" } }, "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ=="], + + "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], + + "@types/json5": ["@types/json5@0.0.29", "", {}, "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="], + + "@types/lodash": ["@types/lodash@4.17.17", "", {}, "sha512-RRVJ+J3J+WmyOTqnz3PiBLA501eKwXl2noseKOrNo/6+XEHjTAxO4xHvxQB6QuNm+s4WRbn6rSiap8+EA+ykFQ=="], + + "@types/mdx": ["@types/mdx@2.0.13", "", {}, "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw=="], + + "@types/memcached": ["@types/memcached@2.2.10", "", { "dependencies": { "@types/node": "*" } }, "sha512-AM9smvZN55Gzs2wRrqeMHVP7KE8KWgCJO/XL5yCly2xF6EKa4YlbpK+cLSAH4NG/Ah64HrlegmGqW8kYws7Vxg=="], + + "@types/mime": ["@types/mime@1.3.5", "", {}, "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w=="], + + "@types/mysql": ["@types/mysql@2.15.26", "", { "dependencies": { "@types/node": "*" } }, "sha512-DSLCOXhkvfS5WNNPbfn2KdICAmk8lLc+/PNvnPnF7gOdMZCxopXduqv0OQ13y/yA/zXTSikZZqVgybUxOEg6YQ=="], + + "@types/node": ["@types/node@22.15.32", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-3jigKqgSjsH6gYZv2nEsqdXfZqIFGAV36XYYjf9KGZ3PSG+IhLecqPnI310RvjutyMwifE2hhhNEklOUrvx/wA=="], + + "@types/node-fetch": ["@types/node-fetch@2.6.12", "", { "dependencies": { "@types/node": "*", "form-data": "^4.0.0" } }, "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA=="], + + "@types/numeral": ["@types/numeral@2.0.5", "", {}, "sha512-kH8I7OSSwQu9DS9JYdFWbuvhVzvFRoCPCkGxNwoGgaPeDfEPJlcxNvEOypZhQ3XXHsGbfIuYcxcJxKUfJHnRfw=="], + + "@types/parse-json": ["@types/parse-json@4.0.2", "", {}, "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw=="], + + "@types/pg": ["@types/pg@8.6.1", "", { "dependencies": { "@types/node": "*", "pg-protocol": "*", "pg-types": "^2.2.0" } }, "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w=="], + + "@types/pg-pool": ["@types/pg-pool@2.0.6", "", { "dependencies": { "@types/pg": "*" } }, "sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ=="], + + "@types/prop-types": ["@types/prop-types@15.7.15", "", {}, "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw=="], + + "@types/qs": ["@types/qs@6.14.0", "", {}, "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ=="], + + "@types/ramda": ["@types/ramda@0.30.2", "", { "dependencies": { "types-ramda": "^0.30.1" } }, "sha512-PyzHvjCalm2BRYjAU6nIB3TprYwMNOUY/7P/N8bSzp9W/yM2YrtGtAnnVtaCNSeOZ8DzKyFDvaqQs7LnWwwmBA=="], + + "@types/range-parser": ["@types/range-parser@1.2.7", "", {}, "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ=="], + + "@types/react": ["@types/react@18.3.23", "", { "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" } }, "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w=="], + + "@types/react-dom": ["@types/react-dom@18.3.7", "", { "peerDependencies": { "@types/react": "^18.0.0" } }, "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ=="], + + "@types/resolve": ["@types/resolve@1.20.2", "", {}, "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q=="], + + "@types/send": ["@types/send@0.17.5", "", { "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w=="], + + "@types/serve-static": ["@types/serve-static@1.15.8", "", { "dependencies": { "@types/http-errors": "*", "@types/node": "*", "@types/send": "*" } }, "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg=="], + + "@types/service-worker-mock": ["@types/service-worker-mock@2.0.4", "", {}, "sha512-MEBT2eiqYfhxjqYm/oAf2AvKLbPTPwJJAYrMdheKnGyz1yG9XBRfxCzi93h27qpSvI7jOYfXqFLVMLBXFDqo4A=="], + + "@types/shimmer": ["@types/shimmer@1.2.0", "", {}, "sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg=="], + + "@types/stack-utils": ["@types/stack-utils@2.0.3", "", {}, "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw=="], + + "@types/stylis": ["@types/stylis@4.2.5", "", {}, "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw=="], + + "@types/tedious": ["@types/tedious@4.0.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw=="], + + "@types/uuid": ["@types/uuid@9.0.8", "", {}, "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA=="], + + "@types/yargs": ["@types/yargs@17.0.33", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA=="], + + "@types/yargs-parser": ["@types/yargs-parser@21.0.3", "", {}, "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ=="], + + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.34.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.34.1", "@typescript-eslint/type-utils": "8.34.1", "@typescript-eslint/utils": "8.34.1", "@typescript-eslint/visitor-keys": "8.34.1", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.34.1", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-STXcN6ebF6li4PxwNeFnqF8/2BNDvBupf2OPx2yWNzr6mKNGF7q49VM00Pz5FaomJyqvbXpY6PhO+T9w139YEQ=="], + + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.34.1", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.34.1", "@typescript-eslint/types": "8.34.1", "@typescript-eslint/typescript-estree": "8.34.1", "@typescript-eslint/visitor-keys": "8.34.1", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-4O3idHxhyzjClSMJ0a29AcoK0+YwnEqzI6oz3vlRf3xw0zbzt15MzXwItOlnr5nIth6zlY2RENLsOPvhyrKAQA=="], + + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.34.1", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.34.1", "@typescript-eslint/types": "^8.34.1", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-nuHlOmFZfuRwLJKDGQOVc0xnQrAmuq1Mj/ISou5044y1ajGNp2BNliIqp7F2LPQ5sForz8lempMFCovfeS1XoA=="], + + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.34.1", "", { "dependencies": { "@typescript-eslint/types": "8.34.1", "@typescript-eslint/visitor-keys": "8.34.1" } }, "sha512-beu6o6QY4hJAgL1E8RaXNC071G4Kso2MGmJskCFQhRhg8VOH/FDbC8soP8NHN7e/Hdphwp8G8cE6OBzC8o41ZA=="], + + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.34.1", "", { "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-K4Sjdo4/xF9NEeA2khOb7Y5nY6NSXBnod87uniVYW9kHP+hNlDV8trUSFeynA2uxWam4gIWgWoygPrv9VMWrYg=="], + + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.34.1", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.34.1", "@typescript-eslint/utils": "8.34.1", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-Tv7tCCr6e5m8hP4+xFugcrwTOucB8lshffJ6zf1mF1TbU67R+ntCc6DzLNKM+s/uzDyv8gLq7tufaAhIBYeV8g=="], + + "@typescript-eslint/types": ["@typescript-eslint/types@8.34.1", "", {}, "sha512-rjLVbmE7HR18kDsjNIZQHxmv9RZwlgzavryL5Lnj2ujIRTeXlKtILHgRNmQ3j4daw7zd+mQgy+uyt6Zo6I0IGA=="], + + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.34.1", "", { "dependencies": { "@typescript-eslint/project-service": "8.34.1", "@typescript-eslint/tsconfig-utils": "8.34.1", "@typescript-eslint/types": "8.34.1", "@typescript-eslint/visitor-keys": "8.34.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-rjCNqqYPuMUF5ODD+hWBNmOitjBWghkGKJg6hiCHzUvXRy6rK22Jd3rwbP2Xi+R7oYVvIKhokHVhH41BxPV5mA=="], + + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.34.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.34.1", "@typescript-eslint/types": "8.34.1", "@typescript-eslint/typescript-estree": "8.34.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-mqOwUdZ3KjtGk7xJJnLbHxTuWVn3GO2WZZuM+Slhkun4+qthLdXx32C8xIXbO1kfCECb3jIs3eoxK3eryk7aoQ=="], + + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.34.1", "", { "dependencies": { "@typescript-eslint/types": "8.34.1", "eslint-visitor-keys": "^4.2.1" } }, "sha512-xoh5rJ+tgsRKoXnkBPFRLZ7rjKM0AfVbC68UZ/ECXoDbfggb9RbEySN359acY1vS3qZ0jVTVWzbtfapwm5ztxw=="], + + "@unrs/resolver-binding-android-arm-eabi": ["@unrs/resolver-binding-android-arm-eabi@1.9.0", "", { "os": "android", "cpu": "arm" }, "sha512-h1T2c2Di49ekF2TE8ZCoJkb+jwETKUIPDJ/nO3tJBKlLFPu+fyd93f0rGP/BvArKx2k2HlRM4kqkNarj3dvZlg=="], + + "@unrs/resolver-binding-android-arm64": ["@unrs/resolver-binding-android-arm64@1.9.0", "", { "os": "android", "cpu": "arm64" }, "sha512-sG1NHtgXtX8owEkJ11yn34vt0Xqzi3k9TJ8zppDmyG8GZV4kVWw44FHwKwHeEFl07uKPeC4ZoyuQaGh5ruJYPA=="], + + "@unrs/resolver-binding-darwin-arm64": ["@unrs/resolver-binding-darwin-arm64@1.9.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-nJ9z47kfFnCxN1z/oYZS7HSNsFh43y2asePzTEZpEvK7kGyuShSl3RRXnm/1QaqFL+iP+BjMwuB+DYUymOkA5A=="], + + "@unrs/resolver-binding-darwin-x64": ["@unrs/resolver-binding-darwin-x64@1.9.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-TK+UA1TTa0qS53rjWn7cVlEKVGz2B6JYe0C++TdQjvWYIyx83ruwh0wd4LRxYBM5HeuAzXcylA9BH2trARXJTw=="], + + "@unrs/resolver-binding-freebsd-x64": ["@unrs/resolver-binding-freebsd-x64@1.9.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-6uZwzMRFcD7CcCd0vz3Hp+9qIL2jseE/bx3ZjaLwn8t714nYGwiE84WpaMCYjU+IQET8Vu/+BNAGtYD7BG/0yA=="], + + "@unrs/resolver-binding-linux-arm-gnueabihf": ["@unrs/resolver-binding-linux-arm-gnueabihf@1.9.0", "", { "os": "linux", "cpu": "arm" }, "sha512-bPUBksQfrgcfv2+mm+AZinaKq8LCFvt5PThYqRotqSuuZK1TVKkhbVMS/jvSRfYl7jr3AoZLYbDkItxgqMKRkg=="], + + "@unrs/resolver-binding-linux-arm-musleabihf": ["@unrs/resolver-binding-linux-arm-musleabihf@1.9.0", "", { "os": "linux", "cpu": "arm" }, "sha512-uT6E7UBIrTdCsFQ+y0tQd3g5oudmrS/hds5pbU3h4s2t/1vsGWbbSKhBSCD9mcqaqkBwoqlECpUrRJCmldl8PA=="], + + "@unrs/resolver-binding-linux-arm64-gnu": ["@unrs/resolver-binding-linux-arm64-gnu@1.9.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-vdqBh911wc5awE2bX2zx3eflbyv8U9xbE/jVKAm425eRoOVv/VseGZsqi3A3SykckSpF4wSROkbQPvbQFn8EsA=="], + + "@unrs/resolver-binding-linux-arm64-musl": ["@unrs/resolver-binding-linux-arm64-musl@1.9.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-/8JFZ/SnuDr1lLEVsxsuVwrsGquTvT51RZGvyDB/dOK3oYK2UqeXzgeyq6Otp8FZXQcEYqJwxb9v+gtdXn03eQ=="], + + "@unrs/resolver-binding-linux-ppc64-gnu": ["@unrs/resolver-binding-linux-ppc64-gnu@1.9.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-FkJjybtrl+rajTw4loI3L6YqSOpeZfDls4SstL/5lsP2bka9TiHUjgMBjygeZEis1oC8LfJTS8FSgpKPaQx2tQ=="], + + "@unrs/resolver-binding-linux-riscv64-gnu": ["@unrs/resolver-binding-linux-riscv64-gnu@1.9.0", "", { "os": "linux", "cpu": "none" }, "sha512-w/NZfHNeDusbqSZ8r/hp8iL4S39h4+vQMc9/vvzuIKMWKppyUGKm3IST0Qv0aOZ1rzIbl9SrDeIqK86ZpUK37w=="], + + "@unrs/resolver-binding-linux-riscv64-musl": ["@unrs/resolver-binding-linux-riscv64-musl@1.9.0", "", { "os": "linux", "cpu": "none" }, "sha512-bEPBosut8/8KQbUixPry8zg/fOzVOWyvwzOfz0C0Rw6dp+wIBseyiHKjkcSyZKv/98edrbMknBaMNJfA/UEdqw=="], + + "@unrs/resolver-binding-linux-s390x-gnu": ["@unrs/resolver-binding-linux-s390x-gnu@1.9.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-LDtMT7moE3gK753gG4pc31AAqGUC86j3AplaFusc717EUGF9ZFJ356sdQzzZzkBk1XzMdxFyZ4f/i35NKM/lFA=="], + + "@unrs/resolver-binding-linux-x64-gnu": ["@unrs/resolver-binding-linux-x64-gnu@1.9.0", "", { "os": "linux", "cpu": "x64" }, "sha512-WmFd5KINHIXj8o1mPaT8QRjA9HgSXhN1gl9Da4IZihARihEnOylu4co7i/yeaIpcfsI6sYs33cNZKyHYDh0lrA=="], + + "@unrs/resolver-binding-linux-x64-musl": ["@unrs/resolver-binding-linux-x64-musl@1.9.0", "", { "os": "linux", "cpu": "x64" }, "sha512-CYuXbANW+WgzVRIl8/QvZmDaZxrqvOldOwlbUjIM4pQ46FJ0W5cinJ/Ghwa/Ng1ZPMJMk1VFdsD/XwmCGIXBWg=="], + + "@unrs/resolver-binding-wasm32-wasi": ["@unrs/resolver-binding-wasm32-wasi@1.9.0", "", { "dependencies": { "@napi-rs/wasm-runtime": "^0.2.11" }, "cpu": "none" }, "sha512-6Rp2WH0OoitMYR57Z6VE8Y6corX8C6QEMWLgOV6qXiJIeZ1F9WGXY/yQ8yDC4iTraotyLOeJ2Asea0urWj2fKQ=="], + + "@unrs/resolver-binding-win32-arm64-msvc": ["@unrs/resolver-binding-win32-arm64-msvc@1.9.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-rknkrTRuvujprrbPmGeHi8wYWxmNVlBoNW8+4XF2hXUnASOjmuC9FNF1tGbDiRQWn264q9U/oGtixyO3BT8adQ=="], + + "@unrs/resolver-binding-win32-ia32-msvc": ["@unrs/resolver-binding-win32-ia32-msvc@1.9.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-Ceymm+iBl+bgAICtgiHyMLz6hjxmLJKqBim8tDzpX61wpZOx2bPK6Gjuor7I2RiUynVjvvkoRIkrPyMwzBzF3A=="], + + "@unrs/resolver-binding-win32-x64-msvc": ["@unrs/resolver-binding-win32-x64-msvc@1.9.0", "", { "os": "win32", "cpu": "x64" }, "sha512-k59o9ZyeyS0hAlcaKFezYSH2agQeRFEB7KoQLXl3Nb3rgkqT1NY9Vwy+SqODiLmYnEjxWJVRE/yq2jFVqdIxZw=="], + + "@urql/core": ["@urql/core@5.1.1", "", { "dependencies": { "@0no-co/graphql.web": "^1.0.5", "wonka": "^6.3.2" } }, "sha512-aGh024z5v2oINGD/In6rAtVKTm4VmQ2TxKQBAtk2ZSME5dunZFcjltw4p5ENQg+5CBhZ3FHMzl0Oa+rwqiWqlg=="], + + "@urql/exchange-retry": ["@urql/exchange-retry@1.3.1", "", { "dependencies": { "@urql/core": "^5.1.1", "wonka": "^6.3.2" } }, "sha512-EEmtFu8JTuwsInqMakhLq+U3qN8ZMd5V3pX44q0EqD2imqTDsa8ikZqJ1schVrN8HljOdN+C08cwZ1/r5uIgLw=="], + + "@vitejs/plugin-react-swc": ["@vitejs/plugin-react-swc@3.10.2", "", { "dependencies": { "@rolldown/pluginutils": "1.0.0-beta.11", "@swc/core": "^1.11.31" }, "peerDependencies": { "vite": "^4 || ^5 || ^6 || ^7.0.0-beta.0" } }, "sha512-xD3Rdvrt5LgANug7WekBn1KhcvLn1H3jNBfJRL3reeOIua/WnZOEV5qi5qIBq5T8R0jUDmRtxuvk4bPhzGHDWw=="], + + "@vitest/expect": ["@vitest/expect@2.1.8", "", { "dependencies": { "@vitest/spy": "2.1.8", "@vitest/utils": "2.1.8", "chai": "^5.1.2", "tinyrainbow": "^1.2.0" } }, "sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw=="], + + "@vitest/mocker": ["@vitest/mocker@2.1.8", "", { "dependencies": { "@vitest/spy": "2.1.8", "estree-walker": "^3.0.3", "magic-string": "^0.30.12" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^5.0.0" }, "optionalPeers": ["msw", "vite"] }, "sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA=="], + + "@vitest/pretty-format": ["@vitest/pretty-format@2.1.9", "", { "dependencies": { "tinyrainbow": "^1.2.0" } }, "sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ=="], + + "@vitest/runner": ["@vitest/runner@2.1.9", "", { "dependencies": { "@vitest/utils": "2.1.9", "pathe": "^1.1.2" } }, "sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g=="], + + "@vitest/snapshot": ["@vitest/snapshot@2.1.9", "", { "dependencies": { "@vitest/pretty-format": "2.1.9", "magic-string": "^0.30.12", "pathe": "^1.1.2" } }, "sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ=="], + + "@vitest/spy": ["@vitest/spy@2.1.8", "", { "dependencies": { "tinyspy": "^3.0.2" } }, "sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg=="], + + "@vitest/ui": ["@vitest/ui@3.2.4", "", { "dependencies": { "@vitest/utils": "3.2.4", "fflate": "^0.8.2", "flatted": "^3.3.3", "pathe": "^2.0.3", "sirv": "^3.0.1", "tinyglobby": "^0.2.14", "tinyrainbow": "^2.0.0" }, "peerDependencies": { "vitest": "3.2.4" } }, "sha512-hGISOaP18plkzbWEcP/QvtRW1xDXF2+96HbEX6byqQhAUbiS5oH6/9JwW+QsQCIYON2bI6QZBF+2PvOmrRZ9wA=="], + + "@vitest/utils": ["@vitest/utils@2.1.8", "", { "dependencies": { "@vitest/pretty-format": "2.1.8", "loupe": "^3.1.2", "tinyrainbow": "^1.2.0" } }, "sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA=="], + + "@webassemblyjs/ast": ["@webassemblyjs/ast@1.14.1", "", { "dependencies": { "@webassemblyjs/helper-numbers": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ=="], + + "@webassemblyjs/floating-point-hex-parser": ["@webassemblyjs/floating-point-hex-parser@1.13.2", "", {}, "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA=="], + + "@webassemblyjs/helper-api-error": ["@webassemblyjs/helper-api-error@1.13.2", "", {}, "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ=="], + + "@webassemblyjs/helper-buffer": ["@webassemblyjs/helper-buffer@1.14.1", "", {}, "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA=="], + + "@webassemblyjs/helper-numbers": ["@webassemblyjs/helper-numbers@1.13.2", "", { "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.13.2", "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA=="], + + "@webassemblyjs/helper-wasm-bytecode": ["@webassemblyjs/helper-wasm-bytecode@1.13.2", "", {}, "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA=="], + + "@webassemblyjs/helper-wasm-section": ["@webassemblyjs/helper-wasm-section@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", "@webassemblyjs/wasm-gen": "1.14.1" } }, "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw=="], + + "@webassemblyjs/ieee754": ["@webassemblyjs/ieee754@1.13.2", "", { "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw=="], + + "@webassemblyjs/leb128": ["@webassemblyjs/leb128@1.13.2", "", { "dependencies": { "@xtuc/long": "4.2.2" } }, "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw=="], + + "@webassemblyjs/utf8": ["@webassemblyjs/utf8@1.13.2", "", {}, "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ=="], + + "@webassemblyjs/wasm-edit": ["@webassemblyjs/wasm-edit@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", "@webassemblyjs/helper-wasm-section": "1.14.1", "@webassemblyjs/wasm-gen": "1.14.1", "@webassemblyjs/wasm-opt": "1.14.1", "@webassemblyjs/wasm-parser": "1.14.1", "@webassemblyjs/wast-printer": "1.14.1" } }, "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ=="], + + "@webassemblyjs/wasm-gen": ["@webassemblyjs/wasm-gen@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", "@webassemblyjs/ieee754": "1.13.2", "@webassemblyjs/leb128": "1.13.2", "@webassemblyjs/utf8": "1.13.2" } }, "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg=="], + + "@webassemblyjs/wasm-opt": ["@webassemblyjs/wasm-opt@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", "@webassemblyjs/wasm-gen": "1.14.1", "@webassemblyjs/wasm-parser": "1.14.1" } }, "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw=="], + + "@webassemblyjs/wasm-parser": ["@webassemblyjs/wasm-parser@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-api-error": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", "@webassemblyjs/ieee754": "1.13.2", "@webassemblyjs/leb128": "1.13.2", "@webassemblyjs/utf8": "1.13.2" } }, "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ=="], + + "@webassemblyjs/wast-printer": ["@webassemblyjs/wast-printer@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw=="], + + "@xata.io/client": ["@xata.io/client@0.0.0-next.vfbf85e03c9dbded87f0e347cc3850e811f46ef97", "", { "peerDependencies": { "typescript": ">=4.5" } }, "sha512-MBIr8jKL5R07fkoA2P0Fc3pecfT6eD9+3aruL5GYjfSzVIPxvc5slnbA6lQQw8/C8jgV5G+KiG21YQy7HACzmg=="], + + "@xmldom/xmldom": ["@xmldom/xmldom@0.8.10", "", {}, "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw=="], + + "@xtuc/ieee754": ["@xtuc/ieee754@1.2.0", "", {}, "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="], + + "@xtuc/long": ["@xtuc/long@4.2.2", "", {}, "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="], + + "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="], + + "accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="], + + "acorn": ["acorn@8.14.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="], + + "acorn-import-attributes": ["acorn-import-attributes@1.9.5", "", { "peerDependencies": { "acorn": "^8" } }, "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ=="], + + "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], + + "acorn-walk": ["acorn-walk@8.3.2", "", {}, "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A=="], + + "agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="], + + "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + + "ajv-formats": ["ajv-formats@2.1.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA=="], + + "ajv-keywords": ["ajv-keywords@3.5.2", "", { "peerDependencies": { "ajv": "^6.9.1" } }, "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="], + + "anser": ["anser@1.4.10", "", {}, "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww=="], + + "ansi-escapes": ["ansi-escapes@4.3.2", "", { "dependencies": { "type-fest": "^0.21.3" } }, "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ=="], + + "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "ansi-styles": ["ansi-styles@2.2.1", "", {}, "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA=="], + + "any-promise": ["any-promise@1.3.0", "", {}, "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="], + + "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], + + "arg": ["arg@5.0.2", "", {}, "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="], + + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "aria-query": ["aria-query@5.3.0", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A=="], + + "array-buffer-byte-length": ["array-buffer-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" } }, "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw=="], + + "array-flatten": ["array-flatten@1.1.1", "", {}, "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="], + + "array-includes": ["array-includes@3.1.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.24.0", "es-object-atoms": "^1.1.1", "get-intrinsic": "^1.3.0", "is-string": "^1.1.1", "math-intrinsics": "^1.1.0" } }, "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ=="], + + "array-timsort": ["array-timsort@1.0.3", "", {}, "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ=="], + + "array.prototype.findlast": ["array.prototype.findlast@1.2.5", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ=="], + + "array.prototype.findlastindex": ["array.prototype.findlastindex@1.2.6", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-shim-unscopables": "^1.1.0" } }, "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ=="], + + "array.prototype.flat": ["array.prototype.flat@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg=="], + + "array.prototype.flatmap": ["array.prototype.flatmap@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg=="], + + "array.prototype.tosorted": ["array.prototype.tosorted@1.1.4", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.3", "es-errors": "^1.3.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA=="], + + "arraybuffer.prototype.slice": ["arraybuffer.prototype.slice@1.0.4", "", { "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "is-array-buffer": "^3.0.4" } }, "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ=="], + + "as-table": ["as-table@1.0.55", "", { "dependencies": { "printable-characters": "^1.0.42" } }, "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ=="], + + "asap": ["asap@2.0.6", "", {}, "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA=="], + + "asn1": ["asn1@0.2.6", "", { "dependencies": { "safer-buffer": "~2.1.0" } }, "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ=="], + + "assert": ["assert@2.1.0", "", { "dependencies": { "call-bind": "^1.0.2", "is-nan": "^1.3.2", "object-is": "^1.1.5", "object.assign": "^4.1.4", "util": "^0.12.5" } }, "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw=="], + + "assert-plus": ["assert-plus@1.0.0", "", {}, "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw=="], + + "assertion-error": ["assertion-error@2.0.1", "", {}, "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA=="], + + "ast-types": ["ast-types@0.16.1", "", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg=="], + + "astral-regex": ["astral-regex@2.0.0", "", {}, "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="], + + "astring": ["astring@1.9.0", "", { "bin": { "astring": "bin/astring" } }, "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg=="], + + "async-function": ["async-function@1.0.0", "", {}, "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA=="], + + "async-limiter": ["async-limiter@1.0.1", "", {}, "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="], + + "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], + + "atomic-sleep": ["atomic-sleep@1.0.0", "", {}, "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ=="], + + "attr-accept": ["attr-accept@1.1.3", "", { "dependencies": { "core-js": "^2.5.0" } }, "sha512-iT40nudw8zmCweivz6j58g+RT33I4KbaIvRUhjNmDwO2WmsQUxFEZZYZ5w3vXe5x5MX9D7mfvA/XaLOZYFR9EQ=="], + + "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], + + "await-lock": ["await-lock@2.2.2", "", {}, "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw=="], + + "aws-sign2": ["aws-sign2@0.7.0", "", {}, "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA=="], + + "aws4": ["aws4@1.13.2", "", {}, "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw=="], + + "axios": ["axios@1.10.0", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw=="], + + "babel-jest": ["babel-jest@29.7.0", "", { "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" }, "peerDependencies": { "@babel/core": "^7.8.0" } }, "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg=="], + + "babel-loader": ["babel-loader@8.4.1", "", { "dependencies": { "find-cache-dir": "^3.3.1", "loader-utils": "^2.0.4", "make-dir": "^3.1.0", "schema-utils": "^2.6.5" }, "peerDependencies": { "@babel/core": "^7.0.0", "webpack": ">=2" } }, "sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA=="], + + "babel-plugin-istanbul": ["babel-plugin-istanbul@6.1.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-instrument": "^5.0.4", "test-exclude": "^6.0.0" } }, "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA=="], + + "babel-plugin-jest-hoist": ["babel-plugin-jest-hoist@29.6.3", "", { "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", "@types/babel__core": "^7.1.14", "@types/babel__traverse": "^7.0.6" } }, "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg=="], + + "babel-plugin-macros": ["babel-plugin-macros@3.1.0", "", { "dependencies": { "@babel/runtime": "^7.12.5", "cosmiconfig": "^7.0.0", "resolve": "^1.19.0" } }, "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg=="], + + "babel-plugin-polyfill-corejs2": ["babel-plugin-polyfill-corejs2@0.4.13", "", { "dependencies": { "@babel/compat-data": "^7.22.6", "@babel/helper-define-polyfill-provider": "^0.6.4", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g=="], + + "babel-plugin-polyfill-corejs3": ["babel-plugin-polyfill-corejs3@0.11.1", "", { "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.3", "core-js-compat": "^3.40.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ=="], + + "babel-plugin-polyfill-regenerator": ["babel-plugin-polyfill-regenerator@0.6.4", "", { "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.4" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw=="], + + "babel-plugin-react-native-web": ["babel-plugin-react-native-web@0.19.13", "", {}, "sha512-4hHoto6xaN23LCyZgL9LJZc3olmAxd7b6jDzlZnKXAh4rRAbZRKNBJoOOdp46OBqgy+K0t0guTj5/mhA8inymQ=="], + + "babel-plugin-syntax-hermes-parser": ["babel-plugin-syntax-hermes-parser@0.25.1", "", { "dependencies": { "hermes-parser": "0.25.1" } }, "sha512-IVNpGzboFLfXZUAwkLFcI/bnqVbwky0jP3eBno4HKtqvQJAHBLdgxiG6lQ4to0+Q/YCN3PO0od5NZwIKyY4REQ=="], + + "babel-plugin-transform-flow-enums": ["babel-plugin-transform-flow-enums@0.0.2", "", { "dependencies": { "@babel/plugin-syntax-flow": "^7.12.1" } }, "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ=="], + + "babel-preset-current-node-syntax": ["babel-preset-current-node-syntax@1.1.0", "", { "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-import-attributes": "^7.24.7", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw=="], + + "babel-preset-expo": ["babel-preset-expo@13.2.0", "", { "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/plugin-proposal-decorators": "^7.12.9", "@babel/plugin-proposal-export-default-from": "^7.24.7", "@babel/plugin-syntax-export-default-from": "^7.24.7", "@babel/plugin-transform-export-namespace-from": "^7.25.9", "@babel/plugin-transform-flow-strip-types": "^7.25.2", "@babel/plugin-transform-modules-commonjs": "^7.24.8", "@babel/plugin-transform-object-rest-spread": "^7.24.7", "@babel/plugin-transform-parameters": "^7.24.7", "@babel/plugin-transform-private-methods": "^7.24.7", "@babel/plugin-transform-private-property-in-object": "^7.24.7", "@babel/plugin-transform-runtime": "^7.24.7", "@babel/preset-react": "^7.22.15", "@babel/preset-typescript": "^7.23.0", "@react-native/babel-preset": "0.79.3", "babel-plugin-react-native-web": "~0.19.13", "babel-plugin-syntax-hermes-parser": "^0.25.1", "babel-plugin-transform-flow-enums": "^0.0.2", "debug": "^4.3.4", "react-refresh": "^0.14.2", "resolve-from": "^5.0.0" }, "peerDependencies": { "babel-plugin-react-compiler": "^19.0.0-beta-e993439-20250405" }, "optionalPeers": ["babel-plugin-react-compiler"] }, "sha512-oNUeUZPMNRPmx/2jaKJLSQFP/MFI1M91vP+Gp+j8/FPl9p/ps603DNwCaRdcT/Vj3FfREdlIwRio1qDCjY0oAA=="], + + "babel-preset-jest": ["babel-preset-jest@29.6.3", "", { "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], + + "baseui": ["baseui@15.0.0", "", { "dependencies": { "@date-io/date-fns": "^2.13.1", "@date-io/moment": "^2.13.1", "baseui": "^14.0.0", "card-validator": "^6.2.0", "csstype": "2.6.11", "d3": "^6.7.0", "d3-array": "2.4.0", "date-fns": "^2.28.0", "date-fns-tz": "^1.2.2", "just-extend": "4.1.1", "memoize-one": "5.0.0", "mockdate": "2.0.5", "moment": "^2.29.4", "polished": "^4.2.2", "popper.js": "^1.16.1", "prop-types": "^15.8.1", "react-dropzone": "9.0.0", "react-focus-lock": "^2.8.1", "react-hook-form": "^7.30.0", "react-input-mask": "^2.0.4", "react-is": "^17.0.2", "react-map-gl": "5.2.13", "react-movable": "^3.0.4", "react-multi-ref": "^1.0.0", "react-range": "^1.8.12", "react-uid": "2.3.0", "react-virtualized": "^9.22.3", "react-virtualized-auto-sizer": "1.0.2", "react-window": "1.8.5", "resize-observer-polyfill": "1.5.1", "styletron-standard": "^3.1.0" }, "peerDependencies": { "react": ">=18", "react-dom": ">=18", "styletron-react": "^6.1.1" } }, "sha512-MhWHo1lL96RU8lS1v8mRqbmoWynmZv4FzVC33enkbmFGrcjdkRbsUaFgq5S+dUQPXsty9k1URdWNmg901wHOlg=="], + + "bcrypt-pbkdf": ["bcrypt-pbkdf@1.0.2", "", { "dependencies": { "tweetnacl": "^0.14.3" } }, "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w=="], + + "better-opn": ["better-opn@3.0.2", "", { "dependencies": { "open": "^8.0.4" } }, "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ=="], + + "better-sqlite3": ["better-sqlite3@11.10.0", "", { "dependencies": { "bindings": "^1.5.0", "prebuild-install": "^7.1.1" } }, "sha512-EwhOpyXiOEL/lKzHz9AW1msWFNzGc/z+LzeB3/jnFJpxu+th2yqvzsSWas1v9jgs9+xiXJcD5A8CJxAG2TaghQ=="], + + "big-integer": ["big-integer@1.6.52", "", {}, "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg=="], + + "big.js": ["big.js@5.2.2", "", {}, "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ=="], + + "bignumber.js": ["bignumber.js@9.3.0", "", {}, "sha512-EM7aMFTXbptt/wZdMlBv2t8IViwQL+h6SLHosp8Yf0dqJMTnY6iL32opnAB6kAdL0SZPuvcAzFr31o0c/R3/RA=="], + + "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], + + "bindings": ["bindings@1.5.0", "", { "dependencies": { "file-uri-to-path": "1.0.0" } }, "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ=="], + + "biome": ["biome@0.3.3", "", { "dependencies": { "bluebird": "^3.4.1", "chalk": "^1.1.3", "commander": "^2.9.0", "editor": "^1.0.0", "fs-promise": "^0.5.0", "inquirer-promise": "0.0.3", "request-promise": "^3.0.0", "untildify": "^3.0.2", "user-home": "^2.0.0" }, "bin": { "biome": "./dist/index.js" } }, "sha512-4LXjrQYbn9iTXu9Y4SKT7ABzTV0WnLDHCVSd2fPUOKsy1gQ+E4xPFmlY1zcWexoi0j7fGHItlL6OWA2CZ/yYAQ=="], + + "birpc": ["birpc@0.2.14", "", {}, "sha512-37FHE8rqsYM5JEKCnXFyHpBCzvgHEExwVVTq+nUmloInU7l8ezD1TpOhKpS8oe1DTYFqEK27rFZVKG43oTqXRA=="], + + "bl": ["bl@4.1.0", "", { "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w=="], + + "blake3-wasm": ["blake3-wasm@2.1.5", "", {}, "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g=="], + + "bluebird": ["bluebird@3.7.2", "", {}, "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="], + + "body-parser": ["body-parser@2.2.0", "", { "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", "debug": "^4.4.0", "http-errors": "^2.0.0", "iconv-lite": "^0.6.3", "on-finished": "^2.4.1", "qs": "^6.14.0", "raw-body": "^3.0.0", "type-is": "^2.0.0" } }, "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg=="], + + "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="], + + "bplist-creator": ["bplist-creator@0.1.0", "", { "dependencies": { "stream-buffers": "2.2.x" } }, "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg=="], + + "bplist-parser": ["bplist-parser@0.3.2", "", { "dependencies": { "big-integer": "1.6.x" } }, "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ=="], + + "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "browser-assert": ["browser-assert@1.2.1", "", {}, "sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ=="], + + "browserslist": ["browserslist@4.25.0", "", { "dependencies": { "caniuse-lite": "^1.0.30001718", "electron-to-chromium": "^1.5.160", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA=="], + + "bser": ["bser@2.1.1", "", { "dependencies": { "node-int64": "^0.4.0" } }, "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ=="], + + "buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], + + "buffer-equal-constant-time": ["buffer-equal-constant-time@1.0.1", "", {}, "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="], + + "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], + + "bundle-name": ["bundle-name@4.1.0", "", { "dependencies": { "run-applescript": "^7.0.0" } }, "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q=="], + + "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], + + "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="], + + "call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="], + + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], + + "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + + "caller-callsite": ["caller-callsite@2.0.0", "", { "dependencies": { "callsites": "^2.0.0" } }, "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ=="], + + "caller-path": ["caller-path@2.0.0", "", { "dependencies": { "caller-callsite": "^2.0.0" } }, "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A=="], + + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + + "camelcase": ["camelcase@6.3.0", "", {}, "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA=="], + + "camelcase-css": ["camelcase-css@2.0.1", "", {}, "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="], + + "camelize": ["camelize@1.0.1", "", {}, "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ=="], + + "caniuse-lite": ["caniuse-lite@1.0.30001723", "", {}, "sha512-1R/elMjtehrFejxwmexeXAtae5UO9iSyFn6G/I806CYC/BLyyBk1EPhrKBkWhy6wM6Xnm47dSJQec+tLJ39WHw=="], + + "card-validator": ["card-validator@6.2.0", "", { "dependencies": { "credit-card-type": "^8.0.0" } }, "sha512-1vYv45JaE9NmixZr4dl6ykzbFKv7imI9L7MQDs235b/a7EGbG8rrEsipeHtVvscLSUbl3RX6UP5gyOe0Y2FlHA=="], + + "caseless": ["caseless@0.12.0", "", {}, "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="], + + "cbor-extract": ["cbor-extract@2.2.0", "", { "dependencies": { "node-gyp-build-optional-packages": "5.1.1" }, "optionalDependencies": { "@cbor-extract/cbor-extract-darwin-arm64": "2.2.0", "@cbor-extract/cbor-extract-darwin-x64": "2.2.0", "@cbor-extract/cbor-extract-linux-arm": "2.2.0", "@cbor-extract/cbor-extract-linux-arm64": "2.2.0", "@cbor-extract/cbor-extract-linux-x64": "2.2.0", "@cbor-extract/cbor-extract-win32-x64": "2.2.0" }, "bin": { "download-cbor-prebuilds": "bin/download-prebuilds.js" } }, "sha512-Ig1zM66BjLfTXpNgKpvBePq271BPOvu8MR0Jl080yG7Jsl+wAZunfrwiwA+9ruzm/WEdIV5QF/bjDZTqyAIVHA=="], + + "cbor-x": ["cbor-x@1.6.0", "", { "optionalDependencies": { "cbor-extract": "^2.2.0" } }, "sha512-0kareyRwHSkL6ws5VXHEf8uY1liitysCVJjlmhaLG+IXLqhSaOO+t63coaso7yjwEzWZzLy8fJo06gZDVQM9Qg=="], + + "cborg": ["cborg@4.2.12", "", { "bin": { "cborg": "lib/bin.js" } }, "sha512-z126yLoavS75cdTuiKu61RC3Y3trqtDAgQRa5Q0dpHn1RmqhIedptWXKnk0lQ5yo/GmcV9myvIkzFgZ8GnqSog=="], + + "chai": ["chai@5.2.0", "", { "dependencies": { "assertion-error": "^2.0.1", "check-error": "^2.1.1", "deep-eql": "^5.0.1", "loupe": "^3.1.0", "pathval": "^2.0.0" } }, "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw=="], + + "chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="], + + "chanfana": ["chanfana@2.8.0", "", { "dependencies": { "@asteasolutions/zod-to-openapi": "^7.2.0", "js-yaml": "^4.1.0", "openapi3-ts": "^4.4.0", "zod": "^3.23.8" } }, "sha512-R0lY+c4lBVO8jnop9J5hY6W2Vq5YS3sb9NwI4nY2oJU65E38rC6LCNNhEVEITVmcn+EhuKIQK4FLJLW93gFG4g=="], + + "char-regex": ["char-regex@1.0.2", "", {}, "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw=="], + + "charenc": ["charenc@0.0.2", "", {}, "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA=="], + + "check-error": ["check-error@2.1.1", "", {}, "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw=="], + + "chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], + + "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], + + "chromatic": ["chromatic@11.29.0", "", { "peerDependencies": { "@chromatic-com/cypress": "^0.*.* || ^1.0.0", "@chromatic-com/playwright": "^0.*.* || ^1.0.0" }, "optionalPeers": ["@chromatic-com/cypress", "@chromatic-com/playwright"], "bin": { "chroma": "dist/bin.js", "chromatic": "dist/bin.js", "chromatic-cli": "dist/bin.js" } }, "sha512-yisBlntp9hHVj19lIQdpTlcYIXuU9H/DbFuu6tyWHmj6hWT2EtukCCcxYXL78XdQt1vm2GfIrtgtKpj/Rzmo4A=="], + + "chrome-launcher": ["chrome-launcher@0.15.2", "", { "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", "is-wsl": "^2.2.0", "lighthouse-logger": "^1.0.0" }, "bin": { "print-chrome-path": "bin/print-chrome-path.js" } }, "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ=="], + + "chrome-trace-event": ["chrome-trace-event@1.0.4", "", {}, "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ=="], + + "chromium-edge-launcher": ["chromium-edge-launcher@0.2.0", "", { "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", "is-wsl": "^2.2.0", "lighthouse-logger": "^1.0.0", "mkdirp": "^1.0.4", "rimraf": "^3.0.2" } }, "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg=="], + + "ci-info": ["ci-info@3.9.0", "", {}, "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ=="], + + "cjs-module-lexer": ["cjs-module-lexer@1.4.3", "", {}, "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q=="], + + "cli-cursor": ["cli-cursor@1.0.2", "", { "dependencies": { "restore-cursor": "^1.0.1" } }, "sha512-25tABq090YNKkF6JH7lcwO0zFJTRke4Jcq9iX2nr/Sz0Cjjv4gckmwlW6Ty/aoyFd6z3ysR2hMGC2GFugmBo6A=="], + + "cli-spinners": ["cli-spinners@2.9.2", "", {}, "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg=="], + + "cli-width": ["cli-width@1.1.1", "", {}, "sha512-eMU2akIeEIkCxGXUNmDnJq1KzOIiPnJ+rKqRe6hcxE3vIOPvpMrBYOn/Bl7zNlYJj/zQxXquAnozHUCf9Whnsg=="], + + "client-only": ["client-only@0.0.1", "", {}, "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="], + + "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + + "clone": ["clone@1.0.4", "", {}, "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg=="], + + "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], + + "cluster-key-slot": ["cluster-key-slot@1.1.2", "", {}, "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA=="], + + "co": ["co@4.6.0", "", {}, "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ=="], + + "code-block-writer": ["code-block-writer@11.0.3", "", {}, "sha512-NiujjUFB4SwScJq2bwbYUtXbZhBSlY6vYzm++3Q6oC+U+injTqfPYFK8wS9COOmb2lueqp0ZRB4nK1VYeHgNyw=="], + + "code-point-at": ["code-point-at@1.1.0", "", {}, "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA=="], + + "collect-v8-coverage": ["collect-v8-coverage@1.0.2", "", {}, "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q=="], + + "color": ["color@4.2.3", "", { "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" } }, "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "color-string": ["color-string@1.9.1", "", { "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg=="], + + "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], + + "commander": ["commander@13.1.0", "", {}, "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw=="], + + "comment-json": ["comment-json@4.2.5", "", { "dependencies": { "array-timsort": "^1.0.3", "core-util-is": "^1.0.3", "esprima": "^4.0.1", "has-own-prop": "^2.0.0", "repeat-string": "^1.6.1" } }, "sha512-bKw/r35jR3HGt5PEPm1ljsQQGyCrR8sFGNiN5L+ykDHdpO8Smxkrkla9Yi6NkQyUrb8V54PGhfMs6NrIwtxtdw=="], + + "commondir": ["commondir@1.0.1", "", {}, "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg=="], + + "compressible": ["compressible@2.0.18", "", { "dependencies": { "mime-db": ">= 1.43.0 < 2" } }, "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg=="], + + "compression": ["compression@1.8.0", "", { "dependencies": { "bytes": "3.1.2", "compressible": "~2.0.18", "debug": "2.6.9", "negotiator": "~0.6.4", "on-headers": "~1.0.2", "safe-buffer": "5.2.1", "vary": "~1.1.2" } }, "sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA=="], + + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + + "confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], + + "connect": ["connect@3.7.0", "", { "dependencies": { "debug": "2.6.9", "finalhandler": "1.1.2", "parseurl": "~1.3.3", "utils-merge": "1.0.1" } }, "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ=="], + + "content-disposition": ["content-disposition@1.0.0", "", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg=="], + + "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="], + + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + + "cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], + + "cookie-es": ["cookie-es@1.2.2", "", {}, "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg=="], + + "cookie-signature": ["cookie-signature@1.2.2", "", {}, "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="], + + "copy-to-clipboard": ["copy-to-clipboard@3.3.3", "", { "dependencies": { "toggle-selection": "^1.0.6" } }, "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA=="], + + "core-js": ["core-js@3.43.0", "", {}, "sha512-N6wEbTTZSYOY2rYAn85CuvWWkCK6QweMn7/4Nr3w+gDBeBhk/x4EJeY6FPo4QzDoJZxVTv8U7CMvgWk6pOHHqA=="], + + "core-js-compat": ["core-js-compat@3.43.0", "", { "dependencies": { "browserslist": "^4.25.0" } }, "sha512-2GML2ZsCc5LR7hZYz4AXmjQw8zuy2T//2QntwdnpuYI7jteT6GVYJL7F6C2C57R7gSYrcqVW3lAALefdbhBLDA=="], + + "core-js-pure": ["core-js-pure@3.43.0", "", {}, "sha512-i/AgxU2+A+BbJdMxh3v7/vxi2SbFqxiFmg6VsDwYB4jkucrd1BZNA9a9gphC0fYMG5IBSgQcbQnk865VCLe7xA=="], + + "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], + + "cors": ["cors@2.8.5", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g=="], + + "cosmiconfig": ["cosmiconfig@7.1.0", "", { "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", "parse-json": "^5.0.0", "path-type": "^4.0.0", "yaml": "^1.10.0" } }, "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA=="], + + "create-jest": ["create-jest@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "jest-config": "^29.7.0", "jest-util": "^29.7.0", "prompts": "^2.0.1" }, "bin": { "create-jest": "bin/create-jest.js" } }, "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q=="], + + "credit-card-type": ["credit-card-type@8.3.0", "", {}, "sha512-czfZUpQ7W9CDxZL4yFLb1kFtM/q2lTOY975hL2aO+DC8+GRNDVSXVCHXhVFZPxiUKmQCZbFP8vIhxx5TBQaThw=="], + + "cross-fetch": ["cross-fetch@3.2.0", "", { "dependencies": { "node-fetch": "^2.7.0" } }, "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q=="], + + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "crossws": ["crossws@0.3.5", "", { "dependencies": { "uncrypto": "^0.1.3" } }, "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA=="], + + "crypt": ["crypt@0.0.2", "", {}, "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow=="], + + "crypto-random-string": ["crypto-random-string@2.0.0", "", {}, "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA=="], + + "css-color-keywords": ["css-color-keywords@1.0.0", "", {}, "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg=="], + + "css-in-js-utils": ["css-in-js-utils@2.0.1", "", { "dependencies": { "hyphenate-style-name": "^1.0.2", "isobject": "^3.0.1" } }, "sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA=="], + + "css-select": ["css-select@5.1.0", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg=="], + + "css-to-react-native": ["css-to-react-native@3.2.0", "", { "dependencies": { "camelize": "^1.0.0", "css-color-keywords": "^1.0.0", "postcss-value-parser": "^4.0.2" } }, "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ=="], + + "css-tree": ["css-tree@2.3.1", "", { "dependencies": { "mdn-data": "2.0.30", "source-map-js": "^1.0.1" } }, "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw=="], + + "css-what": ["css-what@6.1.0", "", {}, "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw=="], + + "css.escape": ["css.escape@1.5.1", "", {}, "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg=="], + + "csscolorparser": ["csscolorparser@1.0.3", "", {}, "sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w=="], + + "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], + + "csso": ["csso@5.0.5", "", { "dependencies": { "css-tree": "~2.2.0" } }, "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ=="], + + "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], + + "d3": ["d3@6.7.0", "", { "dependencies": { "d3-array": "2", "d3-axis": "2", "d3-brush": "2", "d3-chord": "2", "d3-color": "2", "d3-contour": "2", "d3-delaunay": "5", "d3-dispatch": "2", "d3-drag": "2", "d3-dsv": "2", "d3-ease": "2", "d3-fetch": "2", "d3-force": "2", "d3-format": "2", "d3-geo": "2", "d3-hierarchy": "2", "d3-interpolate": "2", "d3-path": "2", "d3-polygon": "2", "d3-quadtree": "2", "d3-random": "2", "d3-scale": "3", "d3-scale-chromatic": "2", "d3-selection": "2", "d3-shape": "2", "d3-time": "2", "d3-time-format": "3", "d3-timer": "2", "d3-transition": "2", "d3-zoom": "2" } }, "sha512-hNHRhe+yCDLUG6Q2LwvR/WdNFPOJQ5VWqsJcwIYVeI401+d2/rrCjxSXkiAdIlpx7/73eApFB4Olsmh3YN7a6g=="], + + "d3-array": ["d3-array@2.4.0", "", {}, "sha512-KQ41bAF2BMakf/HdKT865ALd4cgND6VcIztVQZUTt0+BH3RWy6ZYnHghVXf6NFjt2ritLr8H1T8LreAAlfiNcw=="], + + "d3-axis": ["d3-axis@2.1.0", "", {}, "sha512-z/G2TQMyuf0X3qP+Mh+2PimoJD41VOCjViJzT0BHeL/+JQAofkiWZbWxlwFGb1N8EN+Cl/CW+MUKbVzr1689Cw=="], + + "d3-brush": ["d3-brush@2.1.0", "", { "dependencies": { "d3-dispatch": "1 - 2", "d3-drag": "2", "d3-interpolate": "1 - 2", "d3-selection": "2", "d3-transition": "2" } }, "sha512-cHLLAFatBATyIKqZOkk/mDHUbzne2B3ZwxkzMHvFTCZCmLaXDpZRihQSn8UNXTkGD/3lb/W2sQz0etAftmHMJQ=="], + + "d3-chord": ["d3-chord@2.0.0", "", { "dependencies": { "d3-path": "1 - 2" } }, "sha512-D5PZb7EDsRNdGU4SsjQyKhja8Zgu+SHZfUSO5Ls8Wsn+jsAKUUGkcshLxMg9HDFxG3KqavGWaWkJ8EpU8ojuig=="], + + "d3-color": ["d3-color@2.0.0", "", {}, "sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ=="], + + "d3-contour": ["d3-contour@2.0.0", "", { "dependencies": { "d3-array": "2" } }, "sha512-9unAtvIaNk06UwqBmvsdHX7CZ+NPDZnn8TtNH1myW93pWJkhsV25JcgnYAu0Ck5Veb1DHiCv++Ic5uvJ+h50JA=="], + + "d3-delaunay": ["d3-delaunay@5.3.0", "", { "dependencies": { "delaunator": "4" } }, "sha512-amALSrOllWVLaHTnDLHwMIiz0d1bBu9gZXd1FiLfXf8sHcX9jrcj81TVZOqD4UX7MgBZZ07c8GxzEgBpJqc74w=="], + + "d3-dispatch": ["d3-dispatch@2.0.0", "", {}, "sha512-S/m2VsXI7gAti2pBoLClFFTMOO1HTtT0j99AuXLoGFKO6deHDdnv6ZGTxSTTUTgO1zVcv82fCOtDjYK4EECmWA=="], + + "d3-drag": ["d3-drag@2.0.0", "", { "dependencies": { "d3-dispatch": "1 - 2", "d3-selection": "2" } }, "sha512-g9y9WbMnF5uqB9qKqwIIa/921RYWzlUDv9Jl1/yONQwxbOfszAWTCm8u7HOTgJgRDXiRZN56cHT9pd24dmXs8w=="], + + "d3-dsv": ["d3-dsv@2.0.0", "", { "dependencies": { "commander": "2", "iconv-lite": "0.4", "rw": "1" }, "bin": { "csv2json": "bin/dsv2json", "csv2tsv": "bin/dsv2dsv", "dsv2dsv": "bin/dsv2dsv", "dsv2json": "bin/dsv2json", "json2csv": "bin/json2dsv", "json2dsv": "bin/json2dsv", "json2tsv": "bin/json2dsv", "tsv2csv": "bin/dsv2dsv", "tsv2json": "bin/dsv2json" } }, "sha512-E+Pn8UJYx9mViuIUkoc93gJGGYut6mSDKy2+XaPwccwkRGlR+LO97L2VCCRjQivTwLHkSnAJG7yo00BWY6QM+w=="], + + "d3-ease": ["d3-ease@2.0.0", "", {}, "sha512-68/n9JWarxXkOWMshcT5IcjbB+agblQUaIsbnXmrzejn2O82n3p2A9R2zEB9HIEFWKFwPAEDDN8gR0VdSAyyAQ=="], + + "d3-fetch": ["d3-fetch@2.0.0", "", { "dependencies": { "d3-dsv": "1 - 2" } }, "sha512-TkYv/hjXgCryBeNKiclrwqZH7Nb+GaOwo3Neg24ZVWA3MKB+Rd+BY84Nh6tmNEMcjUik1CSUWjXYndmeO6F7sw=="], + + "d3-force": ["d3-force@2.1.1", "", { "dependencies": { "d3-dispatch": "1 - 2", "d3-quadtree": "1 - 2", "d3-timer": "1 - 2" } }, "sha512-nAuHEzBqMvpFVMf9OX75d00OxvOXdxY+xECIXjW6Gv8BRrXu6gAWbv/9XKrvfJ5i5DCokDW7RYE50LRoK092ew=="], + + "d3-format": ["d3-format@2.0.0", "", {}, "sha512-Ab3S6XuE/Q+flY96HXT0jOXcM4EAClYFnRGY5zsjRGNy6qCYrQsMffs7cV5Q9xejb35zxW5hf/guKw34kvIKsA=="], + + "d3-geo": ["d3-geo@2.0.2", "", { "dependencies": { "d3-array": "^2.5.0" } }, "sha512-8pM1WGMLGFuhq9S+FpPURxic+gKzjluCD/CHTuUF3mXMeiCo0i6R0tO1s4+GArRFde96SLcW/kOFRjoAosPsFA=="], + + "d3-hierarchy": ["d3-hierarchy@2.0.0", "", {}, "sha512-SwIdqM3HxQX2214EG9GTjgmCc/mbSx4mQBn+DuEETubhOw6/U3fmnji4uCVrmzOydMHSO1nZle5gh6HB/wdOzw=="], + + "d3-interpolate": ["d3-interpolate@2.0.1", "", { "dependencies": { "d3-color": "1 - 2" } }, "sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ=="], + + "d3-path": ["d3-path@2.0.0", "", {}, "sha512-ZwZQxKhBnv9yHaiWd6ZU4x5BtCQ7pXszEV9CU6kRgwIQVQGLMv1oiL4M+MK/n79sYzsj+gcgpPQSctJUsLN7fA=="], + + "d3-polygon": ["d3-polygon@2.0.0", "", {}, "sha512-MsexrCK38cTGermELs0cO1d79DcTsQRN7IWMJKczD/2kBjzNXxLUWP33qRF6VDpiLV/4EI4r6Gs0DAWQkE8pSQ=="], + + "d3-quadtree": ["d3-quadtree@2.0.0", "", {}, "sha512-b0Ed2t1UUalJpc3qXzKi+cPGxeXRr4KU9YSlocN74aTzp6R/Ud43t79yLLqxHRWZfsvWXmbDWPpoENK1K539xw=="], + + "d3-random": ["d3-random@2.2.2", "", {}, "sha512-0D9P8TRj6qDAtHhRQn6EfdOtHMfsUWanl3yb/84C4DqpZ+VsgfI5iTVRNRbELCfNvRfpMr8OrqqUTQ6ANGCijw=="], + + "d3-scale": ["d3-scale@3.3.0", "", { "dependencies": { "d3-array": "^2.3.0", "d3-format": "1 - 2", "d3-interpolate": "1.2.0 - 2", "d3-time": "^2.1.1", "d3-time-format": "2 - 3" } }, "sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ=="], + + "d3-scale-chromatic": ["d3-scale-chromatic@2.0.0", "", { "dependencies": { "d3-color": "1 - 2", "d3-interpolate": "1 - 2" } }, "sha512-LLqy7dJSL8yDy7NRmf6xSlsFZ6zYvJ4BcWFE4zBrOPnQERv9zj24ohnXKRbyi9YHnYV+HN1oEO3iFK971/gkzA=="], + + "d3-selection": ["d3-selection@2.0.0", "", {}, "sha512-XoGGqhLUN/W14NmaqcO/bb1nqjDAw5WtSYb2X8wiuQWvSZUsUVYsOSkOybUrNvcBjaywBdYPy03eXHMXjk9nZA=="], + + "d3-shape": ["d3-shape@2.1.0", "", { "dependencies": { "d3-path": "1 - 2" } }, "sha512-PnjUqfM2PpskbSLTJvAzp2Wv4CZsnAgTfcVRTwW03QR3MkXF8Uo7B1y/lWkAsmbKwuecto++4NlsYcvYpXpTHA=="], + + "d3-time": ["d3-time@2.1.1", "", { "dependencies": { "d3-array": "2" } }, "sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ=="], + + "d3-time-format": ["d3-time-format@3.0.0", "", { "dependencies": { "d3-time": "1 - 2" } }, "sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag=="], + + "d3-timer": ["d3-timer@2.0.0", "", {}, "sha512-TO4VLh0/420Y/9dO3+f9abDEFYeCUr2WZRlxJvbp4HPTQcSylXNiL6yZa9FIUvV1yRiFufl1bszTCLDqv9PWNA=="], + + "d3-transition": ["d3-transition@2.0.0", "", { "dependencies": { "d3-color": "1 - 2", "d3-dispatch": "1 - 2", "d3-ease": "1 - 2", "d3-interpolate": "1 - 2", "d3-timer": "1 - 2" }, "peerDependencies": { "d3-selection": "2" } }, "sha512-42ltAGgJesfQE3u9LuuBHNbGrI/AJjNL2OAUdclE70UE6Vy239GCBEYD38uBPoLeNsOhFStGpPI0BAOV+HMxog=="], + + "d3-zoom": ["d3-zoom@2.0.0", "", { "dependencies": { "d3-dispatch": "1 - 2", "d3-drag": "2", "d3-interpolate": "1 - 2", "d3-selection": "2", "d3-transition": "2" } }, "sha512-fFg7aoaEm9/jf+qfstak0IYpnesZLiMX6GZvXtUSdv8RH2o4E2qeelgdU09eKS6wGuiGMfcnMI0nTIqWzRHGpw=="], + + "dashdash": ["dashdash@1.14.1", "", { "dependencies": { "assert-plus": "^1.0.0" } }, "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g=="], + + "data-uri-to-buffer": ["data-uri-to-buffer@2.0.2", "", {}, "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA=="], + + "data-view-buffer": ["data-view-buffer@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ=="], + + "data-view-byte-length": ["data-view-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ=="], + + "data-view-byte-offset": ["data-view-byte-offset@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" } }, "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ=="], + + "date-fns": ["date-fns@4.1.0", "", {}, "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg=="], + + "date-fns-tz": ["date-fns-tz@1.3.8", "", { "peerDependencies": { "date-fns": ">=2.0.0" } }, "sha512-qwNXUFtMHTTU6CFSFjoJ80W8Fzzp24LntbjFFBgL/faqds4e5mo9mftoRLgr3Vi1trISsg4awSpYVsOQCRnapQ=="], + + "dayjs": ["dayjs@1.11.13", "", {}, "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="], + + "debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], + + "decimal.js-light": ["decimal.js-light@2.5.1", "", {}, "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg=="], + + "decode-uri-component": ["decode-uri-component@0.2.2", "", {}, "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ=="], + + "decompress-response": ["decompress-response@6.0.0", "", { "dependencies": { "mimic-response": "^3.1.0" } }, "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ=="], + + "dedent": ["dedent@1.6.0", "", { "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, "optionalPeers": ["babel-plugin-macros"] }, "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA=="], + + "deep-eql": ["deep-eql@5.0.2", "", {}, "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q=="], + + "deep-equal": ["deep-equal@1.1.2", "", { "dependencies": { "is-arguments": "^1.1.1", "is-date-object": "^1.0.5", "is-regex": "^1.1.4", "object-is": "^1.1.5", "object-keys": "^1.1.1", "regexp.prototype.flags": "^1.5.1" } }, "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg=="], + + "deep-extend": ["deep-extend@0.6.0", "", {}, "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="], + + "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], + + "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], + + "default-browser": ["default-browser@5.2.1", "", { "dependencies": { "bundle-name": "^4.1.0", "default-browser-id": "^5.0.0" } }, "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg=="], + + "default-browser-id": ["default-browser-id@5.0.0", "", {}, "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA=="], + + "defaults": ["defaults@1.0.4", "", { "dependencies": { "clone": "^1.0.2" } }, "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A=="], + + "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], + + "define-lazy-prop": ["define-lazy-prop@3.0.0", "", {}, "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg=="], + + "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="], + + "defu": ["defu@6.1.4", "", {}, "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="], + + "delaunator": ["delaunator@4.0.1", "", {}, "sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag=="], + + "delay": ["delay@5.0.0", "", {}, "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw=="], + + "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], + + "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], + + "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], + + "destr": ["destr@2.0.5", "", {}, "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA=="], + + "destroy": ["destroy@1.2.0", "", {}, "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="], + + "detect-libc": ["detect-libc@2.0.4", "", {}, "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA=="], + + "detect-newline": ["detect-newline@3.1.0", "", {}, "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA=="], + + "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="], + + "devalue": ["devalue@4.3.3", "", {}, "sha512-UH8EL6H2ifcY8TbD2QsxwCC/pr5xSwPvv85LrLXVihmHVC3T3YqTCIwnR5ak0yO1KYqlxrPVOA/JVZJYPy2ATg=="], + + "didyoumean": ["didyoumean@1.2.2", "", {}, "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="], + + "diff-sequences": ["diff-sequences@29.6.3", "", {}, "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q=="], + + "dlv": ["dlv@1.1.3", "", {}, "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="], + + "doctrine": ["doctrine@3.0.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="], + + "dom-accessibility-api": ["dom-accessibility-api@0.5.16", "", {}, "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg=="], + + "dom-helpers": ["dom-helpers@5.2.1", "", { "dependencies": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" } }, "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA=="], + + "dom-serializer": ["dom-serializer@2.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg=="], + + "domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="], + + "domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="], + + "domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="], + + "dotenv": ["dotenv@16.5.0", "", {}, "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg=="], + + "dotenv-expand": ["dotenv-expand@11.0.7", "", { "dependencies": { "dotenv": "^16.4.5" } }, "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA=="], + + "drizzle-kit": ["drizzle-kit@0.31.1", "", { "dependencies": { "@drizzle-team/brocli": "^0.10.2", "@esbuild-kit/esm-loader": "^2.5.5", "esbuild": "^0.25.2", "esbuild-register": "^3.5.0" }, "bin": { "drizzle-kit": "bin.cjs" } }, "sha512-PUjYKWtzOzPtdtQlTHQG3qfv4Y0XT8+Eas6UbxCmxTj7qgMf+39dDujf1BP1I+qqZtw9uzwTh8jYtkMuCq+B0Q=="], + + "drizzle-orm": ["drizzle-orm@0.44.2", "", { "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", "@cloudflare/workers-types": ">=4", "@electric-sql/pglite": ">=0.2.0", "@libsql/client": ">=0.10.0", "@libsql/client-wasm": ">=0.10.0", "@neondatabase/serverless": ">=0.10.0", "@op-engineering/op-sqlite": ">=2", "@opentelemetry/api": "^1.4.1", "@planetscale/database": ">=1.13", "@prisma/client": "*", "@tidbcloud/serverless": "*", "@types/better-sqlite3": "*", "@types/pg": "*", "@types/sql.js": "*", "@upstash/redis": ">=1.34.7", "@vercel/postgres": ">=0.8.0", "@xata.io/client": "*", "better-sqlite3": ">=7", "bun-types": "*", "expo-sqlite": ">=14.0.0", "gel": ">=2", "knex": "*", "kysely": "*", "mysql2": ">=2", "pg": ">=8", "postgres": ">=3", "sql.js": ">=1", "sqlite3": ">=5" }, "optionalPeers": ["@aws-sdk/client-rds-data", "@cloudflare/workers-types", "@electric-sql/pglite", "@libsql/client", "@libsql/client-wasm", "@neondatabase/serverless", "@op-engineering/op-sqlite", "@opentelemetry/api", "@planetscale/database", "@prisma/client", "@tidbcloud/serverless", "@types/better-sqlite3", "@types/pg", "@types/sql.js", "@upstash/redis", "@vercel/postgres", "@xata.io/client", "better-sqlite3", "bun-types", "expo-sqlite", "gel", "knex", "kysely", "mysql2", "pg", "postgres", "sql.js", "sqlite3"] }, "sha512-zGAqBzWWkVSFjZpwPOrmCrgO++1kZ5H/rZ4qTGeGOe18iXGVJWf3WPfHOVwFIbmi8kHjfJstC6rJomzGx8g/dQ=="], + + "dropbox": ["dropbox@10.34.0", "", { "dependencies": { "node-fetch": "^2.6.1" }, "peerDependencies": { "@types/node-fetch": "^2.5.7" } }, "sha512-5jb5/XzU0fSnq36/hEpwT5/QIep7MgqKuxghEG44xCu7HruOAjPdOb3x0geXv5O/hd0nHpQpWO+r5MjYTpMvJg=="], + + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], + + "earcut": ["earcut@2.2.4", "", {}, "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ=="], + + "earlgrey-runtime": ["earlgrey-runtime@0.1.2", "", { "dependencies": { "core-js": "^2.4.0", "kaiser": ">=0.0.4", "lodash": "^4.17.2", "regenerator-runtime": "^0.9.5" } }, "sha512-T4qoScXi5TwALDv8nlGTvOuCT8jXcKcxtO8qVdqv46IA2GHJfQzwoBPbkOmORnyhu3A98cVVuhWLsM2CzPljJg=="], + + "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], + + "ecc-jsbn": ["ecc-jsbn@0.1.2", "", { "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" } }, "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw=="], + + "ecdsa-sig-formatter": ["ecdsa-sig-formatter@1.0.11", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ=="], + + "editor": ["editor@1.0.0", "", {}, "sha512-SoRmbGStwNYHgKfjOrX2L0mUvp9bUVv0uPppZSOMAntEbcFtoC3MKF5b3T6HQPXKIV+QGY3xPO3JK5it5lVkuw=="], + + "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], + + "effect": ["effect@3.16.8", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-E4U0MZFBun99myxOogy9ZZ1c3IYR47L/A5GqCP9Lp+6ORag0YLmGHOrYxQ3agN1FOMTrElgtJmciicwnHdE+Ug=="], + + "electron-to-chromium": ["electron-to-chromium@1.5.169", "", {}, "sha512-q7SQx6mkLy0GTJK9K9OiWeaBMV4XQtBSdf6MJUzDB/H/5tFXfIiX38Lci1Kl6SsgiEhz1SQI1ejEOU5asWEhwQ=="], + + "emittery": ["emittery@0.13.1", "", {}, "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ=="], + + "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "emojis-list": ["emojis-list@3.0.0", "", {}, "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q=="], + + "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], + + "end-of-stream": ["end-of-stream@1.4.5", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg=="], + + "enhanced-resolve": ["enhanced-resolve@5.18.1", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg=="], + + "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + + "env-editor": ["env-editor@0.4.2", "", {}, "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA=="], + + "envalid": ["envalid@8.0.0", "", { "dependencies": { "tslib": "2.6.2" } }, "sha512-PGeYJnJB5naN0ME6SH8nFcDj9HVbLpYIfg1p5lAyM9T4cH2lwtu2fLbozC/bq+HUUOIFxhX/LP0/GmlqPHT4tQ=="], + + "error-ex": ["error-ex@1.3.2", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g=="], + + "error-stack-parser": ["error-stack-parser@2.1.4", "", { "dependencies": { "stackframe": "^1.3.4" } }, "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ=="], + + "es-abstract": ["es-abstract@1.24.0", "", { "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.3.0", "get-proto": "^1.0.1", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", "is-set": "^2.0.3", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.1", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.4", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.19" } }, "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg=="], + + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], + + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + + "es-iterator-helpers": ["es-iterator-helpers@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.0.3", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.6", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "iterator.prototype": "^1.1.4", "safe-array-concat": "^1.1.3" } }, "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w=="], + + "es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="], + + "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], + + "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], + + "es-shim-unscopables": ["es-shim-unscopables@1.1.0", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw=="], + + "es-to-primitive": ["es-to-primitive@1.3.0", "", { "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", "is-symbol": "^1.0.4" } }, "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g=="], + + "esbuild": ["esbuild@0.25.5", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.5", "@esbuild/android-arm": "0.25.5", "@esbuild/android-arm64": "0.25.5", "@esbuild/android-x64": "0.25.5", "@esbuild/darwin-arm64": "0.25.5", "@esbuild/darwin-x64": "0.25.5", "@esbuild/freebsd-arm64": "0.25.5", "@esbuild/freebsd-x64": "0.25.5", "@esbuild/linux-arm": "0.25.5", "@esbuild/linux-arm64": "0.25.5", "@esbuild/linux-ia32": "0.25.5", "@esbuild/linux-loong64": "0.25.5", "@esbuild/linux-mips64el": "0.25.5", "@esbuild/linux-ppc64": "0.25.5", "@esbuild/linux-riscv64": "0.25.5", "@esbuild/linux-s390x": "0.25.5", "@esbuild/linux-x64": "0.25.5", "@esbuild/netbsd-arm64": "0.25.5", "@esbuild/netbsd-x64": "0.25.5", "@esbuild/openbsd-arm64": "0.25.5", "@esbuild/openbsd-x64": "0.25.5", "@esbuild/sunos-x64": "0.25.5", "@esbuild/win32-arm64": "0.25.5", "@esbuild/win32-ia32": "0.25.5", "@esbuild/win32-x64": "0.25.5" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ=="], + + "esbuild-register": ["esbuild-register@3.6.0", "", { "dependencies": { "debug": "^4.3.4" }, "peerDependencies": { "esbuild": ">=0.12 <1" } }, "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg=="], + + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + + "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], + + "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + + "eslint": ["eslint@9.29.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.20.1", "@eslint/config-helpers": "^0.2.1", "@eslint/core": "^0.14.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.29.0", "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ=="], + + "eslint-config-expo": ["eslint-config-expo@9.2.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "^8.18.2", "@typescript-eslint/parser": "^8.18.2", "eslint-import-resolver-typescript": "^3.6.3", "eslint-plugin-expo": "^0.1.4", "eslint-plugin-import": "^2.30.0", "eslint-plugin-react": "^7.37.3", "eslint-plugin-react-hooks": "^5.1.0", "globals": "^16.0.0" }, "peerDependencies": { "eslint": ">=8.10" } }, "sha512-TQgmSx+2mRM7qUS0hB5kTDrHcSC35rA1UzOSgK5YRLmSkSMlKLmXkUrhwOpnyo9D/nHdf4ERRAySRYxgA6dlrw=="], + + "eslint-import-resolver-node": ["eslint-import-resolver-node@0.3.9", "", { "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", "resolve": "^1.22.4" } }, "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g=="], + + "eslint-import-resolver-typescript": ["eslint-import-resolver-typescript@3.10.1", "", { "dependencies": { "@nolyfill/is-core-module": "1.0.39", "debug": "^4.4.0", "get-tsconfig": "^4.10.0", "is-bun-module": "^2.0.0", "stable-hash": "^0.0.5", "tinyglobby": "^0.2.13", "unrs-resolver": "^1.6.2" }, "peerDependencies": { "eslint": "*", "eslint-plugin-import": "*", "eslint-plugin-import-x": "*" }, "optionalPeers": ["eslint-plugin-import", "eslint-plugin-import-x"] }, "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ=="], + + "eslint-module-utils": ["eslint-module-utils@2.12.0", "", { "dependencies": { "debug": "^3.2.7" } }, "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg=="], + + "eslint-plugin-expo": ["eslint-plugin-expo@0.1.4", "", { "dependencies": { "@typescript-eslint/types": "^8.29.1", "@typescript-eslint/utils": "^8.29.1", "eslint": "^9.24.0" } }, "sha512-YA7yiMacQbLJySuyJA0Eb5V65obqp6fVOWtw1JdYDRWC5MeToPrnNvhGDpk01Bv3Vm4ownuzUfvi89MXi1d6cg=="], + + "eslint-plugin-import": ["eslint-plugin-import@2.31.0", "", { "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.8", "array.prototype.findlastindex": "^1.2.5", "array.prototype.flat": "^1.3.2", "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.12.0", "hasown": "^2.0.2", "is-core-module": "^2.15.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "object.groupby": "^1.0.3", "object.values": "^1.2.0", "semver": "^6.3.1", "string.prototype.trimend": "^1.0.8", "tsconfig-paths": "^3.15.0" }, "peerDependencies": { "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A=="], + + "eslint-plugin-react": ["eslint-plugin-react@7.37.5", "", { "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.3", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", "es-iterator-helpers": "^1.2.1", "estraverse": "^5.3.0", "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.9", "object.fromentries": "^2.0.8", "object.values": "^1.2.1", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", "string.prototype.matchall": "^4.0.12", "string.prototype.repeat": "^1.0.0" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA=="], + + "eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@5.2.0", "", { "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg=="], + + "eslint-plugin-react-refresh": ["eslint-plugin-react-refresh@0.4.20", "", { "peerDependencies": { "eslint": ">=8.40" } }, "sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA=="], + + "eslint-plugin-storybook": ["eslint-plugin-storybook@0.11.6", "", { "dependencies": { "@storybook/csf": "^0.1.11", "@typescript-eslint/utils": "^8.8.1", "ts-dedent": "^2.2.0" }, "peerDependencies": { "eslint": ">=8" } }, "sha512-3WodYD6Bs9ACqnB+TP2TuLh774c/nacAjxSKOP9bHJ2c8rf+nrhocxjjeAWNmO9IPkFIzTKlcl0vNXI2yYpVOw=="], + + "eslint-plugin-testing-library": ["eslint-plugin-testing-library@7.5.3", "", { "dependencies": { "@typescript-eslint/scope-manager": "^8.15.0", "@typescript-eslint/utils": "^8.15.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0" } }, "sha512-sZk5hIrx0p1ehvdS2qHefKwXHiEysiQN+FMGCzES6xRNUgwI3q4KdWMeAwpPDP9u0RDkNzJpebRUnNch1sJh+A=="], + + "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], + + "eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + + "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], + + "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], + + "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], + + "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], + + "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + + "estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], + + "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], + + "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], + + "event-target-shim": ["event-target-shim@5.0.1", "", {}, "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="], + + "eventemitter3": ["eventemitter3@4.0.7", "", {}, "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="], + + "events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="], + + "eventsource": ["eventsource@3.0.7", "", { "dependencies": { "eventsource-parser": "^3.0.1" } }, "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA=="], + + "eventsource-parser": ["eventsource-parser@3.0.2", "", {}, "sha512-6RxOBZ/cYgd8usLwsEl+EC09Au/9BcmCKYF2/xbml6DNczf7nv0MQb+7BA2F+li6//I+28VNlQR37XfQtcAJuA=="], + + "exec-async": ["exec-async@2.2.0", "", {}, "sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw=="], + + "execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="], + + "exit": ["exit@0.1.2", "", {}, "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ=="], + + "exit-hook": ["exit-hook@2.2.1", "", {}, "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw=="], + + "expand-template": ["expand-template@2.0.3", "", {}, "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg=="], + + "expect": ["expect@29.7.0", "", { "dependencies": { "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", "jest-matcher-utils": "^29.7.0", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0" } }, "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw=="], + + "expect-type": ["expect-type@1.2.1", "", {}, "sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw=="], + + "expo": ["expo@53.0.11", "", { "dependencies": { "@babel/runtime": "^7.20.0", "@expo/cli": "0.24.14", "@expo/config": "~11.0.10", "@expo/config-plugins": "~10.0.2", "@expo/fingerprint": "0.13.0", "@expo/metro-config": "0.20.14", "@expo/vector-icons": "^14.0.0", "babel-preset-expo": "~13.2.0", "expo-asset": "~11.1.5", "expo-constants": "~17.1.6", "expo-file-system": "~18.1.10", "expo-font": "~13.3.1", "expo-keep-awake": "~14.1.4", "expo-modules-autolinking": "2.1.11", "expo-modules-core": "2.4.0", "react-native-edge-to-edge": "1.6.0", "whatwg-url-without-unicode": "8.0.0-3" }, "peerDependencies": { "@expo/dom-webview": "*", "@expo/metro-runtime": "*", "react": "*", "react-native": "*", "react-native-webview": "*" }, "optionalPeers": ["@expo/dom-webview", "@expo/metro-runtime", "react-native-webview"], "bin": { "expo": "bin/cli", "fingerprint": "bin/fingerprint", "expo-modules-autolinking": "bin/autolinking" } }, "sha512-+QtvU+6VPd7/o4vmtwuRE/Li2rAiJtD25I6BOnoQSxphaWWaD0PdRQnIV3VQ0HESuJYRuKJ3DkAHNJ3jI6xwzA=="], + + "expo-asset": ["expo-asset@11.1.5", "", { "dependencies": { "@expo/image-utils": "^0.7.4", "expo-constants": "~17.1.5" }, "peerDependencies": { "expo": "*", "react": "*", "react-native": "*" } }, "sha512-GEQDCqC25uDBoXHEnXeBuwpeXvI+3fRGvtzwwt0ZKKzWaN+TgeF8H7c76p3Zi4DfBMFDcduM0CmOvJX+yCCLUQ=="], + + "expo-blur": ["expo-blur@14.1.5", "", { "peerDependencies": { "expo": "*", "react": "*", "react-native": "*" } }, "sha512-CCLJHxN4eoAl06ESKT3CbMasJ98WsjF9ZQEJnuxtDb9ffrYbZ+g9ru84fukjNUOTtc8A8yXE5z8NgY1l0OMrmQ=="], + + "expo-constants": ["expo-constants@17.1.6", "", { "dependencies": { "@expo/config": "~11.0.9", "@expo/env": "~1.0.5" }, "peerDependencies": { "expo": "*", "react-native": "*" } }, "sha512-q5mLvJiLtPcaZ7t2diSOlQ2AyxIO8YMVEJsEfI/ExkGj15JrflNQ7CALEW6IF/uNae/76qI/XcjEuuAyjdaCNw=="], + + "expo-file-system": ["expo-file-system@18.1.10", "", { "peerDependencies": { "expo": "*", "react-native": "*" } }, "sha512-SyaWg+HitScLuyEeSG9gMSDT0hIxbM9jiZjSBP9l9zMnwZjmQwsusE6+7qGiddxJzdOhTP4YGUfvEzeeS0YL3Q=="], + + "expo-font": ["expo-font@13.3.1", "", { "dependencies": { "fontfaceobserver": "^2.1.0" }, "peerDependencies": { "expo": "*", "react": "*" } }, "sha512-d+xrHYvSM9WB42wj8vP9OOFWyxed5R1evphfDb6zYBmC1dA9Hf89FpT7TNFtj2Bk3clTnpmVqQTCYbbA2P3CLg=="], + + "expo-haptics": ["expo-haptics@14.1.4", "", { "peerDependencies": { "expo": "*" } }, "sha512-QZdE3NMX74rTuIl82I+n12XGwpDWKb8zfs5EpwsnGi/D/n7O2Jd4tO5ivH+muEG/OCJOMq5aeaVDqqaQOhTkcA=="], + + "expo-image": ["expo-image@2.1.7", "", { "peerDependencies": { "expo": "*", "react": "*", "react-native": "*", "react-native-web": "*" }, "optionalPeers": ["react-native-web"] }, "sha512-p2Gr8fP/YakFHHo4rbpJbRWwKNrZp1GzSD91WEG3ZYAbTVdTjheJ6gUxXgggFaxEbaY+4WeQ0c5j9tZq8+3cEg=="], + + "expo-keep-awake": ["expo-keep-awake@14.1.4", "", { "peerDependencies": { "expo": "*", "react": "*" } }, "sha512-wU9qOnosy4+U4z/o4h8W9PjPvcFMfZXrlUoKTMBW7F4pLqhkkP/5G4EviPZixv4XWFMjn1ExQ5rV6BX8GwJsWA=="], + + "expo-linking": ["expo-linking@7.1.5", "", { "dependencies": { "expo-constants": "~17.1.6", "invariant": "^2.2.4" }, "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-8g20zOpROW78bF+bLI4a3ZWj4ntLgM0rCewKycPL0jk9WGvBrBtFtwwADJgOiV1EurNp3lcquerXGlWS+SOQyA=="], + + "expo-modules-autolinking": ["expo-modules-autolinking@2.1.11", "", { "dependencies": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", "commander": "^7.2.0", "find-up": "^5.0.0", "glob": "^10.4.2", "require-from-string": "^2.0.2", "resolve-from": "^5.0.0" }, "bin": { "expo-modules-autolinking": "bin/expo-modules-autolinking.js" } }, "sha512-KrWQo+cE4gWYNePBBhmHGVzf63gYV19ZLXe9EIH3GHTkViVzIX+Lp618H/7GxfawpN5kbhvilATH1QEKKnUUww=="], + + "expo-modules-core": ["expo-modules-core@2.4.0", "", { "dependencies": { "invariant": "^2.2.4" } }, "sha512-Ko5eHBdvuMykjw9P9C9PF54/wBSsGOxaOjx92I5BwgKvEmUwN3UrXFV4CXzlLVbLfSYUQaLcB220xmPfgvT7Fg=="], + + "expo-router": ["expo-router@5.0.7", "", { "dependencies": { "@expo/metro-runtime": "5.0.4", "@expo/server": "^0.6.2", "@radix-ui/react-slot": "1.2.0", "@react-navigation/bottom-tabs": "^7.3.10", "@react-navigation/native": "^7.1.6", "@react-navigation/native-stack": "^7.3.10", "client-only": "^0.0.1", "invariant": "^2.2.4", "react-fast-compare": "^3.2.2", "react-native-is-edge-to-edge": "^1.1.6", "schema-utils": "^4.0.1", "semver": "~7.6.3", "server-only": "^0.0.1", "shallowequal": "^1.1.0" }, "peerDependencies": { "@react-navigation/drawer": "^7.3.9", "expo": "*", "expo-constants": "*", "expo-linking": "*", "react-native-reanimated": "*", "react-native-safe-area-context": "*", "react-native-screens": "*" }, "optionalPeers": ["@react-navigation/drawer", "react-native-reanimated"] }, "sha512-NlEgRXCKtseDuIHBp87UfkvqsuVrc0MYG+zg33dopaN6wik4RkrWWxUYdNPHub0s/7qMye6zZBY4ZCrXwd/xpA=="], + + "expo-splash-screen": ["expo-splash-screen@0.30.9", "", { "dependencies": { "@expo/prebuild-config": "^9.0.6" }, "peerDependencies": { "expo": "*" } }, "sha512-curHUaZxUTZ2dWvz32ao3xPv5mJr1LBqn5V8xm/IULAehB9RGCn8iKiROMN1PYebSG+56vPMuJmBm9P+ayvJpA=="], + + "expo-status-bar": ["expo-status-bar@2.2.3", "", { "dependencies": { "react-native-edge-to-edge": "1.6.0", "react-native-is-edge-to-edge": "^1.1.6" }, "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-+c8R3AESBoduunxTJ8353SqKAKpxL6DvcD8VKBuh81zzJyUUbfB4CVjr1GufSJEKsMzNPXZU+HJwXx7Xh7lx8Q=="], + + "expo-symbols": ["expo-symbols@0.4.5", "", { "dependencies": { "sf-symbols-typescript": "^2.0.0" }, "peerDependencies": { "expo": "*", "react-native": "*" } }, "sha512-ZbgvJfACPfWaJxJrUd0YzDmH9X0Ci7vb5m0/ZpDz/tnF1vQJlkovvpFEHLUmCDSLIN7/fNK8t696KSpzfm8/kg=="], + + "expo-system-ui": ["expo-system-ui@5.0.8", "", { "dependencies": { "@react-native/normalize-colors": "0.79.3", "debug": "^4.3.2" }, "peerDependencies": { "expo": "*", "react-native": "*", "react-native-web": "*" }, "optionalPeers": ["react-native-web"] }, "sha512-2sI7ALq3W8sKKa3FRW7PmuNznk+48cb1VzFy96vYZLZgTDZViz+fEJNdp1RHgLui/mAl3f8md1LneygSJvZ1EQ=="], + + "expo-web-browser": ["expo-web-browser@14.1.6", "", { "peerDependencies": { "expo": "*", "react-native": "*" } }, "sha512-/4P8eWqRyfXIMZna3acg320LXNA+P2cwyEVbjDX8vHnWU+UnOtyRKWy3XaAIyMPQ9hVjBNUQTh4MPvtnPRzakw=="], + + "exponential-backoff": ["exponential-backoff@3.1.2", "", {}, "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA=="], + + "express": ["express@5.1.0", "", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.0", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "finalhandler": "^2.1.0", "fresh": "^2.0.0", "http-errors": "^2.0.0", "merge-descriptors": "^2.0.0", "mime-types": "^3.0.0", "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", "proxy-addr": "^2.0.7", "qs": "^6.14.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" } }, "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA=="], + + "express-rate-limit": ["express-rate-limit@7.5.0", "", { "peerDependencies": { "express": "^4.11 || 5 || ^5.0.0-beta.1" } }, "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg=="], + + "exsolve": ["exsolve@1.0.5", "", {}, "sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg=="], + + "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], + + "extsprintf": ["extsprintf@1.3.0", "", {}, "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g=="], + + "fast-check": ["fast-check@3.23.2", "", { "dependencies": { "pure-rand": "^6.1.0" } }, "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A=="], + + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + + "fast-equals": ["fast-equals@5.2.2", "", {}, "sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw=="], + + "fast-glob": ["fast-glob@3.3.3", "", { "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" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + + "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], + + "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], + + "fast-redact": ["fast-redact@3.5.0", "", {}, "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A=="], + + "fast-uri": ["fast-uri@3.0.6", "", {}, "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw=="], + + "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], + + "fb-watchman": ["fb-watchman@2.0.2", "", { "dependencies": { "bser": "2.1.1" } }, "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA=="], + + "fbjs": ["fbjs@3.0.5", "", { "dependencies": { "cross-fetch": "^3.1.5", "fbjs-css-vars": "^1.0.0", "loose-envify": "^1.0.0", "object-assign": "^4.1.0", "promise": "^7.1.1", "setimmediate": "^1.0.5", "ua-parser-js": "^1.0.35" } }, "sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg=="], + + "fbjs-css-vars": ["fbjs-css-vars@1.0.2", "", {}, "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ=="], + + "fdir": ["fdir@6.4.6", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w=="], + + "fflate": ["fflate@0.8.2", "", {}, "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A=="], + + "figures": ["figures@1.7.0", "", { "dependencies": { "escape-string-regexp": "^1.0.5", "object-assign": "^4.1.0" } }, "sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ=="], + + "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], + + "file-selector": ["file-selector@0.1.19", "", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-kCWw3+Aai8Uox+5tHCNgMFaUdgidxvMnLWO6fM5sZ0hA2wlHP5/DHGF0ECe84BiB95qdJbKNEJhWKVDvMN+JDQ=="], + + "file-uri-to-path": ["file-uri-to-path@1.0.0", "", {}, "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="], + + "filesize": ["filesize@10.1.6", "", {}, "sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w=="], + + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "filter-obj": ["filter-obj@1.1.0", "", {}, "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ=="], + + "finalhandler": ["finalhandler@2.1.0", "", { "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "on-finished": "^2.4.1", "parseurl": "^1.3.3", "statuses": "^2.0.1" } }, "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q=="], + + "find-cache-dir": ["find-cache-dir@3.3.2", "", { "dependencies": { "commondir": "^1.0.1", "make-dir": "^3.0.2", "pkg-dir": "^4.1.0" } }, "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig=="], + + "find-root": ["find-root@1.1.0", "", {}, "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="], + + "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], + + "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], + + "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], + + "flow-enums-runtime": ["flow-enums-runtime@0.0.6", "", {}, "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw=="], + + "focus-lock": ["focus-lock@1.3.6", "", { "dependencies": { "tslib": "^2.0.3" } }, "sha512-Ik/6OCk9RQQ0T5Xw+hKNLWrjSMtv51dD4GRmJjbD5a58TIEpI5a5iXagKVl3Z5UuyslMCA8Xwnu76jQob62Yhg=="], + + "follow-redirects": ["follow-redirects@1.15.9", "", {}, "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="], + + "fontfaceobserver": ["fontfaceobserver@2.3.0", "", {}, "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg=="], + + "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], + + "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], + + "forever-agent": ["forever-agent@0.6.1", "", {}, "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw=="], + + "form-data": ["form-data@4.0.3", "", { "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" } }, "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA=="], + + "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], + + "forwarded-parse": ["forwarded-parse@2.1.2", "", {}, "sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw=="], + + "freeport-async": ["freeport-async@2.0.0", "", {}, "sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ=="], + + "fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="], + + "fs-constants": ["fs-constants@1.0.0", "", {}, "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="], + + "fs-extra": ["fs-extra@0.26.7", "", { "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^2.1.0", "klaw": "^1.0.0", "path-is-absolute": "^1.0.0", "rimraf": "^2.2.8" } }, "sha512-waKu+1KumRhYv8D8gMRCKJGAMI9pRnPuEb1mvgYD0f7wBscg+h6bW4FDTmEZhB9VKxvoTtxW+Y7bnIlB7zja6Q=="], + + "fs-promise": ["fs-promise@0.5.0", "", { "dependencies": { "any-promise": "^1.0.0", "fs-extra": "^0.26.5", "mz": "^2.3.1", "thenify-all": "^1.6.0" } }, "sha512-Y+4F4ujhEcayCJt6JmzcOun9MYGQwz+bVUiuBmTkJImhBHKpBvmVPZR9wtfiF7k3ffwAOAuurygQe+cPLSFQhw=="], + + "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "function.prototype.name": ["function.prototype.name@1.1.8", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "functions-have-names": "^1.2.3", "hasown": "^2.0.2", "is-callable": "^1.2.7" } }, "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q=="], + + "functions-have-names": ["functions-have-names@1.2.3", "", {}, "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="], + + "fuse.js": ["fuse.js@7.1.0", "", {}, "sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ=="], + + "gaxios": ["gaxios@6.7.1", "", { "dependencies": { "extend": "^3.0.2", "https-proxy-agent": "^7.0.1", "is-stream": "^2.0.0", "node-fetch": "^2.6.9", "uuid": "^9.0.1" } }, "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ=="], + + "gcp-metadata": ["gcp-metadata@6.1.1", "", { "dependencies": { "gaxios": "^6.1.1", "google-logging-utils": "^0.0.2", "json-bigint": "^1.0.0" } }, "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A=="], + + "generic-pool": ["generic-pool@3.9.0", "", {}, "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g=="], + + "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], + + "geojson-vt": ["geojson-vt@3.2.1", "", {}, "sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg=="], + + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], + + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "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" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], + + "get-package-type": ["get-package-type@0.1.0", "", {}, "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q=="], + + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + + "get-source": ["get-source@2.0.12", "", { "dependencies": { "data-uri-to-buffer": "^2.0.0", "source-map": "^0.6.1" } }, "sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w=="], + + "get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="], + + "get-symbol-description": ["get-symbol-description@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6" } }, "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg=="], + + "get-tsconfig": ["get-tsconfig@4.10.1", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ=="], + + "getenv": ["getenv@2.0.0", "", {}, "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ=="], + + "getpass": ["getpass@0.1.7", "", { "dependencies": { "assert-plus": "^1.0.0" } }, "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng=="], + + "github-from-package": ["github-from-package@0.0.0", "", {}, "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw=="], + + "gl-matrix": ["gl-matrix@3.4.3", "", {}, "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA=="], + + "glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + + "glob-to-regexp": ["glob-to-regexp@0.4.1", "", {}, "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="], + + "globals": ["globals@15.15.0", "", {}, "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg=="], + + "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], + + "google-auth-library": ["google-auth-library@9.15.1", "", { "dependencies": { "base64-js": "^1.3.0", "ecdsa-sig-formatter": "^1.0.11", "gaxios": "^6.1.1", "gcp-metadata": "^6.1.0", "gtoken": "^7.0.0", "jws": "^4.0.0" } }, "sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng=="], + + "google-logging-utils": ["google-logging-utils@0.0.2", "", {}, "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ=="], + + "googleapis": ["googleapis@146.0.0", "", { "dependencies": { "google-auth-library": "^9.0.0", "googleapis-common": "^7.0.0" } }, "sha512-NewqvhnBZOJsugCAOo636O0BGE/xY7Cg/v8Rjm1+5LkJCjcqAzLleJ6igd5vrRExJLSKrY9uHy9iKE7r0PrfhQ=="], + + "googleapis-common": ["googleapis-common@7.2.0", "", { "dependencies": { "extend": "^3.0.2", "gaxios": "^6.0.3", "google-auth-library": "^9.7.0", "qs": "^6.7.0", "url-template": "^2.0.8", "uuid": "^9.0.0" } }, "sha512-/fhDZEJZvOV3X5jmD+fKxMqma5q2Q9nZNSF3kn1F18tpxmA86BcTxAGBQdM0N89Z3bEaIs+HVznSmFJEAmMTjA=="], + + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], + + "grid-index": ["grid-index@1.1.0", "", {}, "sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA=="], + + "gtoken": ["gtoken@7.1.0", "", { "dependencies": { "gaxios": "^6.0.0", "jws": "^4.0.0" } }, "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw=="], + + "h3": ["h3@1.15.3", "", { "dependencies": { "cookie-es": "^1.2.2", "crossws": "^0.3.4", "defu": "^6.1.4", "destr": "^2.0.5", "iron-webcrypto": "^1.2.1", "node-mock-http": "^1.0.0", "radix3": "^1.1.2", "ufo": "^1.6.1", "uncrypto": "^0.1.3" } }, "sha512-z6GknHqyX0h9aQaTx22VZDf6QyZn+0Nh+Ym8O/u0SGSkyF5cuTJYKlc8MkzW3Nzf9LE1ivcpmYC3FUGpywhuUQ=="], + + "hammerjs": ["hammerjs@2.0.8", "", {}, "sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ=="], + + "har-schema": ["har-schema@2.0.0", "", {}, "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q=="], + + "har-validator": ["har-validator@5.1.5", "", { "dependencies": { "ajv": "^6.12.3", "har-schema": "^2.0.0" } }, "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w=="], + + "has-ansi": ["has-ansi@2.0.0", "", { "dependencies": { "ansi-regex": "^2.0.0" } }, "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg=="], + + "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], + + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "has-own-prop": ["has-own-prop@2.0.0", "", {}, "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ=="], + + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], + + "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], + + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], + + "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], + + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + + "hermes-estree": ["hermes-estree@0.25.1", "", {}, "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw=="], + + "hermes-parser": ["hermes-parser@0.25.1", "", { "dependencies": { "hermes-estree": "0.25.1" } }, "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA=="], + + "hoist-non-react-statics": ["hoist-non-react-statics@3.3.2", "", { "dependencies": { "react-is": "^16.7.0" } }, "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw=="], + + "hono": ["hono@4.7.11", "", {}, "sha512-rv0JMwC0KALbbmwJDEnxvQCeJh+xbS3KEWW5PC9cMJ08Ur9xgatI0HmtgYZfOdOSOeYsp5LO2cOhdI8cLEbDEQ=="], + + "hosted-git-info": ["hosted-git-info@7.0.2", "", { "dependencies": { "lru-cache": "^10.0.1" } }, "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w=="], + + "html-escaper": ["html-escaper@2.0.2", "", {}, "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="], + + "html-parse-stringify": ["html-parse-stringify@3.0.1", "", { "dependencies": { "void-elements": "3.1.0" } }, "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg=="], + + "html-to-text": ["html-to-text@9.0.5", "", { "dependencies": { "@selderee/plugin-htmlparser2": "^0.11.0", "deepmerge": "^4.3.1", "dom-serializer": "^2.0.0", "htmlparser2": "^8.0.2", "selderee": "^0.11.0" } }, "sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg=="], + + "htmlparser2": ["htmlparser2@8.0.2", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.0.1", "entities": "^4.4.0" } }, "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA=="], + + "http-errors": ["http-errors@2.0.0", "", { "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" } }, "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ=="], + + "http-signature": ["http-signature@1.2.0", "", { "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", "sshpk": "^1.7.0" } }, "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ=="], + + "https-proxy-agent": ["https-proxy-agent@5.0.1", "", { "dependencies": { "agent-base": "6", "debug": "4" } }, "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA=="], + + "human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="], + + "hyphenate-style-name": ["hyphenate-style-name@1.1.0", "", {}, "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw=="], + + "i18next": ["i18next@24.2.3", "", { "dependencies": { "@babel/runtime": "^7.26.10" }, "peerDependencies": { "typescript": "^5" }, "optionalPeers": ["typescript"] }, "sha512-lfbf80OzkocvX7nmZtu7nSTNbrTYR52sLWxPtlXX1zAhVw8WEnFk4puUkCR4B1dNQwbSpEHHHemcZu//7EcB7A=="], + + "iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], + + "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], + + "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "image-size": ["image-size@1.2.1", "", { "dependencies": { "queue": "6.0.2" }, "bin": { "image-size": "bin/image-size.js" } }, "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw=="], + + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + + "import-in-the-middle": ["import-in-the-middle@1.14.2", "", { "dependencies": { "acorn": "^8.14.0", "acorn-import-attributes": "^1.9.5", "cjs-module-lexer": "^1.2.2", "module-details-from-path": "^1.0.3" } }, "sha512-5tCuY9BV8ujfOpwtAGgsTx9CGUapcFMEEyByLv1B+v2+6DhAcw+Zr0nhQT7uwaZ7DiourxFEscghOR8e1aPLQw=="], + + "import-local": ["import-local@3.2.0", "", { "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" }, "bin": { "import-local-fixture": "fixtures/cli.js" } }, "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA=="], + + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + + "indent-string": ["indent-string@4.0.0", "", {}, "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="], + + "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], + + "inline-style-prefixer": ["inline-style-prefixer@5.1.2", "", { "dependencies": { "css-in-js-utils": "^2.0.0" } }, "sha512-PYUF+94gDfhy+LsQxM0g3d6Hge4l1pAqOSOiZuHWzMvQEGsbRQ/ck2WioLqrY2ZkHyPgVUXxn+hrkF7D6QUGbA=="], + + "inquirer": ["inquirer@0.11.4", "", { "dependencies": { "ansi-escapes": "^1.1.0", "ansi-regex": "^2.0.0", "chalk": "^1.0.0", "cli-cursor": "^1.0.1", "cli-width": "^1.0.1", "figures": "^1.3.5", "lodash": "^3.3.1", "readline2": "^1.0.1", "run-async": "^0.1.0", "rx-lite": "^3.1.2", "string-width": "^1.0.1", "strip-ansi": "^3.0.0", "through": "^2.3.6" } }, "sha512-QR+2TW90jnKk9LUUtbcA3yQXKt2rDEKMh6+BAZQIeumtzHexnwVLdPakSslGijXYLJCzFv7GMXbFCn0pA00EUw=="], + + "inquirer-promise": ["inquirer-promise@0.0.3", "", { "dependencies": { "earlgrey-runtime": ">=0.0.11", "inquirer": "^0.11.3" } }, "sha512-82CQX586JAV9GAgU9yXZsMDs+NorjA0nLhkfFx9+PReyOnuoHRbHrC1Z90sS95bFJI1Tm1gzMObuE0HabzkJpg=="], + + "internal-slot": ["internal-slot@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw=="], + + "internmap": ["internmap@2.0.3", "", {}, "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg=="], + + "invariant": ["invariant@2.2.4", "", { "dependencies": { "loose-envify": "^1.0.0" } }, "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA=="], + + "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], + + "iron-session": ["iron-session@8.0.4", "", { "dependencies": { "cookie": "^0.7.2", "iron-webcrypto": "^1.2.1", "uncrypto": "^0.1.3" } }, "sha512-9ivNnaKOd08osD0lJ3i6If23GFS2LsxyMU8Gf/uBUEgm8/8CC1hrrCHFDpMo3IFbpBgwoo/eairRsaD3c5itxA=="], + + "iron-webcrypto": ["iron-webcrypto@1.2.1", "", {}, "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg=="], + + "is-arguments": ["is-arguments@1.2.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA=="], + + "is-array-buffer": ["is-array-buffer@3.0.5", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A=="], + + "is-arrayish": ["is-arrayish@0.3.2", "", {}, "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="], + + "is-async-function": ["is-async-function@2.1.1", "", { "dependencies": { "async-function": "^1.0.0", "call-bound": "^1.0.3", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ=="], + + "is-bigint": ["is-bigint@1.1.0", "", { "dependencies": { "has-bigints": "^1.0.2" } }, "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ=="], + + "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], + + "is-boolean-object": ["is-boolean-object@1.2.2", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A=="], + + "is-buffer": ["is-buffer@1.1.6", "", {}, "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="], + + "is-bun-module": ["is-bun-module@2.0.0", "", { "dependencies": { "semver": "^7.7.1" } }, "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ=="], + + "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="], + + "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], + + "is-data-view": ["is-data-view@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" } }, "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw=="], + + "is-date-object": ["is-date-object@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg=="], + + "is-directory": ["is-directory@0.3.1", "", {}, "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw=="], + + "is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-finalizationregistry": ["is-finalizationregistry@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "is-generator-fn": ["is-generator-fn@2.1.0", "", {}, "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ=="], + + "is-generator-function": ["is-generator-function@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "get-proto": "^1.0.0", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-inside-container": ["is-inside-container@1.0.0", "", { "dependencies": { "is-docker": "^3.0.0" }, "bin": { "is-inside-container": "cli.js" } }, "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="], + + "is-map": ["is-map@2.0.3", "", {}, "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw=="], + + "is-module": ["is-module@1.0.0", "", {}, "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g=="], + + "is-nan": ["is-nan@1.3.2", "", { "dependencies": { "call-bind": "^1.0.0", "define-properties": "^1.1.3" } }, "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w=="], + + "is-negative-zero": ["is-negative-zero@2.0.3", "", {}, "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "is-number-object": ["is-number-object@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw=="], + + "is-plain-obj": ["is-plain-obj@2.1.0", "", {}, "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA=="], + + "is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="], + + "is-reference": ["is-reference@1.2.1", "", { "dependencies": { "@types/estree": "*" } }, "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ=="], + + "is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="], + + "is-set": ["is-set@2.0.3", "", {}, "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg=="], + + "is-shared-array-buffer": ["is-shared-array-buffer@1.0.4", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A=="], + + "is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], + + "is-string": ["is-string@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA=="], + + "is-symbol": ["is-symbol@1.1.1", "", { "dependencies": { "call-bound": "^1.0.2", "has-symbols": "^1.1.0", "safe-regex-test": "^1.1.0" } }, "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w=="], + + "is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="], + + "is-typedarray": ["is-typedarray@1.0.0", "", {}, "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="], + + "is-weakmap": ["is-weakmap@2.0.2", "", {}, "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w=="], + + "is-weakref": ["is-weakref@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew=="], + + "is-weakset": ["is-weakset@2.0.4", "", { "dependencies": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ=="], + + "is-wsl": ["is-wsl@3.1.0", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw=="], + + "isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], + + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "iso-datestring-validator": ["iso-datestring-validator@2.2.2", "", {}, "sha512-yLEMkBbLZTlVQqOnQ4FiMujR6T4DEcCb1xizmvXS+OxuhwcbtynoosRzdMA69zZCShCNAbi+gJ71FxZBBXx1SA=="], + + "isobject": ["isobject@3.0.1", "", {}, "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg=="], + + "isstream": ["isstream@0.1.2", "", {}, "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="], + + "istanbul-lib-coverage": ["istanbul-lib-coverage@3.2.2", "", {}, "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg=="], + + "istanbul-lib-instrument": ["istanbul-lib-instrument@6.0.3", "", { "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", "semver": "^7.5.4" } }, "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q=="], + + "istanbul-lib-report": ["istanbul-lib-report@3.0.1", "", { "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", "supports-color": "^7.1.0" } }, "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw=="], + + "istanbul-lib-source-maps": ["istanbul-lib-source-maps@4.0.1", "", { "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" } }, "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw=="], + + "istanbul-reports": ["istanbul-reports@3.1.7", "", { "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" } }, "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g=="], + + "iterator.prototype": ["iterator.prototype@1.1.5", "", { "dependencies": { "define-data-property": "^1.1.4", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "get-proto": "^1.0.0", "has-symbols": "^1.1.0", "set-function-name": "^2.0.2" } }, "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g=="], + + "jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], + + "jest": ["jest@29.7.0", "", { "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", "import-local": "^3.0.2", "jest-cli": "^29.7.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"], "bin": { "jest": "bin/jest.js" } }, "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw=="], + + "jest-changed-files": ["jest-changed-files@29.7.0", "", { "dependencies": { "execa": "^5.0.0", "jest-util": "^29.7.0", "p-limit": "^3.1.0" } }, "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w=="], + + "jest-circus": ["jest-circus@29.7.0", "", { "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", "jest-each": "^29.7.0", "jest-matcher-utils": "^29.7.0", "jest-message-util": "^29.7.0", "jest-runtime": "^29.7.0", "jest-snapshot": "^29.7.0", "jest-util": "^29.7.0", "p-limit": "^3.1.0", "pretty-format": "^29.7.0", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" } }, "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw=="], + + "jest-cli": ["jest-cli@29.7.0", "", { "dependencies": { "@jest/core": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "chalk": "^4.0.0", "create-jest": "^29.7.0", "exit": "^0.1.2", "import-local": "^3.0.2", "jest-config": "^29.7.0", "jest-util": "^29.7.0", "jest-validate": "^29.7.0", "yargs": "^17.3.1" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"], "bin": { "jest": "bin/jest.js" } }, "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg=="], + + "jest-config": ["jest-config@29.7.0", "", { "dependencies": { "@babel/core": "^7.11.6", "@jest/test-sequencer": "^29.7.0", "@jest/types": "^29.6.3", "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", "jest-circus": "^29.7.0", "jest-environment-node": "^29.7.0", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", "jest-resolve": "^29.7.0", "jest-runner": "^29.7.0", "jest-util": "^29.7.0", "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, "peerDependencies": { "@types/node": "*", "ts-node": ">=9.0.0" }, "optionalPeers": ["@types/node", "ts-node"] }, "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ=="], + + "jest-diff": ["jest-diff@29.7.0", "", { "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" } }, "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw=="], + + "jest-docblock": ["jest-docblock@29.7.0", "", { "dependencies": { "detect-newline": "^3.0.0" } }, "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g=="], + + "jest-each": ["jest-each@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "jest-util": "^29.7.0", "pretty-format": "^29.7.0" } }, "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ=="], + + "jest-environment-node": ["jest-environment-node@29.7.0", "", { "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "jest-mock": "^29.7.0", "jest-util": "^29.7.0" } }, "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw=="], + + "jest-get-type": ["jest-get-type@29.6.3", "", {}, "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw=="], + + "jest-haste-map": ["jest-haste-map@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", "jest-util": "^29.7.0", "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, "optionalDependencies": { "fsevents": "^2.3.2" } }, "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA=="], + + "jest-leak-detector": ["jest-leak-detector@29.7.0", "", { "dependencies": { "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" } }, "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw=="], + + "jest-matcher-utils": ["jest-matcher-utils@29.7.0", "", { "dependencies": { "chalk": "^4.0.0", "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" } }, "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g=="], + + "jest-message-util": ["jest-message-util@29.7.0", "", { "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" } }, "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w=="], + + "jest-mock": ["jest-mock@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "jest-util": "^29.7.0" } }, "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw=="], + + "jest-pnp-resolver": ["jest-pnp-resolver@1.2.3", "", { "peerDependencies": { "jest-resolve": "*" }, "optionalPeers": ["jest-resolve"] }, "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w=="], + + "jest-regex-util": ["jest-regex-util@29.6.3", "", {}, "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg=="], + + "jest-resolve": ["jest-resolve@29.7.0", "", { "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", "jest-util": "^29.7.0", "jest-validate": "^29.7.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" } }, "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA=="], + + "jest-resolve-dependencies": ["jest-resolve-dependencies@29.7.0", "", { "dependencies": { "jest-regex-util": "^29.6.3", "jest-snapshot": "^29.7.0" } }, "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA=="], + + "jest-runner": ["jest-runner@29.7.0", "", { "dependencies": { "@jest/console": "^29.7.0", "@jest/environment": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", "jest-docblock": "^29.7.0", "jest-environment-node": "^29.7.0", "jest-haste-map": "^29.7.0", "jest-leak-detector": "^29.7.0", "jest-message-util": "^29.7.0", "jest-resolve": "^29.7.0", "jest-runtime": "^29.7.0", "jest-util": "^29.7.0", "jest-watcher": "^29.7.0", "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" } }, "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ=="], + + "jest-runtime": ["jest-runtime@29.7.0", "", { "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", "@jest/globals": "^29.7.0", "@jest/source-map": "^29.6.3", "@jest/test-result": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "jest-message-util": "^29.7.0", "jest-mock": "^29.7.0", "jest-regex-util": "^29.6.3", "jest-resolve": "^29.7.0", "jest-snapshot": "^29.7.0", "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" } }, "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ=="], + + "jest-snapshot": ["jest-snapshot@29.7.0", "", { "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", "@jest/expect-utils": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", "expect": "^29.7.0", "graceful-fs": "^4.2.9", "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", "jest-matcher-utils": "^29.7.0", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0", "natural-compare": "^1.4.0", "pretty-format": "^29.7.0", "semver": "^7.5.3" } }, "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw=="], + + "jest-util": ["jest-util@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA=="], + + "jest-validate": ["jest-validate@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", "pretty-format": "^29.7.0" } }, "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw=="], + + "jest-watcher": ["jest-watcher@29.7.0", "", { "dependencies": { "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", "jest-util": "^29.7.0", "string-length": "^4.0.1" } }, "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g=="], + + "jest-worker": ["jest-worker@27.5.1", "", { "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg=="], + + "jimp-compact": ["jimp-compact@0.16.1", "", {}, "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww=="], + + "jiti": ["jiti@1.21.7", "", { "bin": { "jiti": "bin/jiti.js" } }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="], + + "jose": ["jose@5.10.0", "", {}, "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg=="], + + "jotai": ["jotai@2.12.5", "", { "peerDependencies": { "@types/react": ">=17.0.0", "react": ">=17.0.0" }, "optionalPeers": ["@types/react", "react"] }, "sha512-G8m32HW3lSmcz/4mbqx0hgJIQ0ekndKWiYP7kWVKi0p6saLXdSoye+FZiOFyonnd7Q482LCzm8sMDl7Ar1NWDw=="], + + "jotai-effect": ["jotai-effect@2.0.4", "", { "peerDependencies": { "jotai": ">=2.12.1" } }, "sha512-V2ARMu1JvRCie43X6SwCXPpecMR+cRI7JuSoOz/6uziOEQJnziJFRzvWHoWple+DvWdARHcFMjlIp+BEDsUoVQ=="], + + "js-base64": ["js-base64@3.7.7", "", {}, "sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw=="], + + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], + + "jsbn": ["jsbn@0.1.1", "", {}, "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="], + + "jsc-safe-url": ["jsc-safe-url@0.2.4", "", {}, "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q=="], + + "jsdoc-type-pratt-parser": ["jsdoc-type-pratt-parser@4.1.0", "", {}, "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg=="], + + "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], + + "json-bigint": ["json-bigint@1.0.0", "", { "dependencies": { "bignumber.js": "^9.0.0" } }, "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ=="], + + "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], + + "json-parse-better-errors": ["json-parse-better-errors@1.0.2", "", {}, "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw=="], + + "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], + + "json-schema": ["json-schema@0.4.0", "", {}, "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="], + + "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], + + "json-stringify-safe": ["json-stringify-safe@5.0.1", "", {}, "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="], + + "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + + "jsonfile": ["jsonfile@6.1.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ=="], + + "jsonwebtoken": ["jsonwebtoken@9.0.2", "", { "dependencies": { "jws": "^3.2.2", "lodash.includes": "^4.3.0", "lodash.isboolean": "^3.0.3", "lodash.isinteger": "^4.0.4", "lodash.isnumber": "^3.0.3", "lodash.isplainobject": "^4.0.6", "lodash.isstring": "^4.0.1", "lodash.once": "^4.0.0", "ms": "^2.1.1", "semver": "^7.5.4" } }, "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ=="], + + "jsprim": ["jsprim@1.4.2", "", { "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", "json-schema": "0.4.0", "verror": "1.10.0" } }, "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw=="], + + "jsx-ast-utils": ["jsx-ast-utils@3.3.5", "", { "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", "object.assign": "^4.1.4", "object.values": "^1.1.6" } }, "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ=="], + + "just-extend": ["just-extend@4.1.1", "", {}, "sha512-aWgeGFW67BP3e5181Ep1Fv2v8z//iBJfrvyTnq8wG86vEESwmonn1zPBJ0VfmT9CJq2FIT0VsETtrNFm2a+SHA=="], + + "jwa": ["jwa@1.4.2", "", { "dependencies": { "buffer-equal-constant-time": "^1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } }, "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw=="], + + "jws": ["jws@3.2.2", "", { "dependencies": { "jwa": "^1.4.1", "safe-buffer": "^5.0.1" } }, "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA=="], + + "kaiser": ["kaiser@0.0.4", "", { "dependencies": { "earlgrey-runtime": ">=0.0.10" } }, "sha512-m8ju+rmBqvclZmyrOXgGGhOYSjKJK6RN1NhqEltemY87UqZOxEkizg9TOy1vQSyJ01Wx6SAPuuN0iO2Mgislvw=="], + + "kdbush": ["kdbush@3.0.0", "", {}, "sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew=="], + + "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], + + "klaw": ["klaw@1.3.1", "", { "optionalDependencies": { "graceful-fs": "^4.1.9" } }, "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw=="], + + "kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="], + + "kysely": ["kysely@0.27.6", "", {}, "sha512-FIyV/64EkKhJmjgC0g2hygpBv5RNWVPyNCqSAD7eTCv6eFWNIi4PN1UvdSJGicN/o35bnevgis4Y0UDC0qi8jQ=="], + + "lan-network": ["lan-network@0.1.7", "", { "bin": { "lan-network": "dist/lan-network-cli.js" } }, "sha512-mnIlAEMu4OyEvUNdzco9xpuB9YVcPkQec+QsgycBCtPZvEqWPCDPfbAE4OJMdBBWpZWtpCn1xw9jJYlwjWI5zQ=="], + + "late-shadow-299a": ["late-shadow-299a@workspace:apps/xata-proxy"], + + "leac": ["leac@0.6.0", "", {}, "sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg=="], + + "leven": ["leven@3.1.0", "", {}, "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="], + + "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], + + "lighthouse-logger": ["lighthouse-logger@1.4.2", "", { "dependencies": { "debug": "^2.6.9", "marky": "^1.2.2" } }, "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g=="], + + "lightningcss": ["lightningcss@1.30.1", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-darwin-arm64": "1.30.1", "lightningcss-darwin-x64": "1.30.1", "lightningcss-freebsd-x64": "1.30.1", "lightningcss-linux-arm-gnueabihf": "1.30.1", "lightningcss-linux-arm64-gnu": "1.30.1", "lightningcss-linux-arm64-musl": "1.30.1", "lightningcss-linux-x64-gnu": "1.30.1", "lightningcss-linux-x64-musl": "1.30.1", "lightningcss-win32-arm64-msvc": "1.30.1", "lightningcss-win32-x64-msvc": "1.30.1" } }, "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg=="], + + "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.30.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ=="], + + "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.30.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA=="], + + "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.30.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig=="], + + "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.30.1", "", { "os": "linux", "cpu": "arm" }, "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q=="], + + "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.30.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw=="], + + "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.30.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ=="], + + "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.30.1", "", { "os": "linux", "cpu": "x64" }, "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw=="], + + "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.30.1", "", { "os": "linux", "cpu": "x64" }, "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ=="], + + "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.30.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA=="], + + "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.30.1", "", { "os": "win32", "cpu": "x64" }, "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg=="], + + "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="], + + "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], + + "loader-runner": ["loader-runner@4.3.0", "", {}, "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg=="], + + "loader-utils": ["loader-utils@2.0.4", "", { "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", "json5": "^2.1.2" } }, "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw=="], + + "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], + + "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], + + "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="], + + "lodash.debounce": ["lodash.debounce@4.0.8", "", {}, "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="], + + "lodash.includes": ["lodash.includes@4.3.0", "", {}, "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w=="], + + "lodash.isboolean": ["lodash.isboolean@3.0.3", "", {}, "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg=="], + + "lodash.isinteger": ["lodash.isinteger@4.0.4", "", {}, "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA=="], + + "lodash.isnumber": ["lodash.isnumber@3.0.3", "", {}, "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw=="], + + "lodash.isplainobject": ["lodash.isplainobject@4.0.6", "", {}, "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="], + + "lodash.isstring": ["lodash.isstring@4.0.1", "", {}, "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw=="], + + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + + "lodash.once": ["lodash.once@4.1.1", "", {}, "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg=="], + + "lodash.throttle": ["lodash.throttle@4.1.1", "", {}, "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="], + + "lodash.truncate": ["lodash.truncate@4.4.2", "", {}, "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw=="], + + "log-symbols": ["log-symbols@2.2.0", "", { "dependencies": { "chalk": "^2.0.1" } }, "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg=="], + + "long": ["long@5.3.2", "", {}, "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="], + + "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], + + "loupe": ["loupe@3.1.4", "", {}, "sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg=="], + + "lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + + "lz-string": ["lz-string@1.5.0", "", { "bin": { "lz-string": "bin/bin.js" } }, "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ=="], + + "magic-string": ["magic-string@0.30.17", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA=="], + + "make-dir": ["make-dir@3.1.0", "", { "dependencies": { "semver": "^6.0.0" } }, "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw=="], + + "makeerror": ["makeerror@1.0.12", "", { "dependencies": { "tmpl": "1.0.5" } }, "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg=="], + + "map-or-similar": ["map-or-similar@1.5.0", "", {}, "sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg=="], + + "mapbox-gl": ["mapbox-gl@1.13.3", "", { "dependencies": { "@mapbox/geojson-rewind": "^0.5.2", "@mapbox/geojson-types": "^1.0.2", "@mapbox/jsonlint-lines-primitives": "^2.0.2", "@mapbox/mapbox-gl-supported": "^1.5.0", "@mapbox/point-geometry": "^0.1.0", "@mapbox/tiny-sdf": "^1.1.1", "@mapbox/unitbezier": "^0.0.0", "@mapbox/vector-tile": "^1.3.1", "@mapbox/whoots-js": "^3.1.0", "csscolorparser": "~1.0.3", "earcut": "^2.2.2", "geojson-vt": "^3.2.1", "gl-matrix": "^3.2.1", "grid-index": "^1.1.0", "murmurhash-js": "^1.0.0", "pbf": "^3.2.1", "potpack": "^1.0.1", "quickselect": "^2.0.0", "rw": "^1.3.3", "supercluster": "^7.1.0", "tinyqueue": "^2.0.3", "vt-pbf": "^3.1.1" } }, "sha512-p8lJFEiqmEQlyv+DQxFAOG/XPWN0Wp7j/Psq93Zywz7qt9CcUKFYDBOoOEKzqe6gudHVJY8/Bhqw6VDpX2lSBg=="], + + "marky": ["marky@1.3.0", "", {}, "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ=="], + + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + + "md5": ["md5@2.3.0", "", { "dependencies": { "charenc": "0.0.2", "crypt": "0.0.2", "is-buffer": "~1.1.6" } }, "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g=="], + + "mdn-data": ["mdn-data@2.0.30", "", {}, "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA=="], + + "media-typer": ["media-typer@1.1.0", "", {}, "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="], + + "memoize-one": ["memoize-one@5.0.0", "", {}, "sha512-7g0+ejkOaI9w5x6LvQwmj68kUj6rxROywPSCqmclG/HBacmFnZqhVscQ8kovkn9FBCNJmOz6SY42+jnvZzDWdw=="], + + "memoizerific": ["memoizerific@1.11.3", "", { "dependencies": { "map-or-similar": "^1.5.0" } }, "sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog=="], + + "merge-descriptors": ["merge-descriptors@2.0.0", "", {}, "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g=="], + + "merge-options": ["merge-options@3.0.4", "", { "dependencies": { "is-plain-obj": "^2.1.0" } }, "sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ=="], + + "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], + + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + + "methods": ["methods@1.1.2", "", {}, "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="], + + "metro": ["metro@0.82.4", "", { "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", "@babel/parser": "^7.25.3", "@babel/template": "^7.25.0", "@babel/traverse": "^7.25.3", "@babel/types": "^7.25.2", "accepts": "^1.3.7", "chalk": "^4.0.0", "ci-info": "^2.0.0", "connect": "^3.6.5", "debug": "^4.4.0", "error-stack-parser": "^2.0.6", "flow-enums-runtime": "^0.0.6", "graceful-fs": "^4.2.4", "hermes-parser": "0.28.1", "image-size": "^1.0.2", "invariant": "^2.2.4", "jest-worker": "^29.7.0", "jsc-safe-url": "^0.2.2", "lodash.throttle": "^4.1.1", "metro-babel-transformer": "0.82.4", "metro-cache": "0.82.4", "metro-cache-key": "0.82.4", "metro-config": "0.82.4", "metro-core": "0.82.4", "metro-file-map": "0.82.4", "metro-resolver": "0.82.4", "metro-runtime": "0.82.4", "metro-source-map": "0.82.4", "metro-symbolicate": "0.82.4", "metro-transform-plugins": "0.82.4", "metro-transform-worker": "0.82.4", "mime-types": "^2.1.27", "nullthrows": "^1.1.1", "serialize-error": "^2.1.0", "source-map": "^0.5.6", "throat": "^5.0.0", "ws": "^7.5.10", "yargs": "^17.6.2" }, "bin": { "metro": "src/cli.js" } }, "sha512-/gFmw3ux9CPG5WUmygY35hpyno28zi/7OUn6+OFfbweA8l0B+PPqXXLr0/T6cf5nclCcH0d22o+02fICaShVxw=="], + + "metro-babel-transformer": ["metro-babel-transformer@0.82.4", "", { "dependencies": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", "hermes-parser": "0.28.1", "nullthrows": "^1.1.1" } }, "sha512-4juJahGRb1gmNbQq48lNinB6WFNfb6m0BQqi/RQibEltNiqTCxew/dBspI2EWA4xVCd3mQWGfw0TML4KurQZnQ=="], + + "metro-cache": ["metro-cache@0.82.4", "", { "dependencies": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", "https-proxy-agent": "^7.0.5", "metro-core": "0.82.4" } }, "sha512-vX0ylSMGtORKiZ4G8uP6fgfPdDiCWvLZUGZ5zIblSGylOX6JYhvExl0Zg4UA9pix/SSQu5Pnp9vdODMFsNIxhw=="], + + "metro-cache-key": ["metro-cache-key@0.82.4", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-2JCTqcpF+f2OghOpe/+x+JywfzDkrHdAqinPFWmK2ezNAU/qX0jBFaTETogPibFivxZJil37w9Yp6syX8rFUng=="], + + "metro-config": ["metro-config@0.82.4", "", { "dependencies": { "connect": "^3.6.5", "cosmiconfig": "^5.0.5", "flow-enums-runtime": "^0.0.6", "jest-validate": "^29.7.0", "metro": "0.82.4", "metro-cache": "0.82.4", "metro-core": "0.82.4", "metro-runtime": "0.82.4" } }, "sha512-Ki3Wumr3hKHGDS7RrHsygmmRNc/PCJrvkLn0+BWWxmbOmOcMMJDSmSI+WRlT8jd5VPZFxIi4wg+sAt5yBXAK0g=="], + + "metro-core": ["metro-core@0.82.4", "", { "dependencies": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", "metro-resolver": "0.82.4" } }, "sha512-Xo4ozbxPg2vfgJGCgXZ8sVhC2M0lhTqD+tsKO2q9aelq/dCjnnSb26xZKcQO80CQOQUL7e3QWB7pLFGPjZm31A=="], + + "metro-file-map": ["metro-file-map@0.82.4", "", { "dependencies": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", "flow-enums-runtime": "^0.0.6", "graceful-fs": "^4.2.4", "invariant": "^2.2.4", "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "nullthrows": "^1.1.1", "walker": "^1.0.7" } }, "sha512-eO7HD1O3aeNsbEe6NBZvx1lLJUrxgyATjnDmb7bm4eyF6yWOQot9XVtxTDLNifECuvsZ4jzRiTInrbmIHkTdGA=="], + + "metro-minify-terser": ["metro-minify-terser@0.82.4", "", { "dependencies": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" } }, "sha512-W79Mi6BUwWVaM8Mc5XepcqkG+TSsCyyo//dmTsgYfJcsmReQorRFodil3bbJInETvjzdnS1mCsUo9pllNjT1Hg=="], + + "metro-resolver": ["metro-resolver@0.82.4", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-uWoHzOBGQTPT5PjippB8rRT3iI9CTgFA9tRiLMzrseA5o7YAlgvfTdY9vFk2qyk3lW3aQfFKWkmqENryPRpu+Q=="], + + "metro-runtime": ["metro-runtime@0.82.4", "", { "dependencies": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" } }, "sha512-vVyFO7H+eLXRV2E7YAUYA7aMGBECGagqxmFvC2hmErS7oq90BbPVENfAHbUWq1vWH+MRiivoRxdxlN8gBoF/dw=="], + + "metro-source-map": ["metro-source-map@0.82.4", "", { "dependencies": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", "@babel/types": "^7.25.2", "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", "metro-symbolicate": "0.82.4", "nullthrows": "^1.1.1", "ob1": "0.82.4", "source-map": "^0.5.6", "vlq": "^1.0.0" } }, "sha512-9jzDQJ0FPas1FuQFtwmBHsez2BfhFNufMowbOMeG3ZaFvzeziE8A0aJwILDS3U+V5039ssCQFiQeqDgENWvquA=="], + + "metro-symbolicate": ["metro-symbolicate@0.82.4", "", { "dependencies": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", "metro-source-map": "0.82.4", "nullthrows": "^1.1.1", "source-map": "^0.5.6", "vlq": "^1.0.0" }, "bin": { "metro-symbolicate": "src/index.js" } }, "sha512-LwEwAtdsx7z8rYjxjpLWxuFa2U0J6TS6ljlQM4WAATKa4uzV8unmnRuN2iNBWTmRqgNR77mzmI2vhwD4QSCo+w=="], + + "metro-transform-plugins": ["metro-transform-plugins@0.82.4", "", { "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", "@babel/template": "^7.25.0", "@babel/traverse": "^7.25.3", "flow-enums-runtime": "^0.0.6", "nullthrows": "^1.1.1" } }, "sha512-NoWQRPHupVpnDgYguiEcm7YwDhnqW02iWWQjO2O8NsNP09rEMSq99nPjARWfukN7+KDh6YjLvTIN20mj3dk9kw=="], + + "metro-transform-worker": ["metro-transform-worker@0.82.4", "", { "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", "@babel/parser": "^7.25.3", "@babel/types": "^7.25.2", "flow-enums-runtime": "^0.0.6", "metro": "0.82.4", "metro-babel-transformer": "0.82.4", "metro-cache": "0.82.4", "metro-cache-key": "0.82.4", "metro-minify-terser": "0.82.4", "metro-source-map": "0.82.4", "metro-transform-plugins": "0.82.4", "nullthrows": "^1.1.1" } }, "sha512-kPI7Ad/tdAnI9PY4T+2H0cdgGeSWWdiPRKuytI806UcN4VhFL6OmYa19/4abYVYF+Cd2jo57CDuwbaxRfmXDhw=="], + + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "mime": ["mime@3.0.0", "", { "bin": { "mime": "cli.js" } }, "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A=="], + + "mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], + + "mime-types": ["mime-types@3.0.1", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA=="], + + "mimetext": ["mimetext@3.0.27", "", { "dependencies": { "@babel/runtime": "^7.26.0", "@babel/runtime-corejs3": "^7.26.0", "js-base64": "^3.7.7", "mime-types": "^2.1.35" } }, "sha512-mUhWAsZD1N/K6dbN4+a5Yq78OPnYQw1ubOSMasBntsLQ2S7KVNlvDEA8dwpr4a7PszWMzeslKahAprtwYMgaBA=="], + + "mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], + + "mimic-response": ["mimic-response@3.1.0", "", {}, "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="], + + "min-indent": ["min-indent@1.0.1", "", {}, "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg=="], + + "miniflare": ["miniflare@3.20250204.1", "", { "dependencies": { "@cspotcode/source-map-support": "0.8.1", "acorn": "8.14.0", "acorn-walk": "8.3.2", "exit-hook": "2.2.1", "glob-to-regexp": "0.4.1", "stoppable": "1.1.0", "undici": "^5.28.4", "workerd": "1.20250204.0", "ws": "8.18.0", "youch": "3.2.3", "zod": "3.22.3" }, "bin": { "miniflare": "bootstrap.js" } }, "sha512-B4PQi/Ai4d0ZTWahQwsFe5WAfr1j8ISMYxJZTc56g2/btgbX+Go099LmojAZY/fMRLhIYsglcStW8SeW3f/afA=="], + + "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + + "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "minizlib": ["minizlib@3.0.2", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA=="], + + "mjolnir.js": ["mjolnir.js@2.7.3", "", { "dependencies": { "@types/hammerjs": "^2.0.41", "hammerjs": "^2.0.8" } }, "sha512-Z5z/+FzZqOSO3juSVKV3zcm4R2eAlWwlKMcqHmyFEJAaLILNcDKnIbnb4/kbcGyIuhtdWrzu8WOIR7uM6I34aw=="], + + "mkdirp": ["mkdirp@3.0.1", "", { "bin": { "mkdirp": "dist/cjs/src/bin.js" } }, "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg=="], + + "mkdirp-classic": ["mkdirp-classic@0.5.3", "", {}, "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="], + + "mlly": ["mlly@1.7.4", "", { "dependencies": { "acorn": "^8.14.0", "pathe": "^2.0.1", "pkg-types": "^1.3.0", "ufo": "^1.5.4" } }, "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw=="], + + "mockdate": ["mockdate@2.0.5", "", {}, "sha512-ST0PnThzWKcgSLyc+ugLVql45PvESt3Ul/wrdV/OPc/6Pr8dbLAIJsN1cIp41FLzbN+srVTNIRn+5Cju0nyV6A=="], + + "module-details-from-path": ["module-details-from-path@1.0.4", "", {}, "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w=="], + + "moment": ["moment@2.30.1", "", {}, "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how=="], + + "mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "multiformats": ["multiformats@9.9.0", "", {}, "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg=="], + + "murmurhash-js": ["murmurhash-js@1.0.0", "", {}, "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw=="], + + "mustache": ["mustache@4.2.0", "", { "bin": { "mustache": "bin/mustache" } }, "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ=="], + + "mute-stream": ["mute-stream@0.0.5", "", {}, "sha512-EbrziT4s8cWPmzr47eYVW3wimS4HsvlnV5ri1xw1aR6JQo/OrJX5rkl32K/QQHdxeabJETtfeaROGhd8W7uBgg=="], + + "mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="], + + "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + + "napi-build-utils": ["napi-build-utils@2.0.0", "", {}, "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA=="], + + "napi-postinstall": ["napi-postinstall@0.2.4", "", { "bin": { "napi-postinstall": "lib/cli.js" } }, "sha512-ZEzHJwBhZ8qQSbknHqYcdtQVr8zUgGyM/q6h6qAyhtyVMNrSgDhrC4disf03dYW0e+czXyLnZINnCTEkWy0eJg=="], + + "nativewind": ["nativewind@4.1.23", "", { "dependencies": { "comment-json": "^4.2.5", "debug": "^4.3.7", "react-native-css-interop": "0.1.22" }, "peerDependencies": { "tailwindcss": ">3.3.0" } }, "sha512-oLX3suGI6ojQqWxdQezOSM5GmJ4KvMnMtmaSMN9Ggb5j7ysFt4nHxb1xs8RDjZR7BWc+bsetNJU8IQdQMHqRpg=="], + + "nats": ["nats@2.29.3", "", { "dependencies": { "nkeys.js": "1.1.0" } }, "sha512-tOQCRCwC74DgBTk4pWZ9V45sk4d7peoE2njVprMRCBXrhJ5q5cYM7i6W+Uvw2qUrcfOSnuisrX7bEx3b3Wx4QA=="], + + "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], + + "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], + + "neo-async": ["neo-async@2.6.2", "", {}, "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="], + + "nested-error-stacks": ["nested-error-stacks@2.0.1", "", {}, "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A=="], + + "nkeys.js": ["nkeys.js@1.1.0", "", { "dependencies": { "tweetnacl": "1.0.3" } }, "sha512-tB/a0shZL5UZWSwsoeyqfTszONTt4k2YS0tuQioMOD180+MbombYVgzDUYHlx+gejYK6rgf08n/2Df99WY0Sxg=="], + + "node-abi": ["node-abi@3.75.0", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg=="], + + "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], + + "node-fetch-native": ["node-fetch-native@1.6.6", "", {}, "sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ=="], + + "node-forge": ["node-forge@1.3.1", "", {}, "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA=="], + + "node-gyp-build": ["node-gyp-build@3.9.0", "", { "bin": { "node-gyp-build": "./bin.js", "node-gyp-build-test": "./build-test.js", "node-gyp-build-optional": "./optional.js" } }, "sha512-zLcTg6P4AbcHPq465ZMFNXx7XpKKJh+7kkN699NiQWisR2uWYOWNWqRHAmbnmKiL4e9aLSlmy5U7rEMUXV59+A=="], + + "node-gyp-build-optional-packages": ["node-gyp-build-optional-packages@5.1.1", "", { "dependencies": { "detect-libc": "^2.0.1" }, "bin": { "node-gyp-build-optional-packages": "bin.js", "node-gyp-build-optional-packages-test": "build-test.js", "node-gyp-build-optional-packages-optional": "optional.js" } }, "sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw=="], + + "node-int64": ["node-int64@0.4.0", "", {}, "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw=="], + + "node-mock-http": ["node-mock-http@1.0.0", "", {}, "sha512-0uGYQ1WQL1M5kKvGRXWQ3uZCHtLTO8hln3oBjIusM75WoesZ909uQJs/Hb946i2SS+Gsrhkaa6iAO17jRIv6DQ=="], + + "node-releases": ["node-releases@2.0.19", "", {}, "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="], + + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], + + "npm-package-arg": ["npm-package-arg@11.0.3", "", { "dependencies": { "hosted-git-info": "^7.0.0", "proc-log": "^4.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^5.0.0" } }, "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw=="], + + "npm-run-path": ["npm-run-path@4.0.1", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="], + + "nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="], + + "nullthrows": ["nullthrows@1.1.1", "", {}, "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw=="], + + "number-is-nan": ["number-is-nan@1.0.1", "", {}, "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ=="], + + "numeral": ["numeral@2.0.6", "", {}, "sha512-qaKRmtYPZ5qdw4jWJD6bxEf1FJEqllJrwxCLIm0sQU/A7v2/czigzOb+C2uSiFsa9lBUzeH7M1oK+Q+OLxL3kA=="], + + "oauth-sign": ["oauth-sign@0.9.0", "", {}, "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="], + + "ob1": ["ob1@0.82.4", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-n9S8e4l5TvkrequEAMDidl4yXesruWTNTzVkeaHSGywoTOIwTzZzKw7Z670H3eaXDZui5MJXjWGNzYowVZIxCA=="], + + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], + + "object-hash": ["object-hash@3.0.0", "", {}, "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw=="], + + "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], + + "object-is": ["object-is@1.1.6", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1" } }, "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q=="], + + "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="], + + "object.assign": ["object.assign@4.1.7", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0", "has-symbols": "^1.1.0", "object-keys": "^1.1.1" } }, "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw=="], + + "object.entries": ["object.entries@1.1.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-object-atoms": "^1.1.1" } }, "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw=="], + + "object.fromentries": ["object.fromentries@2.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0" } }, "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ=="], + + "object.groupby": ["object.groupby@1.0.3", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2" } }, "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ=="], + + "object.values": ["object.values@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA=="], + + "ofetch": ["ofetch@1.4.1", "", { "dependencies": { "destr": "^2.0.3", "node-fetch-native": "^1.6.4", "ufo": "^1.5.4" } }, "sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw=="], + + "ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], + + "on-exit-leak-free": ["on-exit-leak-free@2.1.2", "", {}, "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA=="], + + "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], + + "on-headers": ["on-headers@1.0.2", "", {}, "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA=="], + + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], + + "open": ["open@10.1.2", "", { "dependencies": { "default-browser": "^5.2.1", "define-lazy-prop": "^3.0.0", "is-inside-container": "^1.0.0", "is-wsl": "^3.1.0" } }, "sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw=="], + + "openapi3-ts": ["openapi3-ts@4.4.0", "", { "dependencies": { "yaml": "^2.5.0" } }, "sha512-9asTNB9IkKEzWMcHmVZE7Ts3kC9G7AFHfs8i7caD8HbI76gEjdkId4z/AkP83xdZsH7PLAnnbl47qZkXuxpArw=="], + + "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], + + "ora": ["ora@3.4.0", "", { "dependencies": { "chalk": "^2.4.2", "cli-cursor": "^2.1.0", "cli-spinners": "^2.0.0", "log-symbols": "^2.2.0", "strip-ansi": "^5.2.0", "wcwidth": "^1.0.1" } }, "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg=="], + + "os-homedir": ["os-homedir@1.0.2", "", {}, "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ=="], + + "own-keys": ["own-keys@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" } }, "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg=="], + + "p-finally": ["p-finally@1.0.0", "", {}, "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow=="], + + "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], + + "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], + + "p-queue": ["p-queue@6.6.2", "", { "dependencies": { "eventemitter3": "^4.0.4", "p-timeout": "^3.2.0" } }, "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ=="], + + "p-timeout": ["p-timeout@3.2.0", "", { "dependencies": { "p-finally": "^1.0.0" } }, "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg=="], + + "p-try": ["p-try@2.2.0", "", {}, "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="], + + "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], + + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + + "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], + + "parse-png": ["parse-png@2.1.0", "", { "dependencies": { "pngjs": "^3.3.0" } }, "sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ=="], + + "parseley": ["parseley@0.12.1", "", { "dependencies": { "leac": "^0.6.0", "peberminta": "^0.9.0" } }, "sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw=="], + + "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], + + "path-browserify": ["path-browserify@1.0.1", "", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="], + + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + + "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], + + "path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + + "path-to-regexp": ["path-to-regexp@6.3.0", "", {}, "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ=="], + + "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="], + + "pathe": ["pathe@1.1.2", "", {}, "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="], + + "pathval": ["pathval@2.0.0", "", {}, "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA=="], + + "patient-bar-6c30": ["patient-bar-6c30@workspace:apps/app-proxy"], + + "patient-flower-7e0a": ["patient-flower-7e0a@workspace:apps/uploads"], + + "pbf": ["pbf@3.3.0", "", { "dependencies": { "ieee754": "^1.1.12", "resolve-protobuf-schema": "^2.1.0" }, "bin": { "pbf": "bin/pbf" } }, "sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q=="], + + "peberminta": ["peberminta@0.9.0", "", {}, "sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ=="], + + "performance-now": ["performance-now@2.1.0", "", {}, "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="], + + "pg": ["pg@8.16.0", "", { "dependencies": { "pg-connection-string": "^2.9.0", "pg-pool": "^3.10.0", "pg-protocol": "^1.10.0", "pg-types": "2.2.0", "pgpass": "1.0.5" }, "optionalDependencies": { "pg-cloudflare": "^1.2.5" }, "peerDependencies": { "pg-native": ">=3.0.1" }, "optionalPeers": ["pg-native"] }, "sha512-7SKfdvP8CTNXjMUzfcVTaI+TDzBEeaUnVwiVGZQD1Hh33Kpev7liQba9uLd4CfN8r9mCVsD0JIpq03+Unpz+kg=="], + + "pg-cloudflare": ["pg-cloudflare@1.2.5", "", {}, "sha512-OOX22Vt0vOSRrdoUPKJ8Wi2OpE/o/h9T8X1s4qSkCedbNah9ei2W2765be8iMVxQUsvgT7zIAT2eIa9fs5+vtg=="], + + "pg-connection-string": ["pg-connection-string@2.9.0", "", {}, "sha512-P2DEBKuvh5RClafLngkAuGe9OUlFV7ebu8w1kmaaOgPcpJd1RIFh7otETfI6hAR8YupOLFTY7nuvvIn7PLciUQ=="], + + "pg-int8": ["pg-int8@1.0.1", "", {}, "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw=="], + + "pg-pool": ["pg-pool@3.10.0", "", { "peerDependencies": { "pg": ">=8.0" } }, "sha512-DzZ26On4sQ0KmqnO34muPcmKbhrjmyiO4lCCR0VwEd7MjmiKf5NTg/6+apUEu0NF7ESa37CGzFxH513CoUmWnA=="], + + "pg-protocol": ["pg-protocol@1.10.0", "", {}, "sha512-IpdytjudNuLv8nhlHs/UrVBhU0e78J0oIS/0AVdTbWxSOkFUVdsHC/NrorO6nXsQNDTT1kzDSOMJubBQviX18Q=="], + + "pg-types": ["pg-types@2.2.0", "", { "dependencies": { "pg-int8": "1.0.1", "postgres-array": "~2.0.0", "postgres-bytea": "~1.0.0", "postgres-date": "~1.0.4", "postgres-interval": "^1.1.0" } }, "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA=="], + + "pgpass": ["pgpass@1.0.5", "", { "dependencies": { "split2": "^4.1.0" } }, "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], + + "pify": ["pify@2.3.0", "", {}, "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog=="], + + "pino": ["pino@8.21.0", "", { "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^1.2.0", "pino-std-serializers": "^6.0.0", "process-warning": "^3.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", "sonic-boom": "^3.7.0", "thread-stream": "^2.6.0" }, "bin": { "pino": "bin.js" } }, "sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q=="], + + "pino-abstract-transport": ["pino-abstract-transport@1.2.0", "", { "dependencies": { "readable-stream": "^4.0.0", "split2": "^4.0.0" } }, "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q=="], + + "pino-std-serializers": ["pino-std-serializers@6.2.2", "", {}, "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA=="], + + "pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="], + + "pkce-challenge": ["pkce-challenge@5.0.0", "", {}, "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ=="], + + "pkg-dir": ["pkg-dir@4.2.0", "", { "dependencies": { "find-up": "^4.0.0" } }, "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ=="], + + "pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], + + "pkgroll": ["pkgroll@2.13.1", "", { "dependencies": { "@rollup/plugin-alias": "^5.1.1", "@rollup/plugin-commonjs": "^28.0.5", "@rollup/plugin-dynamic-import-vars": "^2.1.5", "@rollup/plugin-inject": "^5.0.5", "@rollup/plugin-json": "^6.1.0", "@rollup/plugin-node-resolve": "^16.0.1", "@rollup/pluginutils": "^5.1.4", "esbuild": "^0.25.5", "magic-string": "^0.30.17", "rollup": "^4.43.0", "rollup-pluginutils": "^2.8.2" }, "peerDependencies": { "typescript": "^4.1 || ^5.0" }, "optionalPeers": ["typescript"], "bin": { "pkgroll": "dist/cli.mjs" } }, "sha512-SO50Oh3ycFUI26n5au3Iq/XhC1x8garmmaIF5m/8f+s8ntUWC9oZONlz0rjT12OSfY3gCkc564t3HWvuClzQNg=="], + + "plist": ["plist@3.1.0", "", { "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", "xmlbuilder": "^15.1.1" } }, "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ=="], + + "pngjs": ["pngjs@3.4.0", "", {}, "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w=="], + + "polished": ["polished@4.3.1", "", { "dependencies": { "@babel/runtime": "^7.17.8" } }, "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA=="], + + "popper.js": ["popper.js@1.16.1", "", {}, "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ=="], + + "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], + + "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], + + "postcss-import": ["postcss-import@15.1.0", "", { "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", "resolve": "^1.1.7" }, "peerDependencies": { "postcss": "^8.0.0" } }, "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew=="], + + "postcss-js": ["postcss-js@4.0.1", "", { "dependencies": { "camelcase-css": "^2.0.1" }, "peerDependencies": { "postcss": "^8.4.21" } }, "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw=="], + + "postcss-load-config": ["postcss-load-config@4.0.2", "", { "dependencies": { "lilconfig": "^3.0.0", "yaml": "^2.3.4" }, "peerDependencies": { "postcss": ">=8.0.9", "ts-node": ">=9.0.0" }, "optionalPeers": ["postcss", "ts-node"] }, "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ=="], + + "postcss-nested": ["postcss-nested@6.2.0", "", { "dependencies": { "postcss-selector-parser": "^6.1.1" }, "peerDependencies": { "postcss": "^8.2.14" } }, "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ=="], + + "postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], + + "postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="], + + "postgres-array": ["postgres-array@2.0.0", "", {}, "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA=="], + + "postgres-bytea": ["postgres-bytea@1.0.0", "", {}, "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w=="], + + "postgres-date": ["postgres-date@1.0.7", "", {}, "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q=="], + + "postgres-interval": ["postgres-interval@1.2.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ=="], + + "posthog-js": ["posthog-js@1.253.4", "", { "dependencies": { "core-js": "^3.38.1", "fflate": "^0.4.8", "preact": "^10.19.3", "web-vitals": "^4.2.4" }, "peerDependencies": { "@rrweb/types": "2.0.0-alpha.17", "rrweb-snapshot": "2.0.0-alpha.17" }, "optionalPeers": ["@rrweb/types", "rrweb-snapshot"] }, "sha512-TukecKZi7Rktb0L2Oq0s9DsXg2/PB/o6sSXgkPpx2oCQt4pzfG4Cco6s92EdOvwijP0cXCmLX7OXG1XJT5LONg=="], + + "potpack": ["potpack@1.0.2", "", {}, "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ=="], + + "pprof-format": ["pprof-format@2.1.0", "", {}, "sha512-0+G5bHH0RNr8E5hoZo/zJYsL92MhkZjwrHp3O2IxmY8RJL9ooKeuZ8Tm0ZNBw5sGZ9TiM71sthTjWoR2Vf5/xw=="], + + "preact": ["preact@10.26.9", "", {}, "sha512-SSjF9vcnF27mJK1XyFMNJzFd5u3pQiATFqoaDy03XuN00u4ziveVVEGt5RKJrDR8MHE/wJo9Nnad56RLzS2RMA=="], + + "prebuild-install": ["prebuild-install@7.1.3", "", { "dependencies": { "detect-libc": "^2.0.0", "expand-template": "^2.0.3", "github-from-package": "0.0.0", "minimist": "^1.2.3", "mkdirp-classic": "^0.5.3", "napi-build-utils": "^2.0.0", "node-abi": "^3.3.0", "pump": "^3.0.0", "rc": "^1.2.7", "simple-get": "^4.0.0", "tar-fs": "^2.0.0", "tunnel-agent": "^0.6.0" }, "bin": { "prebuild-install": "bin.js" } }, "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug=="], + + "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], + + "prettier": ["prettier@3.5.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw=="], + + "pretty-bytes": ["pretty-bytes@5.6.0", "", {}, "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg=="], + + "pretty-format": ["pretty-format@29.7.0", "", { "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } }, "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ=="], + + "printable-characters": ["printable-characters@1.0.42", "", {}, "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ=="], + + "proc-log": ["proc-log@4.2.0", "", {}, "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA=="], + + "process": ["process@0.11.10", "", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="], + + "process-warning": ["process-warning@3.0.0", "", {}, "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ=="], + + "progress": ["progress@2.0.3", "", {}, "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="], + + "promise": ["promise@8.3.0", "", { "dependencies": { "asap": "~2.0.6" } }, "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg=="], + + "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="], + + "prop-types": ["prop-types@15.8.1", "", { "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="], + + "prop-types-extra": ["prop-types-extra@1.1.1", "", { "dependencies": { "react-is": "^16.3.2", "warning": "^4.0.0" }, "peerDependencies": { "react": ">=0.14.0" } }, "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew=="], + + "protobufjs": ["protobufjs@7.5.3", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.4", "@protobufjs/eventemitter": "^1.1.0", "@protobufjs/fetch": "^1.1.0", "@protobufjs/float": "^1.0.2", "@protobufjs/inquire": "^1.1.0", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.0", "@types/node": ">=13.7.0", "long": "^5.0.0" } }, "sha512-sildjKwVqOI2kmFDiXQ6aEB0fjYTafpEvIBs8tOR8qI4spuL9OPROLVu2qZqi/xgCfsHIwVqlaF8JBjWFHnKbw=="], + + "protocol-buffers-schema": ["protocol-buffers-schema@3.6.0", "", {}, "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw=="], + + "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], + + "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], + + "psl": ["psl@1.15.0", "", { "dependencies": { "punycode": "^2.3.1" } }, "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w=="], + + "pump": ["pump@3.0.3", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA=="], + + "punycode": ["punycode@1.4.1", "", {}, "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ=="], + + "pure-rand": ["pure-rand@6.1.0", "", {}, "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA=="], + + "qrcode-terminal": ["qrcode-terminal@0.11.0", "", { "bin": { "qrcode-terminal": "./bin/qrcode-terminal.js" } }, "sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ=="], + + "qs": ["qs@6.14.0", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w=="], + + "query-string": ["query-string@7.1.3", "", { "dependencies": { "decode-uri-component": "^0.2.2", "filter-obj": "^1.1.0", "split-on-first": "^1.0.0", "strict-uri-encode": "^2.0.0" } }, "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg=="], + + "queue": ["queue@6.0.2", "", { "dependencies": { "inherits": "~2.0.3" } }, "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA=="], + + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + + "quick-format-unescaped": ["quick-format-unescaped@4.0.4", "", {}, "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg=="], + + "quickselect": ["quickselect@2.0.0", "", {}, "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw=="], + + "radix3": ["radix3@1.1.2", "", {}, "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA=="], + + "ramda": ["ramda@0.30.1", "", {}, "sha512-tEF5I22zJnuclswcZMc8bDIrwRHRzf+NqVEmqg50ShAZMP7MWeR/RGDthfM/p+BlqvF2fXAzpn8i+SJcYD3alw=="], + + "randombytes": ["randombytes@2.1.0", "", { "dependencies": { "safe-buffer": "^5.1.0" } }, "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ=="], + + "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], + + "rate-limiter-flexible": ["rate-limiter-flexible@2.4.2", "", {}, "sha512-rMATGGOdO1suFyf/mI5LYhts71g1sbdhmd6YvdiXO2gJnd42Tt6QS4JUKJKSWVVkMtBacm6l40FR7Trjo6Iruw=="], + + "raw-body": ["raw-body@3.0.0", "", { "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.6.3", "unpipe": "1.0.0" } }, "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g=="], + + "rc": ["rc@1.2.8", "", { "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "bin": { "rc": "./cli.js" } }, "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="], + + "react": ["react@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ=="], + + "react-clientside-effect": ["react-clientside-effect@1.2.8", "", { "dependencies": { "@babel/runtime": "^7.12.13" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-ma2FePH0z3px2+WOu6h+YycZcEvFmmxIlAb62cF52bG86eMySciO/EQZeQMXd07kPCYB0a1dWDT5J+KE9mCDUw=="], + + "react-confetti": ["react-confetti@6.4.0", "", { "dependencies": { "tween-functions": "^1.2.0" }, "peerDependencies": { "react": "^16.3.0 || ^17.0.1 || ^18.0.0 || ^19.0.0" } }, "sha512-5MdGUcqxrTU26I2EU7ltkWPwxvucQTuqMm8dUz72z2YMqTD6s9vMcDUysk7n9jnC+lXuCPeJJ7Knf98VEYE9Rg=="], + + "react-content-loader": ["react-content-loader@7.0.2", "", { "peerDependencies": { "react": ">=16.0.0" } }, "sha512-773S98JTyC8VB2nu7LXUhpHx8tZMieGxMcx3qTe7IkohT6Br7d9AXnIXs/wQ6IhlUdKQcw6JLKk1QKigYCWDRA=="], + + "react-devtools-core": ["react-devtools-core@6.1.2", "", { "dependencies": { "shell-quote": "^1.6.1", "ws": "^7" } }, "sha512-ldFwzufLletzCikNJVYaxlxMLu7swJ3T2VrGfzXlMsVhZhPDKXA38DEROidaYZVgMAmQnIjymrmqto5pyfrwPA=="], + + "react-docgen": ["react-docgen@7.1.1", "", { "dependencies": { "@babel/core": "^7.18.9", "@babel/traverse": "^7.18.9", "@babel/types": "^7.18.9", "@types/babel__core": "^7.18.0", "@types/babel__traverse": "^7.18.0", "@types/doctrine": "^0.0.9", "@types/resolve": "^1.20.2", "doctrine": "^3.0.0", "resolve": "^1.22.1", "strip-indent": "^4.0.0" } }, "sha512-hlSJDQ2synMPKFZOsKo9Hi8WWZTC7POR8EmWvTSjow+VDgKzkmjQvFm2fk0tmRw+f0vTOIYKlarR0iL4996pdg=="], + + "react-docgen-typescript": ["react-docgen-typescript@2.4.0", "", { "peerDependencies": { "typescript": ">= 4.3.x" } }, "sha512-ZtAp5XTO5HRzQctjPU0ybY0RRCQO19X/8fxn3w7y2VVTUbGHDKULPTL4ky3vB05euSgG5NpALhEhDPvQ56wvXg=="], + + "react-dom": ["react-dom@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" }, "peerDependencies": { "react": "^18.3.1" } }, "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw=="], + + "react-dropzone": ["react-dropzone@9.0.0", "", { "dependencies": { "attr-accept": "^1.1.3", "file-selector": "^0.1.8", "prop-types": "^15.6.2", "prop-types-extra": "^1.1.0" }, "peerDependencies": { "react": ">=0.14.0" } }, "sha512-wZ2o9B2qkdE3RumWhfyZT9swgJYJPeU5qHEcMU8weYpmLex1eeWX0CC32/Y0VutB+BBi2D+iePV/YZIiB4kZGw=="], + + "react-fast-compare": ["react-fast-compare@3.2.2", "", {}, "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ=="], + + "react-focus-lock": ["react-focus-lock@2.13.6", "", { "dependencies": { "@babel/runtime": "^7.0.0", "focus-lock": "^1.3.6", "prop-types": "^15.6.2", "react-clientside-effect": "^1.2.7", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-ehylFFWyYtBKXjAO9+3v8d0i+cnc1trGS0vlTGhzFW1vbFXVUTmR8s2tt/ZQG8x5hElg6rhENlLG1H3EZK0Llg=="], + + "react-freeze": ["react-freeze@1.0.4", "", { "peerDependencies": { "react": ">=17.0.0" } }, "sha512-r4F0Sec0BLxWicc7HEyo2x3/2icUTrRmDjaaRyzzn+7aDyFZliszMDOgLVwSnQnYENOlL1o569Ze2HZefk8clA=="], + + "react-hook-form": ["react-hook-form@7.58.1", "", { "peerDependencies": { "react": "^16.8.0 || ^17 || ^18 || ^19" } }, "sha512-Lml/KZYEEFfPhUVgE0RdCVpnC4yhW+PndRhbiTtdvSlQTL8IfVR+iQkBjLIvmmc6+GGoVeM11z37ktKFPAb0FA=="], + + "react-i18next": ["react-i18next@15.5.3", "", { "dependencies": { "@babel/runtime": "^7.27.6", "html-parse-stringify": "^3.0.1" }, "peerDependencies": { "i18next": ">= 23.2.3", "react": ">= 16.8.0", "typescript": "^5" }, "optionalPeers": ["typescript"] }, "sha512-ypYmOKOnjqPEJZO4m1BI0kS8kWqkBNsKYyhVUfij0gvjy9xJNoG/VcGkxq5dRlVwzmrmY1BQMAmpbbUBLwC4Kw=="], + + "react-input-mask": ["react-input-mask@2.0.4", "", { "dependencies": { "invariant": "^2.2.4", "warning": "^4.0.2" }, "peerDependencies": { "react": ">=0.14.0", "react-dom": ">=0.14.0" } }, "sha512-1hwzMr/aO9tXfiroiVCx5EtKohKwLk/NT8QlJXHQ4N+yJJFyUuMT+zfTpLBwX/lK3PkuMlievIffncpMZ3HGRQ=="], + + "react-is": ["react-is@17.0.2", "", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="], + + "react-lifecycles-compat": ["react-lifecycles-compat@3.0.4", "", {}, "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA=="], + + "react-map-gl": ["react-map-gl@5.2.13", "", { "dependencies": { "@babel/runtime": "^7.0.0", "mapbox-gl": "^1.0.0", "mjolnir.js": "^2.4.0", "prop-types": "^15.7.2", "react-virtualized-auto-sizer": "^1.0.2", "viewport-mercator-project": "^6.2.3 || ^7.0.1" }, "peerDependencies": { "react": ">=16.3.0" } }, "sha512-yYqpZJADB7o5epiYpkcUED5MWevFnOsVn9mgKfizxjsenLMpVNgNgb/x0e9DS4VZtpOLWW2ZXYBB4BJZJlZmTQ=="], + + "react-movable": ["react-movable@3.4.1", "", { "peerDependencies": { "react": "*", "react-dom": "*" } }, "sha512-VTrBKjRWV4yVUDGj5dIZIhf07fyoFDXzIV6xs3KNNHpgPbkPT7FNu/Vbe11ZjHmT48uOykCmRMpS66DrzRbZZg=="], + + "react-multi-ref": ["react-multi-ref@1.0.2", "", { "dependencies": { "@babel/runtime": "^7.24.4" } }, "sha512-6oS5yzrZ4UrdMHbF6QAnnaoIe9h8R+Xv4m8uJWVK8/Q4RCc6RTT0XJ/LZ7llVgFcVbnDHeUAcVIhtRgFyzjJpA=="], + + "react-native": ["react-native@0.79.2", "", { "dependencies": { "@jest/create-cache-key-function": "^29.7.0", "@react-native/assets-registry": "0.79.2", "@react-native/codegen": "0.79.2", "@react-native/community-cli-plugin": "0.79.2", "@react-native/gradle-plugin": "0.79.2", "@react-native/js-polyfills": "0.79.2", "@react-native/normalize-colors": "0.79.2", "@react-native/virtualized-lists": "0.79.2", "abort-controller": "^3.0.0", "anser": "^1.4.9", "ansi-regex": "^5.0.0", "babel-jest": "^29.7.0", "babel-plugin-syntax-hermes-parser": "0.25.1", "base64-js": "^1.5.1", "chalk": "^4.0.0", "commander": "^12.0.0", "event-target-shim": "^5.0.1", "flow-enums-runtime": "^0.0.6", "glob": "^7.1.1", "invariant": "^2.2.4", "jest-environment-node": "^29.7.0", "memoize-one": "^5.0.0", "metro-runtime": "^0.82.0", "metro-source-map": "^0.82.0", "nullthrows": "^1.1.1", "pretty-format": "^29.7.0", "promise": "^8.3.0", "react-devtools-core": "^6.1.1", "react-refresh": "^0.14.0", "regenerator-runtime": "^0.13.2", "scheduler": "0.25.0", "semver": "^7.1.3", "stacktrace-parser": "^0.1.10", "whatwg-fetch": "^3.0.0", "ws": "^6.2.3", "yargs": "^17.6.2" }, "peerDependencies": { "@types/react": "^19.0.0", "react": "^19.0.0" }, "optionalPeers": ["@types/react"], "bin": { "react-native": "cli.js" } }, "sha512-AnGzb56JvU5YCL7cAwg10+ewDquzvmgrMddiBM0GAWLwQM/6DJfGd2ZKrMuKKehHerpDDZgG+EY64gk3x3dEkw=="], + + "react-native-css-interop": ["react-native-css-interop@0.1.22", "", { "dependencies": { "@babel/helper-module-imports": "^7.22.15", "@babel/traverse": "^7.23.0", "@babel/types": "^7.23.0", "debug": "^4.3.7", "lightningcss": "^1.27.0", "semver": "^7.6.3" }, "peerDependencies": { "react": ">=18", "react-native": "*", "react-native-reanimated": ">=3.6.2", "tailwindcss": "~3" } }, "sha512-Mu01e+H9G+fxSWvwtgWlF5MJBJC4VszTCBXopIpeR171lbeBInHb8aHqoqRPxmJpi3xIHryzqKFOJYAdk7PBxg=="], + + "react-native-drawer-layout": ["react-native-drawer-layout@4.1.11", "", { "dependencies": { "use-latest-callback": "^0.2.4" }, "peerDependencies": { "react": ">= 18.2.0", "react-native": "*", "react-native-gesture-handler": ">= 2.0.0", "react-native-reanimated": ">= 2.0.0" } }, "sha512-31gilubSKPLToy31/bb0hhgOOenHYJq4JC7g/JkIEqBqSWzoCgiOlccDHlBRG+MV37UtXZnJN2spj3VusdCd4A=="], + + "react-native-edge-to-edge": ["react-native-edge-to-edge@1.6.0", "", { "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-2WCNdE3Qd6Fwg9+4BpbATUxCLcouF6YRY7K+J36KJ4l3y+tWN6XCqAC4DuoGblAAbb2sLkhEDp4FOlbOIot2Og=="], + + "react-native-gesture-handler": ["react-native-gesture-handler@2.24.0", "", { "dependencies": { "@egjs/hammerjs": "^2.0.17", "hoist-non-react-statics": "^3.3.0", "invariant": "^2.2.4" }, "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-ZdWyOd1C8axKJHIfYxjJKCcxjWEpUtUWgTOVY2wynbiveSQDm8X/PDyAKXSer/GOtIpjudUbACOndZXCN3vHsw=="], + + "react-native-is-edge-to-edge": ["react-native-is-edge-to-edge@1.1.7", "", { "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-EH6i7E8epJGIcu7KpfXYXiV2JFIYITtq+rVS8uEb+92naMRBdxhTuS8Wn2Q7j9sqyO0B+Xbaaf9VdipIAmGW4w=="], + + "react-native-modal-datetime-picker": ["react-native-modal-datetime-picker@18.0.0", "", { "dependencies": { "prop-types": "^15.7.2" }, "peerDependencies": { "@react-native-community/datetimepicker": ">=6.7.0", "react-native": ">=0.65.0" } }, "sha512-0jdvhhraZQlRACwr7pM6vmZ2kxgzJ4CpnmV6J3TVA6MrXMXK6Zo/upRBKkRp0+fTOiKuNblzesA2U59rYo6SGA=="], + + "react-native-pager-view": ["react-native-pager-view@6.7.1", "", { "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-cBSr6xw4g5N7Kd3VGWcf+kmaH7iBWb0DXAf2bVo3bXkzBcBbTOmYSvc0LVLHhUPW8nEq5WjT9LCIYAzgF++EXw=="], + + "react-native-reanimated": ["react-native-reanimated@3.17.5", "", { "dependencies": { "@babel/plugin-transform-arrow-functions": "^7.0.0-0", "@babel/plugin-transform-class-properties": "^7.0.0-0", "@babel/plugin-transform-classes": "^7.0.0-0", "@babel/plugin-transform-nullish-coalescing-operator": "^7.0.0-0", "@babel/plugin-transform-optional-chaining": "^7.0.0-0", "@babel/plugin-transform-shorthand-properties": "^7.0.0-0", "@babel/plugin-transform-template-literals": "^7.0.0-0", "@babel/plugin-transform-unicode-regex": "^7.0.0-0", "@babel/preset-typescript": "^7.16.7", "convert-source-map": "^2.0.0", "invariant": "^2.2.4", "react-native-is-edge-to-edge": "1.1.7" }, "peerDependencies": { "@babel/core": "^7.0.0-0", "react": "*", "react-native": "*" } }, "sha512-SxBK7wQfJ4UoWoJqQnmIC7ZjuNgVb9rcY5Xc67upXAFKftWg0rnkknTw6vgwnjRcvYThrjzUVti66XoZdDJGtw=="], + + "react-native-safe-area-context": ["react-native-safe-area-context@5.4.1", "", { "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-x+g3NblZ9jof8y+XkVvaGlpMrSlixhrJJ33BRzhTAKUKctQVecO1heSXmzxc5UdjvGYBKS6kPZVUw2b8NxHcPg=="], + + "react-native-screens": ["react-native-screens@4.10.0", "", { "dependencies": { "react-freeze": "^1.0.0", "warn-once": "^0.1.0" }, "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-Tw21NGuXm3PbiUGtZd0AnXirUixaAbPXDjNR0baBH7/WJDaDTTELLcQ7QRXuqAWbmr/EVCrKj1348ei1KFIr8A=="], + + "react-native-svg": ["react-native-svg@15.12.0", "", { "dependencies": { "css-select": "^5.1.0", "css-tree": "^1.1.3", "warn-once": "0.1.1" }, "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-iE25PxIJ6V0C6krReLquVw6R0QTsRTmEQc4K2Co3P6zsimU/jltcDBKYDy1h/5j9S/fqmMeXnpM+9LEWKJKI6A=="], + + "react-native-tab-view": ["react-native-tab-view@4.1.2", "", { "dependencies": { "use-latest-callback": "^0.2.4" }, "peerDependencies": { "react": ">= 18.2.0", "react-native": "*", "react-native-pager-view": ">= 6.0.0" } }, "sha512-uzC1hxZGNXeQay8rSjCc7egnoYGHRpB/Y1tAwK5/nnZwrziKry7T6+gNscZgoq88+7Aag/JeNOifdWMZyRclOA=="], + + "react-native-url-polyfill": ["react-native-url-polyfill@2.0.0", "", { "dependencies": { "whatwg-url-without-unicode": "8.0.0-3" }, "peerDependencies": { "react-native": "*" } }, "sha512-My330Do7/DvKnEvwQc0WdcBnFPploYKp9CYlefDXzIdEaA+PAhDYllkvGeEroEzvc4Kzzj2O4yVdz8v6fjRvhA=="], + + "react-native-web": ["react-native-web@0.20.0", "", { "dependencies": { "@babel/runtime": "^7.18.6", "@react-native/normalize-colors": "^0.74.1", "fbjs": "^3.0.4", "inline-style-prefixer": "^7.0.1", "memoize-one": "^6.0.0", "nullthrows": "^1.1.1", "postcss-value-parser": "^4.2.0", "styleq": "^0.1.3" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-OOSgrw+aON6R3hRosCau/xVxdLzbjEcsLysYedka0ZON4ZZe6n9xgeN9ZkoejhARM36oTlUgHIQqxGutEJ9Wxg=="], + + "react-native-webview": ["react-native-webview@13.13.5", "", { "dependencies": { "escape-string-regexp": "^4.0.0", "invariant": "2.2.4" }, "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-MfC2B+woL4Hlj2WCzcb1USySKk+SteXnUKmKktOk/H/AQy5+LuVdkPKm8SknJ0/RxaxhZ48WBoTRGaqgR137hw=="], + + "react-promise-suspense": ["react-promise-suspense@0.3.4", "", { "dependencies": { "fast-deep-equal": "^2.0.1" } }, "sha512-I42jl7L3Ze6kZaq+7zXWSunBa3b1on5yfvUW6Eo/3fFOj6dZ5Bqmcd264nJbTK/gn1HjjILAjSwnZbV4RpSaNQ=="], + + "react-range": ["react-range@1.10.0", "", { "peerDependencies": { "react": "*", "react-dom": "*" } }, "sha512-kDo0LiBUHIQIP8menx0UoxTnHr7UXBYpIYl/DR9jCaO1o29VwvCLpkP/qOTNQz5hkJadPg1uEM07XJcJ1XGoKw=="], + + "react-refresh": ["react-refresh@0.14.2", "", {}, "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA=="], + + "react-router": ["react-router@7.6.2", "", { "dependencies": { "cookie": "^1.0.1", "set-cookie-parser": "^2.6.0" }, "peerDependencies": { "react": ">=18", "react-dom": ">=18" }, "optionalPeers": ["react-dom"] }, "sha512-U7Nv3y+bMimgWjhlT5CRdzHPu2/KVmqPwKUCChW8en5P3znxUqwlYFlbmyj8Rgp1SF6zs5X4+77kBVknkg6a0w=="], + + "react-router-dom": ["react-router-dom@7.6.2", "", { "dependencies": { "react-router": "7.6.2" }, "peerDependencies": { "react": ">=18", "react-dom": ">=18" } }, "sha512-Q8zb6VlTbdYKK5JJBLQEN06oTUa/RAbG/oQS1auK1I0TbJOXktqm+QENEVJU6QvWynlXPRBXI3fiOQcSEA78rA=="], + + "react-smooth": ["react-smooth@4.0.4", "", { "dependencies": { "fast-equals": "^5.0.1", "prop-types": "^15.8.1", "react-transition-group": "^4.4.5" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q=="], + + "react-test-renderer": ["react-test-renderer@19.1.0", "", { "dependencies": { "react-is": "^19.1.0", "scheduler": "^0.26.0" }, "peerDependencies": { "react": "^19.1.0" } }, "sha512-jXkSl3CpvPYEF+p/eGDLB4sPoDX8pKkYvRl9+rR8HxLY0X04vW7hCm1/0zHoUSjPZ3bDa+wXWNTDVIw/R8aDVw=="], + + "react-transition-group": ["react-transition-group@4.4.5", "", { "dependencies": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", "loose-envify": "^1.4.0", "prop-types": "^15.6.2" }, "peerDependencies": { "react": ">=16.6.0", "react-dom": ">=16.6.0" } }, "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g=="], + + "react-uid": ["react-uid@2.3.0", "", { "dependencies": { "tslib": "^1.10.0" }, "peerDependencies": { "@types/react": "^16.8.0", "react": "^16.8.0" }, "optionalPeers": ["@types/react"] }, "sha512-tsPZ77GR0pISGYmpCLHAbZTabKXZ7zBniKPVqVMMfnXFyo39zq5g/psIlD5vLTKkjQEhWOO8JhqcHnxkwNu6eA=="], + + "react-virtualized": ["react-virtualized@9.22.6", "", { "dependencies": { "@babel/runtime": "^7.7.2", "clsx": "^1.0.4", "dom-helpers": "^5.1.3", "loose-envify": "^1.4.0", "prop-types": "^15.7.2", "react-lifecycles-compat": "^3.0.4" }, "peerDependencies": { "react": "^16.3.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.3.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-U5j7KuUQt3AaMatlMJ0UJddqSiX+Km0YJxSqbAzIiGw5EmNz0khMyqP2hzgu4+QUtm+QPIrxzUX4raJxmVJnHg=="], + + "react-virtualized-auto-sizer": ["react-virtualized-auto-sizer@1.0.2", "", { "peerDependencies": { "react": "^15.3.0 || ^16.0.0-alpha", "react-dom": "^15.3.0 || ^16.0.0-alpha" } }, "sha512-MYXhTY1BZpdJFjUovvYHVBmkq79szK/k7V3MO+36gJkWGkrXKtyr4vCPtpphaTLRAdDNoYEYFZWE8LjN+PIHNg=="], + + "react-window": ["react-window@1.8.5", "", { "dependencies": { "@babel/runtime": "^7.0.0", "memoize-one": ">=3.1.1 <6" }, "peerDependencies": { "react": "^15.0.0 || ^16.0.0", "react-dom": "^15.0.0 || ^16.0.0" } }, "sha512-HeTwlNa37AFa8MDZFZOKcNEkuF2YflA0hpGPiTT9vR7OawEt+GZbfM6wqkBahD3D3pUjIabQYzsnY/BSJbgq6Q=="], + + "read-cache": ["read-cache@1.0.0", "", { "dependencies": { "pify": "^2.3.0" } }, "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA=="], + + "readable-stream": ["readable-stream@4.7.0", "", { "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", "process": "^0.11.10", "string_decoder": "^1.3.0" } }, "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="], + + "readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], + + "readline2": ["readline2@1.0.1", "", { "dependencies": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", "mute-stream": "0.0.5" } }, "sha512-8/td4MmwUB6PkZUbV25uKz7dfrmjYWxsW8DVfibWdlHRk/l/DfHKn4pU+dfcoGLFgWOdyGCzINRQD7jn+Bv+/g=="], + + "real-require": ["real-require@0.2.0", "", {}, "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg=="], + + "recast": ["recast@0.23.11", "", { "dependencies": { "ast-types": "^0.16.1", "esprima": "~4.0.0", "source-map": "~0.6.1", "tiny-invariant": "^1.3.3", "tslib": "^2.0.1" } }, "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA=="], + + "recharts": ["recharts@2.15.3", "", { "dependencies": { "clsx": "^2.0.0", "eventemitter3": "^4.0.1", "lodash": "^4.17.21", "react-is": "^18.3.1", "react-smooth": "^4.0.4", "recharts-scale": "^0.4.4", "tiny-invariant": "^1.3.1", "victory-vendor": "^36.6.8" }, "peerDependencies": { "react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-EdOPzTwcFSuqtvkDoaM5ws/Km1+WTAO2eizL7rqiG0V2UVhTnz0m7J2i0CjVPUCdEkZImaWvXLbZDS2H5t6GFQ=="], + + "recharts-scale": ["recharts-scale@0.4.5", "", { "dependencies": { "decimal.js-light": "^2.4.1" } }, "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w=="], + + "redent": ["redent@3.0.0", "", { "dependencies": { "indent-string": "^4.0.0", "strip-indent": "^3.0.0" } }, "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg=="], + + "redis": ["redis@4.7.1", "", { "dependencies": { "@redis/bloom": "1.2.0", "@redis/client": "1.6.1", "@redis/graph": "1.1.1", "@redis/json": "1.0.7", "@redis/search": "1.2.0", "@redis/time-series": "1.1.0" } }, "sha512-S1bJDnqLftzHXHP8JsT5II/CtHWQrASX5K96REjWjlmWKrviSOLWmM7QnRLstAWsu1VBBV1ffV6DzCvxNP0UJQ=="], + + "reflect.getprototypeof": ["reflect.getprototypeof@1.0.10", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" } }, "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw=="], + + "regenerate": ["regenerate@1.4.2", "", {}, "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A=="], + + "regenerate-unicode-properties": ["regenerate-unicode-properties@10.2.0", "", { "dependencies": { "regenerate": "^1.4.2" } }, "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA=="], + + "regenerator-runtime": ["regenerator-runtime@0.13.11", "", {}, "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="], + + "regexp.prototype.flags": ["regexp.prototype.flags@1.5.4", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", "get-proto": "^1.0.1", "gopd": "^1.2.0", "set-function-name": "^2.0.2" } }, "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA=="], + + "regexpu-core": ["regexpu-core@6.2.0", "", { "dependencies": { "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.2.0", "regjsgen": "^0.8.0", "regjsparser": "^0.12.0", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" } }, "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA=="], + + "regjsgen": ["regjsgen@0.8.0", "", {}, "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q=="], + + "regjsparser": ["regjsparser@0.12.0", "", { "dependencies": { "jsesc": "~3.0.2" }, "bin": { "regjsparser": "bin/parser" } }, "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ=="], + + "repeat-string": ["repeat-string@1.6.1", "", {}, "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w=="], + + "request": ["request@2.88.2", "", { "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", "caseless": "~0.12.0", "combined-stream": "~1.0.6", "extend": "~3.0.2", "forever-agent": "~0.6.1", "form-data": "~2.3.2", "har-validator": "~5.1.3", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", "mime-types": "~2.1.19", "oauth-sign": "~0.9.0", "performance-now": "^2.1.0", "qs": "~6.5.2", "safe-buffer": "^5.1.2", "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" } }, "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw=="], + + "request-promise": ["request-promise@3.0.0", "", { "dependencies": { "bluebird": "^3.3", "lodash": "^4.6.1", "request": "^2.34" } }, "sha512-wVGUX+BoKxYsavTA72i6qHcyLbjzM4LR4y/AmDCqlbuMAursZdDWO7PmgbGAUvD2SeEJ5iB99VSq/U51i/DNbw=="], + + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + + "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], + + "require-in-the-middle": ["require-in-the-middle@7.5.2", "", { "dependencies": { "debug": "^4.3.5", "module-details-from-path": "^1.0.3", "resolve": "^1.22.8" } }, "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ=="], + + "requireg": ["requireg@0.2.2", "", { "dependencies": { "nested-error-stacks": "~2.0.1", "rc": "~1.2.7", "resolve": "~1.7.1" } }, "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg=="], + + "resend": ["resend@4.6.0", "", { "dependencies": { "@react-email/render": "1.1.2" } }, "sha512-D5T2I82FvEUYFlrHzaDvVtr5ADHdhuoLaXgLFGABKyNtQgPWIuz0Vp2L2Evx779qjK37aF4kcw1yXJDHhA2JnQ=="], + + "resize-observer-polyfill": ["resize-observer-polyfill@1.5.1", "", {}, "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="], + + "resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="], + + "resolve-cwd": ["resolve-cwd@3.0.0", "", { "dependencies": { "resolve-from": "^5.0.0" } }, "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg=="], + + "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="], + + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], + + "resolve-protobuf-schema": ["resolve-protobuf-schema@2.1.0", "", { "dependencies": { "protocol-buffers-schema": "^3.3.1" } }, "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ=="], + + "resolve-workspace-root": ["resolve-workspace-root@2.0.0", "", {}, "sha512-IsaBUZETJD5WsI11Wt8PKHwaIe45or6pwNc8yflvLJ4DWtImK9kuLoH5kUva/2Mmx/RdIyr4aONNSa2v9LTJsw=="], + + "resolve.exports": ["resolve.exports@2.0.3", "", {}, "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A=="], + + "restore-cursor": ["restore-cursor@1.0.1", "", { "dependencies": { "exit-hook": "^1.0.0", "onetime": "^1.0.0" } }, "sha512-reSjH4HuiFlxlaBaFCiS6O76ZGG2ygKoSlCsipKdaZuKSPx/+bt9mULkn4l0asVzbEfQQmXRg6Wp6gv6m0wElw=="], + + "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], + + "rimraf": ["rimraf@2.7.1", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "./bin.js" } }, "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w=="], + + "rocksky": ["rocksky@workspace:apps/web"], + + "rocksky-app": ["rocksky-app@workspace:apps/app"], + + "rocksky-auth": ["rocksky-auth@workspace:apps/api"], + + "rocksky-web-mobile": ["rocksky-web-mobile@workspace:apps/web-mobile"], + + "rollup": ["rollup@4.43.0", "", { "dependencies": { "@types/estree": "1.0.7" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.43.0", "@rollup/rollup-android-arm64": "4.43.0", "@rollup/rollup-darwin-arm64": "4.43.0", "@rollup/rollup-darwin-x64": "4.43.0", "@rollup/rollup-freebsd-arm64": "4.43.0", "@rollup/rollup-freebsd-x64": "4.43.0", "@rollup/rollup-linux-arm-gnueabihf": "4.43.0", "@rollup/rollup-linux-arm-musleabihf": "4.43.0", "@rollup/rollup-linux-arm64-gnu": "4.43.0", "@rollup/rollup-linux-arm64-musl": "4.43.0", "@rollup/rollup-linux-loongarch64-gnu": "4.43.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.43.0", "@rollup/rollup-linux-riscv64-gnu": "4.43.0", "@rollup/rollup-linux-riscv64-musl": "4.43.0", "@rollup/rollup-linux-s390x-gnu": "4.43.0", "@rollup/rollup-linux-x64-gnu": "4.43.0", "@rollup/rollup-linux-x64-musl": "4.43.0", "@rollup/rollup-win32-arm64-msvc": "4.43.0", "@rollup/rollup-win32-ia32-msvc": "4.43.0", "@rollup/rollup-win32-x64-msvc": "4.43.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-wdN2Kd3Twh8MAEOEJZsuxuLKCsBEo4PVNLK6tQWAn10VhsVewQLzcucMgLolRlhFybGxfclbPeEYBaP6RvUFGg=="], + + "rollup-plugin-inject": ["rollup-plugin-inject@3.0.2", "", { "dependencies": { "estree-walker": "^0.6.1", "magic-string": "^0.25.3", "rollup-pluginutils": "^2.8.1" } }, "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w=="], + + "rollup-plugin-node-polyfills": ["rollup-plugin-node-polyfills@0.2.1", "", { "dependencies": { "rollup-plugin-inject": "^3.0.0" } }, "sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA=="], + + "rollup-pluginutils": ["rollup-pluginutils@2.8.2", "", { "dependencies": { "estree-walker": "^0.6.1" } }, "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ=="], + + "router": ["router@2.2.0", "", { "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", "is-promise": "^4.0.0", "parseurl": "^1.3.3", "path-to-regexp": "^8.0.0" } }, "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ=="], + + "run-applescript": ["run-applescript@7.0.0", "", {}, "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A=="], + + "run-async": ["run-async@0.1.0", "", { "dependencies": { "once": "^1.3.0" } }, "sha512-qOX+w+IxFgpUpJfkv2oGN0+ExPs68F4sZHfaRRx4dDexAQkG83atugKVEylyT5ARees3HBbfmuvnjbrd8j9Wjw=="], + + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + + "rw": ["rw@1.3.3", "", {}, "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ=="], + + "rx-lite": ["rx-lite@3.1.2", "", {}, "sha512-1I1+G2gteLB8Tkt8YI1sJvSIfa0lWuRtC8GjvtyPBcLSF5jBCCJJqKrpER5JU5r6Bhe+i9/pK3VMuUcXu0kdwQ=="], + + "safe-array-concat": ["safe-array-concat@1.1.3", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "has-symbols": "^1.1.0", "isarray": "^2.0.5" } }, "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q=="], + + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "safe-push-apply": ["safe-push-apply@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "isarray": "^2.0.5" } }, "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA=="], + + "safe-regex-test": ["safe-regex-test@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw=="], + + "safe-stable-stringify": ["safe-stable-stringify@2.5.0", "", {}, "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA=="], + + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + + "sax": ["sax@1.4.1", "", {}, "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg=="], + + "scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="], + + "schema-utils": ["schema-utils@2.7.1", "", { "dependencies": { "@types/json-schema": "^7.0.5", "ajv": "^6.12.4", "ajv-keywords": "^3.5.2" } }, "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg=="], + + "selderee": ["selderee@0.11.0", "", { "dependencies": { "parseley": "^0.12.0" } }, "sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA=="], + + "semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + + "send": ["send@1.2.0", "", { "dependencies": { "debug": "^4.3.5", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.0", "mime-types": "^3.0.1", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.1" } }, "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw=="], + + "serialize-error": ["serialize-error@2.1.0", "", {}, "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw=="], + + "serialize-javascript": ["serialize-javascript@6.0.2", "", { "dependencies": { "randombytes": "^2.1.0" } }, "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g=="], + + "serve-static": ["serve-static@2.2.0", "", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ=="], + + "server-only": ["server-only@0.0.1", "", {}, "sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA=="], + + "set-cookie-parser": ["set-cookie-parser@2.7.1", "", {}, "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ=="], + + "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="], + + "set-function-name": ["set-function-name@2.0.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", "has-property-descriptors": "^1.0.2" } }, "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ=="], + + "set-proto": ["set-proto@1.0.0", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0" } }, "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw=="], + + "setimmediate": ["setimmediate@1.0.5", "", {}, "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="], + + "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], + + "sf-symbols-typescript": ["sf-symbols-typescript@2.1.0", "", {}, "sha512-ezT7gu/SHTPIOEEoG6TF+O0m5eewl0ZDAO4AtdBi5HjsrUI6JdCG17+Q8+aKp0heM06wZKApRCn5olNbs0Wb/A=="], + + "shallowequal": ["shallowequal@1.1.0", "", {}, "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ=="], + + "sharp": ["sharp@0.33.5", "", { "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.3", "semver": "^7.6.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.33.5", "@img/sharp-darwin-x64": "0.33.5", "@img/sharp-libvips-darwin-arm64": "1.0.4", "@img/sharp-libvips-darwin-x64": "1.0.4", "@img/sharp-libvips-linux-arm": "1.0.5", "@img/sharp-libvips-linux-arm64": "1.0.4", "@img/sharp-libvips-linux-s390x": "1.0.4", "@img/sharp-libvips-linux-x64": "1.0.4", "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", "@img/sharp-libvips-linuxmusl-x64": "1.0.4", "@img/sharp-linux-arm": "0.33.5", "@img/sharp-linux-arm64": "0.33.5", "@img/sharp-linux-s390x": "0.33.5", "@img/sharp-linux-x64": "0.33.5", "@img/sharp-linuxmusl-arm64": "0.33.5", "@img/sharp-linuxmusl-x64": "0.33.5", "@img/sharp-wasm32": "0.33.5", "@img/sharp-win32-ia32": "0.33.5", "@img/sharp-win32-x64": "0.33.5" } }, "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw=="], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "shell-quote": ["shell-quote@1.8.3", "", {}, "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw=="], + + "shimmer": ["shimmer@1.2.1", "", {}, "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw=="], + + "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], + + "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="], + + "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], + + "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], + + "siginfo": ["siginfo@2.0.0", "", {}, "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g=="], + + "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "simple-concat": ["simple-concat@1.0.1", "", {}, "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="], + + "simple-get": ["simple-get@4.0.1", "", { "dependencies": { "decompress-response": "^6.0.0", "once": "^1.3.1", "simple-concat": "^1.0.0" } }, "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA=="], + + "simple-plist": ["simple-plist@1.3.1", "", { "dependencies": { "bplist-creator": "0.1.0", "bplist-parser": "0.3.1", "plist": "^3.0.5" } }, "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw=="], + + "simple-swizzle": ["simple-swizzle@0.2.2", "", { "dependencies": { "is-arrayish": "^0.3.1" } }, "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg=="], + + "sirv": ["sirv@3.0.1", "", { "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", "totalist": "^3.0.0" } }, "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A=="], + + "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="], + + "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], + + "slice-ansi": ["slice-ansi@4.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" } }, "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ=="], + + "slugify": ["slugify@1.6.6", "", {}, "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw=="], + + "sonic-boom": ["sonic-boom@3.8.1", "", { "dependencies": { "atomic-sleep": "^1.0.0" } }, "sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg=="], + + "source-map": ["source-map@0.7.4", "", {}, "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA=="], + + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], + + "sourcemap-codec": ["sourcemap-codec@1.4.8", "", {}, "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="], + + "split-on-first": ["split-on-first@1.1.0", "", {}, "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw=="], + + "split2": ["split2@4.2.0", "", {}, "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg=="], + + "spotify-proxy": ["spotify-proxy@workspace:apps/spotify-proxy"], + + "sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], + + "sshpk": ["sshpk@1.18.0", "", { "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", "bcrypt-pbkdf": "^1.0.0", "dashdash": "^1.12.0", "ecc-jsbn": "~0.1.1", "getpass": "^0.1.1", "jsbn": "~0.1.0", "safer-buffer": "^2.0.2", "tweetnacl": "~0.14.0" }, "bin": { "sshpk-conv": "bin/sshpk-conv", "sshpk-sign": "bin/sshpk-sign", "sshpk-verify": "bin/sshpk-verify" } }, "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ=="], + + "stable-hash": ["stable-hash@0.0.5", "", {}, "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA=="], + + "stack-utils": ["stack-utils@2.0.6", "", { "dependencies": { "escape-string-regexp": "^2.0.0" } }, "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ=="], + + "stackback": ["stackback@0.0.2", "", {}, "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw=="], + + "stackframe": ["stackframe@1.3.4", "", {}, "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw=="], + + "stacktrace-parser": ["stacktrace-parser@0.1.11", "", { "dependencies": { "type-fest": "^0.7.1" } }, "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg=="], + + "stacktracey": ["stacktracey@2.1.8", "", { "dependencies": { "as-table": "^1.0.36", "get-source": "^2.0.12" } }, "sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw=="], + + "statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], + + "std-env": ["std-env@3.9.0", "", {}, "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw=="], + + "stop-iteration-iterator": ["stop-iteration-iterator@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "internal-slot": "^1.1.0" } }, "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ=="], + + "stoppable": ["stoppable@1.1.0", "", {}, "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw=="], + + "store2": ["store2@2.14.4", "", {}, "sha512-srTItn1GOvyvOycgxjAnPA63FZNwy0PTyUBFMHRM+hVFltAeoh0LmNBz9SZqUS9mMqGk8rfyWyXn3GH5ReJ8Zw=="], + + "storybook": ["storybook@8.6.14", "", { "dependencies": { "@storybook/core": "8.6.14" }, "peerDependencies": { "prettier": "^2 || ^3" }, "optionalPeers": ["prettier"], "bin": { "sb": "./bin/index.cjs", "storybook": "./bin/index.cjs", "getstorybook": "./bin/index.cjs" } }, "sha512-sVKbCj/OTx67jhmauhxc2dcr1P+yOgz/x3h0krwjyMgdc5Oubvxyg4NYDZmzAw+ym36g/lzH8N0Ccp4dwtdfxw=="], + + "stream-buffers": ["stream-buffers@2.2.0", "", {}, "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg=="], + + "strict-uri-encode": ["strict-uri-encode@2.0.0", "", {}, "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ=="], + + "string-length": ["string-length@4.0.2", "", { "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" } }, "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ=="], + + "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "string.prototype.matchall": ["string.prototype.matchall@4.0.12", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "regexp.prototype.flags": "^1.5.3", "set-function-name": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA=="], + + "string.prototype.repeat": ["string.prototype.repeat@1.0.0", "", { "dependencies": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" } }, "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w=="], + + "string.prototype.trim": ["string.prototype.trim@1.2.10", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-object-atoms": "^1.0.0", "has-property-descriptors": "^1.0.2" } }, "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA=="], + + "string.prototype.trimend": ["string.prototype.trimend@1.0.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ=="], + + "string.prototype.trimstart": ["string.prototype.trimstart@1.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg=="], + + "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + + "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="], + + "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], + + "strip-indent": ["strip-indent@4.0.0", "", { "dependencies": { "min-indent": "^1.0.1" } }, "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA=="], + + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + + "strip-literal": ["strip-literal@3.0.0", "", { "dependencies": { "js-tokens": "^9.0.1" } }, "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA=="], + + "structured-headers": ["structured-headers@0.4.1", "", {}, "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg=="], + + "styled-components": ["styled-components@6.1.19", "", { "dependencies": { "@emotion/is-prop-valid": "1.2.2", "@emotion/unitless": "0.8.1", "@types/stylis": "4.2.5", "css-to-react-native": "3.2.0", "csstype": "3.1.3", "postcss": "8.4.49", "shallowequal": "1.1.0", "stylis": "4.3.2", "tslib": "2.6.2" }, "peerDependencies": { "react": ">= 16.8.0", "react-dom": ">= 16.8.0" } }, "sha512-1v/e3Dl1BknC37cXMhwGomhO8AkYmN41CqyX9xhUDxry1ns3BFQy2lLDRQXJRdVVWB9OHemv/53xaStimvWyuA=="], + + "styleq": ["styleq@0.1.3", "", {}, "sha512-3ZUifmCDCQanjeej1f6kyl/BeP/Vae5EYkQ9iJfUm/QwZvlgnZzyflqAsAWYURdtea8Vkvswu2GrC57h3qffcA=="], + + "styletron-engine-monolithic": ["styletron-engine-monolithic@1.0.0", "", { "dependencies": { "inline-style-prefixer": "^5.1.0", "styletron-standard": "^3.1.0" } }, "sha512-9x+RMLbjf6rzK7mLp5bWzh/wwLbgO0xrU07sW9p9SWu18d+lkfnE8SLDm+jf4NamehQv86etX0X+Zx4PvaeJyA=="], + + "styletron-react": ["styletron-react@6.1.1", "", { "dependencies": { "prop-types": "^15.6.0", "styletron-standard": "^3.1.0" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-K04BwKZTrdRG/wR5BaFG8z0bFu1jkT2HAp0UP5ZeMAKW6Ix8J3yuROWLoLUMZafaRRQ9LjiLpIl65u75L7YZow=="], + + "styletron-standard": ["styletron-standard@3.1.0", "", { "dependencies": { "@rtsao/csstype": "2.6.5-forked.0", "csstype": "^3.0.0", "inline-style-prefixer": "^5.1.0" } }, "sha512-Cr2q0IFsag6OaIeD/LBNRuCxNTPa/WtTbKP1X3o50mDudN8FGwmD5h1sMJ/Bu5+mO/2NfrNAv9V9zUXn6lXXMA=="], + + "stylis": ["stylis@4.2.0", "", {}, "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw=="], + + "sucrase": ["sucrase@3.35.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "glob": "^10.3.10", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA=="], + + "supercluster": ["supercluster@7.1.5", "", { "dependencies": { "kdbush": "^3.0.0" } }, "sha512-EulshI3pGUM66o6ZdH3ReiFcvHpM3vAigyK+vcxdjpJyEbIIrtbmBdY23mGgnI24uXiGFvrGq9Gkum/8U7vJWg=="], + + "supports-color": ["supports-color@2.0.0", "", {}, "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g=="], + + "supports-hyperlinks": ["supports-hyperlinks@2.3.0", "", { "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" } }, "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA=="], + + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], + + "svgo": ["svgo@3.3.2", "", { "dependencies": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", "css-select": "^5.1.0", "css-tree": "^2.3.1", "css-what": "^6.1.0", "csso": "^5.0.5", "picocolors": "^1.0.0" }, "bin": "./bin/svgo" }, "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw=="], + + "swr": ["swr@2.3.3", "", { "dependencies": { "dequal": "^2.0.3", "use-sync-external-store": "^1.4.0" }, "peerDependencies": { "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-dshNvs3ExOqtZ6kJBaAsabhPdHyeY4P2cKwRCniDVifBMoG/SVI7tfLWqPXriVspf2Rg4tPzXJTnwaihIeFw2A=="], + + "table": ["table@6.9.0", "", { "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", "slice-ansi": "^4.0.0", "string-width": "^4.2.3", "strip-ansi": "^6.0.1" } }, "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A=="], + + "tailwindcss": ["tailwindcss@4.1.10", "", {}, "sha512-P3nr6WkvKV/ONsTzj6Gb57sWPMX29EPNPopo7+FcpkQaNsrNpZ1pv8QmrYI2RqEKD7mlGqLnGovlcYnBK0IqUA=="], + + "tapable": ["tapable@2.2.2", "", {}, "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg=="], + + "tar": ["tar@7.4.3", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.0.1", "mkdirp": "^3.0.1", "yallist": "^5.0.0" } }, "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw=="], + + "tar-fs": ["tar-fs@2.1.3", "", { "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", "tar-stream": "^2.1.4" } }, "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg=="], + + "tar-stream": ["tar-stream@2.2.0", "", { "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" } }, "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ=="], + + "temp-dir": ["temp-dir@2.0.0", "", {}, "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg=="], + + "terminal-link": ["terminal-link@2.1.1", "", { "dependencies": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" } }, "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ=="], + + "terser": ["terser@5.43.0", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.14.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-CqNNxKSGKSZCunSvwKLTs8u8sGGlp27sxNZ4quGh0QeNuyHM0JSEM/clM9Mf4zUp6J+tO2gUXhgXT2YMMkwfKQ=="], + + "terser-webpack-plugin": ["terser-webpack-plugin@5.3.14", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", "schema-utils": "^4.3.0", "serialize-javascript": "^6.0.2", "terser": "^5.31.1" }, "peerDependencies": { "webpack": "^5.1.0" } }, "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw=="], + + "test-exclude": ["test-exclude@6.0.0", "", { "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" } }, "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w=="], + + "thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="], + + "thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="], + + "thread-stream": ["thread-stream@2.7.0", "", { "dependencies": { "real-require": "^0.2.0" } }, "sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw=="], + + "throat": ["throat@5.0.0", "", {}, "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA=="], + + "through": ["through@2.3.8", "", {}, "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="], + + "tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="], + + "tiny-salad-4531": ["tiny-salad-4531@workspace:apps/beta"], + + "tinybench": ["tinybench@2.9.0", "", {}, "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg=="], + + "tinycolor2": ["tinycolor2@1.6.0", "", {}, "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw=="], + + "tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], + + "tinyglobby": ["tinyglobby@0.2.14", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ=="], + + "tinypool": ["tinypool@1.1.1", "", {}, "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg=="], + + "tinyqueue": ["tinyqueue@2.0.3", "", {}, "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA=="], + + "tinyrainbow": ["tinyrainbow@1.2.0", "", {}, "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ=="], + + "tinyspy": ["tinyspy@3.0.2", "", {}, "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q=="], + + "tlds": ["tlds@1.259.0", "", { "bin": { "tlds": "bin.js" } }, "sha512-AldGGlDP0PNgwppe2quAvuBl18UcjuNtOnDuUkqhd6ipPqrYYBt3aTxK1QTsBVknk97lS2JcafWMghjGWFtunw=="], + + "tmpl": ["tmpl@1.0.5", "", {}, "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "toggle-selection": ["toggle-selection@1.0.6", "", {}, "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ=="], + + "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], + + "totalist": ["totalist@3.0.1", "", {}, "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ=="], + + "tough-cookie": ["tough-cookie@2.5.0", "", { "dependencies": { "psl": "^1.1.28", "punycode": "^2.1.1" } }, "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g=="], + + "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], + + "ts-api-utils": ["ts-api-utils@2.1.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="], + + "ts-dedent": ["ts-dedent@2.2.0", "", {}, "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ=="], + + "ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="], + + "ts-morph": ["ts-morph@16.0.0", "", { "dependencies": { "@ts-morph/common": "~0.17.0", "code-block-writer": "^11.0.3" } }, "sha512-jGNF0GVpFj0orFw55LTsQxVYEUOCWBAbR5Ls7fTYE5pQsbW18ssTb/6UXx/GYAEjS+DQTp8VoTw0vqYMiaaQuw=="], + + "ts-toolbelt": ["ts-toolbelt@9.6.0", "", {}, "sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w=="], + + "tsconfig-paths": ["tsconfig-paths@4.2.0", "", { "dependencies": { "json5": "^2.2.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg=="], + + "tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "tsx": ["tsx@4.20.3", "", { "dependencies": { "esbuild": "~0.25.0", "get-tsconfig": "^4.7.5" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ=="], + + "tunnel-agent": ["tunnel-agent@0.6.0", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w=="], + + "turbo": ["turbo@2.5.4", "", { "optionalDependencies": { "turbo-darwin-64": "2.5.4", "turbo-darwin-arm64": "2.5.4", "turbo-linux-64": "2.5.4", "turbo-linux-arm64": "2.5.4", "turbo-windows-64": "2.5.4", "turbo-windows-arm64": "2.5.4" }, "bin": { "turbo": "bin/turbo" } }, "sha512-kc8ZibdRcuWUG1pbYSBFWqmIjynlD8Lp7IB6U3vIzvOv9VG+6Sp8bzyeBWE3Oi8XV5KsQrznyRTBPvrf99E4mA=="], + + "turbo-darwin-64": ["turbo-darwin-64@2.5.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-ah6YnH2dErojhFooxEzmvsoZQTMImaruZhFPfMKPBq8sb+hALRdvBNLqfc8NWlZq576FkfRZ/MSi4SHvVFT9PQ=="], + + "turbo-darwin-arm64": ["turbo-darwin-arm64@2.5.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-2+Nx6LAyuXw2MdXb7pxqle3MYignLvS7OwtsP9SgtSBaMlnNlxl9BovzqdYAgkUW3AsYiQMJ/wBRb7d+xemM5A=="], + + "turbo-linux-64": ["turbo-linux-64@2.5.4", "", { "os": "linux", "cpu": "x64" }, "sha512-5May2kjWbc8w4XxswGAl74GZ5eM4Gr6IiroqdLhXeXyfvWEdm2mFYCSWOzz0/z5cAgqyGidF1jt1qzUR8hTmOA=="], + + "turbo-linux-arm64": ["turbo-linux-arm64@2.5.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-/2yqFaS3TbfxV3P5yG2JUI79P7OUQKOUvAnx4MV9Bdz6jqHsHwc9WZPpO4QseQm+NvmgY6ICORnoVPODxGUiJg=="], + + "turbo-windows-64": ["turbo-windows-64@2.5.4", "", { "os": "win32", "cpu": "x64" }, "sha512-EQUO4SmaCDhO6zYohxIjJpOKRN3wlfU7jMAj3CgcyTPvQR/UFLEKAYHqJOnJtymbQmiiM/ihX6c6W6Uq0yC7mA=="], + + "turbo-windows-arm64": ["turbo-windows-arm64@2.5.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-oQ8RrK1VS8lrxkLriotFq+PiF7iiGgkZtfLKF4DDKsmdbPo0O9R2mQxm7jHLuXraRCuIQDWMIw6dpcr7Iykf4A=="], + + "tween-functions": ["tween-functions@1.2.0", "", {}, "sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA=="], + + "tweetnacl": ["tweetnacl@1.0.3", "", {}, "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw=="], + + "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], + + "type-detect": ["type-detect@4.0.8", "", {}, "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g=="], + + "type-fest": ["type-fest@2.19.0", "", {}, "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA=="], + + "type-is": ["type-is@2.0.1", "", { "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw=="], + + "typed-array-buffer": ["typed-array-buffer@1.0.3", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" } }, "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw=="], + + "typed-array-byte-length": ["typed-array-byte-length@1.0.3", "", { "dependencies": { "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.14" } }, "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg=="], + + "typed-array-byte-offset": ["typed-array-byte-offset@1.0.4", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.15", "reflect.getprototypeof": "^1.0.9" } }, "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ=="], + + "typed-array-length": ["typed-array-length@1.0.7", "", { "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", "is-typed-array": "^1.1.13", "possible-typed-array-names": "^1.0.0", "reflect.getprototypeof": "^1.0.6" } }, "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg=="], + + "types-ramda": ["types-ramda@0.30.1", "", { "dependencies": { "ts-toolbelt": "^9.6.0" } }, "sha512-1HTsf5/QVRmLzcGfldPFvkVsAdi1db1BBKzi7iW3KBUlOICg/nKnFS+jGqDJS3YD8VsWbAh7JiHeBvbsw8RPxA=="], + + "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], + + "typescript-eslint": ["typescript-eslint@8.34.1", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.34.1", "@typescript-eslint/parser": "8.34.1", "@typescript-eslint/utils": "8.34.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-XjS+b6Vg9oT1BaIUfkW3M3LvqZE++rbzAMEHuccCfO/YkP43ha6w3jTEMilQxMF92nVOYCcdjv1ZUhAa1D/0ow=="], + + "ua-parser-js": ["ua-parser-js@1.0.40", "", { "bin": { "ua-parser-js": "script/cli.js" } }, "sha512-z6PJ8Lml+v3ichVojCiB8toQJBuwR42ySM4ezjXIqXK3M0HczmKQ3LF4rhU55PfD99KEEXQG6yb7iOMyvYuHew=="], + + "ufo": ["ufo@1.6.1", "", {}, "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA=="], + + "uint8arrays": ["uint8arrays@3.0.0", "", { "dependencies": { "multiformats": "^9.4.2" } }, "sha512-HRCx0q6O9Bfbp+HHSfQQKD7wU70+lydKVt4EghkdOvlK/NlrF90z+eXV34mUd48rNvVJXwkrMSPpCATkct8fJA=="], + + "unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="], + + "uncrypto": ["uncrypto@0.1.3", "", {}, "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="], + + "undici": ["undici@5.29.0", "", { "dependencies": { "@fastify/busboy": "^2.0.0" } }, "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg=="], + + "undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + + "unenv": ["unenv@2.0.0-rc.14", "", { "dependencies": { "defu": "^6.1.4", "exsolve": "^1.0.1", "ohash": "^2.0.10", "pathe": "^2.0.3", "ufo": "^1.5.4" } }, "sha512-od496pShMen7nOy5VmVJCnq8rptd45vh6Nx/r2iPbrba6pa6p+tS2ywuIHRZ/OBvSbQZB0kWvpO9XBNVFXHD3Q=="], + + "unicode-canonical-property-names-ecmascript": ["unicode-canonical-property-names-ecmascript@2.0.1", "", {}, "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg=="], + + "unicode-match-property-ecmascript": ["unicode-match-property-ecmascript@2.0.0", "", { "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" } }, "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q=="], + + "unicode-match-property-value-ecmascript": ["unicode-match-property-value-ecmascript@2.2.0", "", {}, "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg=="], + + "unicode-property-aliases-ecmascript": ["unicode-property-aliases-ecmascript@2.1.0", "", {}, "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w=="], + + "unique-string": ["unique-string@2.0.0", "", { "dependencies": { "crypto-random-string": "^2.0.0" } }, "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg=="], + + "universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], + + "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], + + "unplugin": ["unplugin@1.16.1", "", { "dependencies": { "acorn": "^8.14.0", "webpack-virtual-modules": "^0.6.2" } }, "sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w=="], + + "unrs-resolver": ["unrs-resolver@1.9.0", "", { "dependencies": { "napi-postinstall": "^0.2.2" }, "optionalDependencies": { "@unrs/resolver-binding-android-arm-eabi": "1.9.0", "@unrs/resolver-binding-android-arm64": "1.9.0", "@unrs/resolver-binding-darwin-arm64": "1.9.0", "@unrs/resolver-binding-darwin-x64": "1.9.0", "@unrs/resolver-binding-freebsd-x64": "1.9.0", "@unrs/resolver-binding-linux-arm-gnueabihf": "1.9.0", "@unrs/resolver-binding-linux-arm-musleabihf": "1.9.0", "@unrs/resolver-binding-linux-arm64-gnu": "1.9.0", "@unrs/resolver-binding-linux-arm64-musl": "1.9.0", "@unrs/resolver-binding-linux-ppc64-gnu": "1.9.0", "@unrs/resolver-binding-linux-riscv64-gnu": "1.9.0", "@unrs/resolver-binding-linux-riscv64-musl": "1.9.0", "@unrs/resolver-binding-linux-s390x-gnu": "1.9.0", "@unrs/resolver-binding-linux-x64-gnu": "1.9.0", "@unrs/resolver-binding-linux-x64-musl": "1.9.0", "@unrs/resolver-binding-wasm32-wasi": "1.9.0", "@unrs/resolver-binding-win32-arm64-msvc": "1.9.0", "@unrs/resolver-binding-win32-ia32-msvc": "1.9.0", "@unrs/resolver-binding-win32-x64-msvc": "1.9.0" } }, "sha512-wqaRu4UnzBD2ABTC1kLfBjAqIDZ5YUTr/MLGa7By47JV1bJDSW7jq/ZSLigB7enLe7ubNaJhtnBXgrc/50cEhg=="], + + "unstorage": ["unstorage@1.16.0", "", { "dependencies": { "anymatch": "^3.1.3", "chokidar": "^4.0.3", "destr": "^2.0.5", "h3": "^1.15.2", "lru-cache": "^10.4.3", "node-fetch-native": "^1.6.6", "ofetch": "^1.4.1", "ufo": "^1.6.1" }, "peerDependencies": { "@azure/app-configuration": "^1.8.0", "@azure/cosmos": "^4.2.0", "@azure/data-tables": "^13.3.0", "@azure/identity": "^4.6.0", "@azure/keyvault-secrets": "^4.9.0", "@azure/storage-blob": "^12.26.0", "@capacitor/preferences": "^6.0.3 || ^7.0.0", "@deno/kv": ">=0.9.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.34.3", "@vercel/blob": ">=0.27.1", "@vercel/kv": "^1.0.1", "aws4fetch": "^1.0.20", "db0": ">=0.2.1", "idb-keyval": "^6.2.1", "ioredis": "^5.4.2", "uploadthing": "^7.4.4" }, "optionalPeers": ["@azure/app-configuration", "@azure/cosmos", "@azure/data-tables", "@azure/identity", "@azure/keyvault-secrets", "@azure/storage-blob", "@capacitor/preferences", "@deno/kv", "@netlify/blobs", "@planetscale/database", "@upstash/redis", "@vercel/blob", "@vercel/kv", "aws4fetch", "db0", "idb-keyval", "ioredis", "uploadthing"] }, "sha512-WQ37/H5A7LcRPWfYOrDa1Ys02xAbpPJq6q5GkO88FBXVSQzHd7+BjEwfRqyaSWCv9MbsJy058GWjjPjcJ16GGA=="], + + "untildify": ["untildify@3.0.3", "", {}, "sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA=="], + + "update-browserslist-db": ["update-browserslist-db@1.1.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw=="], + + "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], + + "url": ["url@0.11.4", "", { "dependencies": { "punycode": "^1.4.1", "qs": "^6.12.3" } }, "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg=="], + + "url-template": ["url-template@2.0.8", "", {}, "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw=="], + + "use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="], + + "use-latest-callback": ["use-latest-callback@0.2.4", "", { "peerDependencies": { "react": ">=16.8" } }, "sha512-LS2s2n1usUUnDq4oVh1ca6JFX9uSqUncTfAm44WMg0v6TxL7POUTk1B044NH8TeLkFbNajIsgDHcgNpNzZucdg=="], + + "use-sidecar": ["use-sidecar@1.1.3", "", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="], + + "use-sync-external-store": ["use-sync-external-store@1.5.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A=="], + + "user-home": ["user-home@2.0.0", "", { "dependencies": { "os-homedir": "^1.0.0" } }, "sha512-KMWqdlOcjCYdtIJpicDSFBQ8nFwS2i9sslAd6f4+CBGcU4gist2REnr2fxj2YocvJFxSF3ZOHLYLVZnUxv4BZQ=="], + + "util": ["util@0.12.5", "", { "dependencies": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", "is-generator-function": "^1.0.7", "is-typed-array": "^1.1.3", "which-typed-array": "^1.1.2" } }, "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "utils-merge": ["utils-merge@1.0.1", "", {}, "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="], + + "uuid": ["uuid@11.1.0", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A=="], + + "v8-to-istanbul": ["v8-to-istanbul@9.3.0", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^2.0.0" } }, "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA=="], + + "validate-npm-package-name": ["validate-npm-package-name@5.0.1", "", {}, "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ=="], + + "varint": ["varint@6.0.0", "", {}, "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg=="], + + "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], + + "verror": ["verror@1.10.0", "", { "dependencies": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } }, "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw=="], + + "victory-vendor": ["victory-vendor@36.9.2", "", { "dependencies": { "@types/d3-array": "^3.0.3", "@types/d3-ease": "^3.0.0", "@types/d3-interpolate": "^3.0.1", "@types/d3-scale": "^4.0.2", "@types/d3-shape": "^3.1.0", "@types/d3-time": "^3.0.0", "@types/d3-timer": "^3.0.0", "d3-array": "^3.1.6", "d3-ease": "^3.0.1", "d3-interpolate": "^3.0.1", "d3-scale": "^4.0.2", "d3-shape": "^3.1.0", "d3-time": "^3.0.0", "d3-timer": "^3.0.1" } }, "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ=="], + + "viewport-mercator-project": ["viewport-mercator-project@7.0.4", "", { "dependencies": { "@math.gl/web-mercator": "^3.5.5" } }, "sha512-0jzpL6pIMocCKWg1C3mqi/N4UPgZC3FzwghEm1H+XsUo8hNZAyJc3QR7YqC816ibOR8aWT5pCsV+gCu8/BMJgg=="], + + "vite": ["vite@6.3.5", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ=="], + + "vite-node": ["vite-node@2.1.8", "", { "dependencies": { "cac": "^6.7.14", "debug": "^4.3.7", "es-module-lexer": "^1.5.4", "pathe": "^1.1.2", "vite": "^5.0.0" }, "bin": { "vite-node": "vite-node.mjs" } }, "sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg=="], + + "vitest": ["vitest@2.1.8", "", { "dependencies": { "@vitest/expect": "2.1.8", "@vitest/mocker": "2.1.8", "@vitest/pretty-format": "^2.1.8", "@vitest/runner": "2.1.8", "@vitest/snapshot": "2.1.8", "@vitest/spy": "2.1.8", "@vitest/utils": "2.1.8", "chai": "^5.1.2", "debug": "^4.3.7", "expect-type": "^1.1.0", "magic-string": "^0.30.12", "pathe": "^1.1.2", "std-env": "^3.8.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.1", "tinypool": "^1.0.1", "tinyrainbow": "^1.2.0", "vite": "^5.0.0", "vite-node": "2.1.8", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@types/node": "^18.0.0 || >=20.0.0", "@vitest/browser": "2.1.8", "@vitest/ui": "2.1.8", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@types/node", "@vitest/browser", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ=="], + + "vlq": ["vlq@1.0.1", "", {}, "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w=="], + + "void-elements": ["void-elements@3.1.0", "", {}, "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w=="], + + "vt-pbf": ["vt-pbf@3.1.3", "", { "dependencies": { "@mapbox/point-geometry": "0.1.0", "@mapbox/vector-tile": "^1.3.1", "pbf": "^3.2.1" } }, "sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA=="], + + "walker": ["walker@1.0.8", "", { "dependencies": { "makeerror": "1.0.12" } }, "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ=="], + + "warn-once": ["warn-once@0.1.1", "", {}, "sha512-VkQZJbO8zVImzYFteBXvBOZEl1qL175WH8VmZcxF2fZAoudNhNDvHi+doCaAEdU2l2vtcIwa2zn0QK5+I1HQ3Q=="], + + "warning": ["warning@4.0.3", "", { "dependencies": { "loose-envify": "^1.0.0" } }, "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w=="], + + "watchpack": ["watchpack@2.4.4", "", { "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" } }, "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA=="], + + "wcwidth": ["wcwidth@1.0.1", "", { "dependencies": { "defaults": "^1.0.3" } }, "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg=="], + + "web-vitals": ["web-vitals@4.2.4", "", {}, "sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw=="], + + "webidl-conversions": ["webidl-conversions@5.0.0", "", {}, "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA=="], + + "webpack": ["webpack@5.99.9", "", { "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", "acorn": "^8.14.0", "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^4.3.2", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.11", "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { "webpack": "bin/webpack.js" } }, "sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg=="], + + "webpack-sources": ["webpack-sources@3.3.2", "", {}, "sha512-ykKKus8lqlgXX/1WjudpIEjqsafjOTcOJqxnAbMLAu/KCsDCJ6GBtvscewvTkrn24HsnvFwrSCbenFrhtcCsAA=="], + + "webpack-virtual-modules": ["webpack-virtual-modules@0.6.2", "", {}, "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="], + + "whatwg-fetch": ["whatwg-fetch@3.6.20", "", {}, "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg=="], + + "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], + + "whatwg-url-without-unicode": ["whatwg-url-without-unicode@8.0.0-3", "", { "dependencies": { "buffer": "^5.4.3", "punycode": "^2.1.1", "webidl-conversions": "^5.0.0" } }, "sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig=="], + + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "which-boxed-primitive": ["which-boxed-primitive@1.1.1", "", { "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", "is-number-object": "^1.1.1", "is-string": "^1.1.1", "is-symbol": "^1.1.1" } }, "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA=="], + + "which-builtin-type": ["which-builtin-type@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.1.0", "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.1.0", "which-collection": "^1.0.2", "which-typed-array": "^1.1.16" } }, "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q=="], + + "which-collection": ["which-collection@1.0.2", "", { "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", "is-weakmap": "^2.0.2", "is-weakset": "^2.0.3" } }, "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw=="], + + "which-typed-array": ["which-typed-array@1.1.19", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw=="], + + "white-scene-4cbd": ["white-scene-4cbd@workspace:apps/doc"], + + "why-is-node-running": ["why-is-node-running@2.3.0", "", { "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": { "why-is-node-running": "cli.js" } }, "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w=="], + + "wonka": ["wonka@6.3.5", "", {}, "sha512-SSil+ecw6B4/Dm7Pf2sAshKQ5hWFvfyGlfPbEd6A14dOH6VDjrmbY86u6nZvy9omGwwIPFR8V41+of1EezgoUw=="], + + "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], + + "workerd": ["workerd@1.20250408.0", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20250408.0", "@cloudflare/workerd-darwin-arm64": "1.20250408.0", "@cloudflare/workerd-linux-64": "1.20250408.0", "@cloudflare/workerd-linux-arm64": "1.20250408.0", "@cloudflare/workerd-windows-64": "1.20250408.0" }, "bin": { "workerd": "bin/workerd" } }, "sha512-bBUX+UsvpzAqiWFNeZrlZmDGddiGZdBBbftZJz2wE6iUg/cIAJeVQYTtS/3ahaicguoLBz4nJiDo8luqM9fx1A=="], + + "wrangler": ["wrangler@3.114.9", "", { "dependencies": { "@cloudflare/kv-asset-handler": "0.3.4", "@cloudflare/unenv-preset": "2.0.2", "@esbuild-plugins/node-globals-polyfill": "0.2.3", "@esbuild-plugins/node-modules-polyfill": "0.2.2", "blake3-wasm": "2.1.5", "esbuild": "0.17.19", "miniflare": "3.20250408.2", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.14", "workerd": "1.20250408.0" }, "optionalDependencies": { "fsevents": "~2.3.2", "sharp": "^0.33.5" }, "peerDependencies": { "@cloudflare/workers-types": "^4.20250408.0" }, "optionalPeers": ["@cloudflare/workers-types"], "bin": { "wrangler": "bin/wrangler.js", "wrangler2": "bin/wrangler.js" } }, "sha512-1e0gL+rxLF04kM9bW4sxoDGLXpJ1x53Rx1t18JuUm6F67qadKKPISyUAXuBeIQudWrCWEBXaTVnSdLHz0yBXbA=="], + + "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + + "write-file-atomic": ["write-file-atomic@4.0.2", "", { "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" } }, "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg=="], + + "ws": ["ws@8.18.2", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ=="], + + "xcode": ["xcode@3.0.1", "", { "dependencies": { "simple-plist": "^1.1.0", "uuid": "^7.0.3" } }, "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA=="], + + "xml2js": ["xml2js@0.6.0", "", { "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" } }, "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w=="], + + "xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], + + "xtend": ["xtend@4.0.2", "", {}, "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="], + + "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + + "yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + + "yaml": ["yaml@2.8.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ=="], + + "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + + "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + + "yesno": ["yesno@0.4.0", "", {}, "sha512-tdBxmHvbXPBKYIg81bMCB7bVeDmHkRzk5rVJyYYXurwKkHq/MCd8rz4HSJUP7hW0H2NlXiq8IFiWvYKEHhlotA=="], + + "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], + + "youch": ["youch@3.2.3", "", { "dependencies": { "cookie": "^0.5.0", "mustache": "^4.2.0", "stacktracey": "^2.1.8" } }, "sha512-ZBcWz/uzZaQVdCvfV4uk616Bbpf2ee+F/AvuKDR5EwX/Y4v06xWdtMluqTD7+KlZdM93lLm9gMZYo0sKBS0pgw=="], + + "zod": ["zod@3.25.67", "", {}, "sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw=="], + + "zod-to-json-schema": ["zod-to-json-schema@3.24.5", "", { "peerDependencies": { "zod": "^3.24.1" } }, "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g=="], + + "zx": ["zx@8.5.5", "", { "bin": { "zx": "build/cli.js" } }, "sha512-kzkjV3uqyEthw1IBDbA7Co2djji77vCP1DRvt58aYSMwiX4nyvAkFE8OBSEsOUbDJAst0Yo4asNvMTGG5HGPXA=="], + + "@atproto-labs/fetch-node/ipaddr.js": ["ipaddr.js@2.2.0", "", {}, "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA=="], + + "@atproto-labs/fetch-node/undici": ["undici@6.21.3", "", {}, "sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw=="], + + "@atproto-labs/identity-resolver/@atproto/syntax": ["@atproto/syntax@0.4.0", "", {}, "sha512-b9y5ceHS8YKOfP3mdKmwAx5yVj9294UN7FG2XzP6V5aKUdFazEYRnR9m5n5ZQFKa3GNvz7de9guZCJ/sUTcOAA=="], + + "@atproto/api/@atproto/syntax": ["@atproto/syntax@0.4.0", "", {}, "sha512-b9y5ceHS8YKOfP3mdKmwAx5yVj9294UN7FG2XzP6V5aKUdFazEYRnR9m5n5ZQFKa3GNvz7de9guZCJ/sUTcOAA=="], + + "@atproto/common/@ipld/dag-cbor": ["@ipld/dag-cbor@7.0.3", "", { "dependencies": { "cborg": "^1.6.0", "multiformats": "^9.5.4" } }, "sha512-1VVh2huHsuohdXC1bGJNE8WR72slZ9XE2T3wbBBq31dm7ZBatmKLLxrB+XAqafxfRFjv08RZmj/W/ZqaM13AuA=="], + + "@atproto/lex-cli/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "@atproto/lex-cli/commander": ["commander@9.5.0", "", {}, "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ=="], + + "@atproto/lexicon/@atproto/syntax": ["@atproto/syntax@0.4.0", "", {}, "sha512-b9y5ceHS8YKOfP3mdKmwAx5yVj9294UN7FG2XzP6V5aKUdFazEYRnR9m5n5ZQFKa3GNvz7de9guZCJ/sUTcOAA=="], + + "@atproto/repo/@ipld/dag-cbor": ["@ipld/dag-cbor@7.0.3", "", { "dependencies": { "cborg": "^1.6.0", "multiformats": "^9.5.4" } }, "sha512-1VVh2huHsuohdXC1bGJNE8WR72slZ9XE2T3wbBBq31dm7ZBatmKLLxrB+XAqafxfRFjv08RZmj/W/ZqaM13AuA=="], + + "@atproto/sync/@atproto/syntax": ["@atproto/syntax@0.4.0", "", {}, "sha512-b9y5ceHS8YKOfP3mdKmwAx5yVj9294UN7FG2XzP6V5aKUdFazEYRnR9m5n5ZQFKa3GNvz7de9guZCJ/sUTcOAA=="], + + "@atproto/sync/@atproto/xrpc-server": ["@atproto/xrpc-server@0.8.0", "", { "dependencies": { "@atproto/common": "^0.4.11", "@atproto/crypto": "^0.4.4", "@atproto/lexicon": "^0.4.11", "@atproto/xrpc": "^0.7.0", "cbor-x": "^1.5.1", "express": "^4.17.2", "http-errors": "^2.0.0", "mime-types": "^2.1.35", "rate-limiter-flexible": "^2.4.1", "uint8arrays": "3.0.0", "ws": "^8.12.0", "zod": "^3.23.8" } }, "sha512-jDAEVHVhM4IvC0y491gXBuD4b1D9/XrM3HaEronRneAdNZ0qE0nsiJNqiHfQ6r4BvFdHnABM9KyHV9EQTvmxfg=="], + + "@atproto/xrpc-server/express": ["express@4.21.2", "", { "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.19.0", "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" } }, "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA=="], + + "@atproto/xrpc-server/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + + "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/helper-create-class-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/helper-create-regexp-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/highlight/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], + + "@babel/plugin-transform-classes/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], + + "@babel/plugin-transform-runtime/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], + + "@babel/traverse--for-generate-function-map/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], + + "@chromatic-com/storybook/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], + + "@cloudflare/vitest-pool-workers/esbuild": ["esbuild@0.17.19", "", { "optionalDependencies": { "@esbuild/android-arm": "0.17.19", "@esbuild/android-arm64": "0.17.19", "@esbuild/android-x64": "0.17.19", "@esbuild/darwin-arm64": "0.17.19", "@esbuild/darwin-x64": "0.17.19", "@esbuild/freebsd-arm64": "0.17.19", "@esbuild/freebsd-x64": "0.17.19", "@esbuild/linux-arm": "0.17.19", "@esbuild/linux-arm64": "0.17.19", "@esbuild/linux-ia32": "0.17.19", "@esbuild/linux-loong64": "0.17.19", "@esbuild/linux-mips64el": "0.17.19", "@esbuild/linux-ppc64": "0.17.19", "@esbuild/linux-riscv64": "0.17.19", "@esbuild/linux-s390x": "0.17.19", "@esbuild/linux-x64": "0.17.19", "@esbuild/netbsd-x64": "0.17.19", "@esbuild/openbsd-x64": "0.17.19", "@esbuild/sunos-x64": "0.17.19", "@esbuild/win32-arm64": "0.17.19", "@esbuild/win32-ia32": "0.17.19", "@esbuild/win32-x64": "0.17.19" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw=="], + + "@cloudflare/vitest-pool-workers/wrangler": ["wrangler@3.109.1", "", { "dependencies": { "@cloudflare/kv-asset-handler": "0.3.4", "@esbuild-plugins/node-globals-polyfill": "0.2.3", "@esbuild-plugins/node-modules-polyfill": "0.2.2", "blake3-wasm": "2.1.5", "esbuild": "0.17.19", "miniflare": "3.20250204.1", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.1", "workerd": "1.20250204.0" }, "optionalDependencies": { "fsevents": "~2.3.2", "sharp": "^0.33.5" }, "peerDependencies": { "@cloudflare/workers-types": "^4.20250204.0" }, "optionalPeers": ["@cloudflare/workers-types"], "bin": { "wrangler": "bin/wrangler.js", "wrangler2": "bin/wrangler.js" } }, "sha512-1Jx+nZ6eCXPQ2rsGdrV6Qy/LGvhpqudeuTl4AYHl9P8Zugp44Uzxnj5w11qF4v/rv1dOZoA5TydSt9xMFfhpKg=="], + + "@cspotcode/source-map-support/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.9", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="], + + "@emnapi/core/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@emnapi/runtime/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@emnapi/wasi-threads/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@emotion/babel-plugin/convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], + + "@emotion/babel-plugin/source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], + + "@esbuild-kit/core-utils/esbuild": ["esbuild@0.18.20", "", { "optionalDependencies": { "@esbuild/android-arm": "0.18.20", "@esbuild/android-arm64": "0.18.20", "@esbuild/android-x64": "0.18.20", "@esbuild/darwin-arm64": "0.18.20", "@esbuild/darwin-x64": "0.18.20", "@esbuild/freebsd-arm64": "0.18.20", "@esbuild/freebsd-x64": "0.18.20", "@esbuild/linux-arm": "0.18.20", "@esbuild/linux-arm64": "0.18.20", "@esbuild/linux-ia32": "0.18.20", "@esbuild/linux-loong64": "0.18.20", "@esbuild/linux-mips64el": "0.18.20", "@esbuild/linux-ppc64": "0.18.20", "@esbuild/linux-riscv64": "0.18.20", "@esbuild/linux-s390x": "0.18.20", "@esbuild/linux-x64": "0.18.20", "@esbuild/netbsd-x64": "0.18.20", "@esbuild/openbsd-x64": "0.18.20", "@esbuild/sunos-x64": "0.18.20", "@esbuild/win32-arm64": "0.18.20", "@esbuild/win32-ia32": "0.18.20", "@esbuild/win32-x64": "0.18.20" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA=="], + + "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + + "@eslint/plugin-kit/@eslint/core": ["@eslint/core@0.15.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-b7ePw78tEWWkpgZCDYkbqDOP8dmM6qe+AOC6iuJqlq1R/0ahMAeH3qynpnqKFGkMltrp44ohV4ubGyvLX28tzw=="], + + "@expo/cli/accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="], + + "@expo/cli/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "@expo/cli/glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], + + "@expo/cli/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "@expo/cli/picomatch": ["picomatch@3.0.1", "", {}, "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag=="], + + "@expo/cli/send": ["send@0.19.0", "", { "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "2.4.1", "range-parser": "~1.2.1", "statuses": "2.0.1" } }, "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw=="], + + "@expo/cli/undici": ["undici@6.21.3", "", {}, "sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw=="], + + "@expo/config/@babel/code-frame": ["@babel/code-frame@7.10.4", "", { "dependencies": { "@babel/highlight": "^7.10.4" } }, "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg=="], + + "@expo/config/getenv": ["getenv@1.0.0", "", {}, "sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg=="], + + "@expo/config/glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], + + "@expo/config-plugins/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "@expo/config-plugins/getenv": ["getenv@1.0.0", "", {}, "sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg=="], + + "@expo/config-plugins/glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], + + "@expo/devcert/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], + + "@expo/devcert/glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], + + "@expo/env/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "@expo/env/dotenv": ["dotenv@16.4.7", "", {}, "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ=="], + + "@expo/env/getenv": ["getenv@1.0.0", "", {}, "sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg=="], + + "@expo/fingerprint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "@expo/fingerprint/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "@expo/image-utils/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "@expo/image-utils/getenv": ["getenv@1.0.0", "", {}, "sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg=="], + + "@expo/json-file/@babel/code-frame": ["@babel/code-frame@7.10.4", "", { "dependencies": { "@babel/highlight": "^7.10.4" } }, "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg=="], + + "@expo/metro-config/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "@expo/metro-config/dotenv": ["dotenv@16.4.7", "", {}, "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ=="], + + "@expo/metro-config/getenv": ["getenv@1.0.0", "", {}, "sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg=="], + + "@expo/metro-config/glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], + + "@expo/metro-config/lightningcss": ["lightningcss@1.27.0", "", { "dependencies": { "detect-libc": "^1.0.3" }, "optionalDependencies": { "lightningcss-darwin-arm64": "1.27.0", "lightningcss-darwin-x64": "1.27.0", "lightningcss-freebsd-x64": "1.27.0", "lightningcss-linux-arm-gnueabihf": "1.27.0", "lightningcss-linux-arm64-gnu": "1.27.0", "lightningcss-linux-arm64-musl": "1.27.0", "lightningcss-linux-x64-gnu": "1.27.0", "lightningcss-linux-x64-musl": "1.27.0", "lightningcss-win32-arm64-msvc": "1.27.0", "lightningcss-win32-x64-msvc": "1.27.0" } }, "sha512-8f7aNmS1+etYSLHht0fQApPc2kNO8qGRutifN5rVIc6Xo6ABsEbqOr758UwI7ALVbTt4x1fllKt0PYgzD9S3yQ=="], + + "@expo/metro-config/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "@expo/metro-config/postcss": ["postcss@8.4.49", "", { "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA=="], + + "@expo/package-manager/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "@expo/prebuild-config/@react-native/normalize-colors": ["@react-native/normalize-colors@0.79.2", "", {}, "sha512-+b+GNrupWrWw1okHnEENz63j7NSMqhKeFMOyzYLBwKcprG8fqJQhDIGXfizKdxeIa5NnGSAevKL1Ev1zJ56X8w=="], + + "@expo/server/undici": ["undici@7.10.0", "", {}, "sha512-u5otvFBOBZvmdjWLVW+5DAc9Nkq8f24g0O9oY7qw2JVIF1VocIFoyz9JFkuVOS2j41AufeO0xnlweJ2RLT8nGw=="], + + "@expo/xcpretty/@babel/code-frame": ["@babel/code-frame@7.10.4", "", { "dependencies": { "@babel/highlight": "^7.10.4" } }, "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg=="], + + "@expo/xcpretty/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="], + + "@ipld/dag-cbor/multiformats": ["multiformats@13.3.7", "", {}, "sha512-meL9DERHj+fFVWoOX9fXqfcYcSpUfSYJPcFvDPKrxitICbwAoWR+Ut4j5NO9zAT917HUHLQmqzQbAsGNHlDcxQ=="], + + "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + + "@isaacs/cliui/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], + + "@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], + + "@istanbuljs/load-nyc-config/camelcase": ["camelcase@5.3.1", "", {}, "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="], + + "@istanbuljs/load-nyc-config/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], + + "@istanbuljs/load-nyc-config/js-yaml": ["js-yaml@3.14.1", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g=="], + + "@jest/console/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "@jest/core/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "@jest/reporters/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "@jest/reporters/jest-worker": ["jest-worker@29.7.0", "", { "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw=="], + + "@jest/transform/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "@jest/types/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "@joshwooding/vite-plugin-react-docgen-typescript/glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], + + "@joshwooding/vite-plugin-react-docgen-typescript/magic-string": ["magic-string@0.27.0", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.13" } }, "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA=="], + + "@opentelemetry/exporter-logs-otlp-grpc/@opentelemetry/core": ["@opentelemetry/core@2.0.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ=="], + + "@opentelemetry/exporter-logs-otlp-http/@opentelemetry/core": ["@opentelemetry/core@2.0.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ=="], + + "@opentelemetry/exporter-logs-otlp-proto/@opentelemetry/core": ["@opentelemetry/core@2.0.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ=="], + + "@opentelemetry/exporter-logs-otlp-proto/@opentelemetry/resources": ["@opentelemetry/resources@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg=="], + + "@opentelemetry/exporter-metrics-otlp-grpc/@opentelemetry/core": ["@opentelemetry/core@2.0.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ=="], + + "@opentelemetry/exporter-metrics-otlp-grpc/@opentelemetry/resources": ["@opentelemetry/resources@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg=="], + + "@opentelemetry/exporter-metrics-otlp-grpc/@opentelemetry/sdk-metrics": ["@opentelemetry/sdk-metrics@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/resources": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, "sha512-Bvy8QDjO05umd0+j+gDeWcTaVa1/R2lDj/eOvjzpm8VQj1K1vVZJuyjThpV5/lSHyYW2JaHF2IQ7Z8twJFAhjA=="], + + "@opentelemetry/exporter-metrics-otlp-http/@opentelemetry/core": ["@opentelemetry/core@2.0.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ=="], + + "@opentelemetry/exporter-metrics-otlp-http/@opentelemetry/resources": ["@opentelemetry/resources@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg=="], + + "@opentelemetry/exporter-metrics-otlp-http/@opentelemetry/sdk-metrics": ["@opentelemetry/sdk-metrics@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/resources": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, "sha512-Bvy8QDjO05umd0+j+gDeWcTaVa1/R2lDj/eOvjzpm8VQj1K1vVZJuyjThpV5/lSHyYW2JaHF2IQ7Z8twJFAhjA=="], + + "@opentelemetry/exporter-metrics-otlp-proto/@opentelemetry/core": ["@opentelemetry/core@2.0.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ=="], + + "@opentelemetry/exporter-metrics-otlp-proto/@opentelemetry/resources": ["@opentelemetry/resources@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg=="], + + "@opentelemetry/exporter-metrics-otlp-proto/@opentelemetry/sdk-metrics": ["@opentelemetry/sdk-metrics@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/resources": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, "sha512-Bvy8QDjO05umd0+j+gDeWcTaVa1/R2lDj/eOvjzpm8VQj1K1vVZJuyjThpV5/lSHyYW2JaHF2IQ7Z8twJFAhjA=="], + + "@opentelemetry/exporter-prometheus/@opentelemetry/core": ["@opentelemetry/core@2.0.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ=="], + + "@opentelemetry/exporter-prometheus/@opentelemetry/resources": ["@opentelemetry/resources@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg=="], + + "@opentelemetry/exporter-prometheus/@opentelemetry/sdk-metrics": ["@opentelemetry/sdk-metrics@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/resources": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, "sha512-Bvy8QDjO05umd0+j+gDeWcTaVa1/R2lDj/eOvjzpm8VQj1K1vVZJuyjThpV5/lSHyYW2JaHF2IQ7Z8twJFAhjA=="], + + "@opentelemetry/exporter-trace-otlp-grpc/@opentelemetry/core": ["@opentelemetry/core@2.0.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ=="], + + "@opentelemetry/exporter-trace-otlp-grpc/@opentelemetry/resources": ["@opentelemetry/resources@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg=="], + + "@opentelemetry/exporter-trace-otlp-http/@opentelemetry/core": ["@opentelemetry/core@2.0.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ=="], + + "@opentelemetry/exporter-trace-otlp-http/@opentelemetry/resources": ["@opentelemetry/resources@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg=="], + + "@opentelemetry/exporter-trace-otlp-proto/@opentelemetry/core": ["@opentelemetry/core@2.0.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ=="], + + "@opentelemetry/exporter-trace-otlp-proto/@opentelemetry/resources": ["@opentelemetry/resources@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg=="], + + "@opentelemetry/exporter-zipkin/@opentelemetry/core": ["@opentelemetry/core@2.0.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ=="], + + "@opentelemetry/exporter-zipkin/@opentelemetry/resources": ["@opentelemetry/resources@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg=="], + + "@opentelemetry/instrumentation-http/@opentelemetry/core": ["@opentelemetry/core@2.0.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ=="], + + "@opentelemetry/otlp-exporter-base/@opentelemetry/core": ["@opentelemetry/core@2.0.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ=="], + + "@opentelemetry/otlp-grpc-exporter-base/@opentelemetry/core": ["@opentelemetry/core@2.0.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ=="], + + "@opentelemetry/otlp-transformer/@opentelemetry/core": ["@opentelemetry/core@2.0.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ=="], + + "@opentelemetry/otlp-transformer/@opentelemetry/resources": ["@opentelemetry/resources@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg=="], + + "@opentelemetry/otlp-transformer/@opentelemetry/sdk-metrics": ["@opentelemetry/sdk-metrics@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/resources": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, "sha512-Bvy8QDjO05umd0+j+gDeWcTaVa1/R2lDj/eOvjzpm8VQj1K1vVZJuyjThpV5/lSHyYW2JaHF2IQ7Z8twJFAhjA=="], + + "@opentelemetry/propagator-b3/@opentelemetry/core": ["@opentelemetry/core@2.0.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ=="], + + "@opentelemetry/propagator-jaeger/@opentelemetry/core": ["@opentelemetry/core@2.0.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ=="], + + "@opentelemetry/sdk-logs/@opentelemetry/core": ["@opentelemetry/core@2.0.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ=="], + + "@opentelemetry/sdk-logs/@opentelemetry/resources": ["@opentelemetry/resources@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg=="], + + "@opentelemetry/sdk-node/@opentelemetry/core": ["@opentelemetry/core@2.0.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ=="], + + "@opentelemetry/sdk-node/@opentelemetry/resources": ["@opentelemetry/resources@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg=="], + + "@opentelemetry/sdk-node/@opentelemetry/sdk-metrics": ["@opentelemetry/sdk-metrics@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/resources": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, "sha512-Bvy8QDjO05umd0+j+gDeWcTaVa1/R2lDj/eOvjzpm8VQj1K1vVZJuyjThpV5/lSHyYW2JaHF2IQ7Z8twJFAhjA=="], + + "@opentelemetry/sdk-trace-base/@opentelemetry/core": ["@opentelemetry/core@2.0.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ=="], + + "@opentelemetry/sdk-trace-base/@opentelemetry/resources": ["@opentelemetry/resources@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg=="], + + "@opentelemetry/sdk-trace-node/@opentelemetry/core": ["@opentelemetry/core@2.0.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ=="], + + "@react-native/babel-plugin-codegen/@react-native/codegen": ["@react-native/codegen@0.79.3", "", { "dependencies": { "glob": "^7.1.1", "hermes-parser": "0.25.1", "invariant": "^2.2.4", "nullthrows": "^1.1.1", "yargs": "^17.6.2" }, "peerDependencies": { "@babel/core": "*" } }, "sha512-CZejXqKch/a5/s/MO5T8mkAgvzCXgsTkQtpCF15kWR9HN8T+16k0CsN7TXAxXycltoxiE3XRglOrZNEa/TiZUQ=="], + + "@react-native/community-cli-plugin/@react-native/dev-middleware": ["@react-native/dev-middleware@0.79.2", "", { "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.79.2", "chrome-launcher": "^0.15.2", "chromium-edge-launcher": "^0.2.0", "connect": "^3.6.5", "debug": "^2.2.0", "invariant": "^2.2.4", "nullthrows": "^1.1.1", "open": "^7.0.3", "serve-static": "^1.16.2", "ws": "^6.2.3" } }, "sha512-9q4CpkklsAs1L0Bw8XYCoqqyBSrfRALGEw4/r0EkR38Y/6fVfNfdsjSns0pTLO6h0VpxswK34L/hm4uK3MoLHw=="], + + "@react-native/community-cli-plugin/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "@react-native/community-cli-plugin/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "@react-native/dev-middleware/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "@react-native/dev-middleware/open": ["open@7.4.2", "", { "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" } }, "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q=="], + + "@react-native/dev-middleware/serve-static": ["serve-static@1.16.2", "", { "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "0.19.0" } }, "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw=="], + + "@react-native/dev-middleware/ws": ["ws@6.2.3", "", { "dependencies": { "async-limiter": "~1.0.0" } }, "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA=="], + + "@react-navigation/core/react-is": ["react-is@19.1.0", "", {}, "sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg=="], + + "@storybook/addon-actions/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], + + "@storybook/addon-docs/react": ["react@19.0.0", "", {}, "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ=="], + + "@storybook/addon-docs/react-dom": ["react-dom@19.0.0", "", { "dependencies": { "scheduler": "^0.25.0" }, "peerDependencies": { "react": "^19.0.0" } }, "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ=="], + + "@storybook/addon-ondevice-actions/fast-deep-equal": ["fast-deep-equal@2.0.1", "", {}, "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w=="], + + "@storybook/instrumenter/@vitest/utils": ["@vitest/utils@2.1.9", "", { "dependencies": { "@vitest/pretty-format": "2.1.9", "loupe": "^3.1.2", "tinyrainbow": "^1.2.0" } }, "sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ=="], + + "@storybook/react-native/commander": ["commander@8.3.0", "", {}, "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="], + + "@storybook/react-native/prettier": ["prettier@2.8.8", "", { "bin": { "prettier": "bin-prettier.js" } }, "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q=="], + + "@storybook/test/@vitest/expect": ["@vitest/expect@2.0.5", "", { "dependencies": { "@vitest/spy": "2.0.5", "@vitest/utils": "2.0.5", "chai": "^5.1.1", "tinyrainbow": "^1.2.0" } }, "sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA=="], + + "@storybook/test/@vitest/spy": ["@vitest/spy@2.0.5", "", { "dependencies": { "tinyspy": "^3.0.0" } }, "sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA=="], + + "@tailwindcss/node/jiti": ["jiti@2.4.2", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.4.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.2", "tslib": "^2.4.0" }, "bundled": true }, "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.4.3", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.0.2", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA=="], + + "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.11", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.9.0" }, "bundled": true }, "sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA=="], + + "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.9.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw=="], + + "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@testing-library/dom/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "@testing-library/dom/pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], + + "@testing-library/jest-dom/chalk": ["chalk@3.0.0", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg=="], + + "@testing-library/jest-dom/dom-accessibility-api": ["dom-accessibility-api@0.6.3", "", {}, "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w=="], + + "@testing-library/react-native/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "@ts-morph/common/minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="], + + "@ts-morph/common/mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="], + + "@tybys/wasm-util/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], + + "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "@vitest/mocker/estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + + "@vitest/runner/@vitest/utils": ["@vitest/utils@2.1.9", "", { "dependencies": { "@vitest/pretty-format": "2.1.9", "loupe": "^3.1.2", "tinyrainbow": "^1.2.0" } }, "sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ=="], + + "@vitest/ui/@vitest/utils": ["@vitest/utils@3.2.4", "", { "dependencies": { "@vitest/pretty-format": "3.2.4", "loupe": "^3.1.4", "tinyrainbow": "^2.0.0" } }, "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA=="], + + "@vitest/ui/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + + "@vitest/ui/tinyrainbow": ["tinyrainbow@2.0.0", "", {}, "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw=="], + + "@vitest/ui/vitest": ["vitest@3.2.4", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/expect": "3.2.4", "@vitest/mocker": "3.2.4", "@vitest/pretty-format": "^3.2.4", "@vitest/runner": "3.2.4", "@vitest/snapshot": "3.2.4", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "debug": "^4.4.1", "expect-type": "^1.2.1", "magic-string": "^0.30.17", "pathe": "^2.0.3", "picomatch": "^4.0.2", "std-env": "^3.9.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.14", "tinypool": "^1.1.1", "tinyrainbow": "^2.0.0", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", "vite-node": "3.2.4", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "@vitest/browser": "3.2.4", "@vitest/ui": "3.2.4", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@types/debug", "@types/node", "@vitest/browser", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A=="], + + "@vitest/utils/@vitest/pretty-format": ["@vitest/pretty-format@2.1.8", "", { "dependencies": { "tinyrainbow": "^1.2.0" } }, "sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ=="], + + "ajv-formats/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + + "ansi-escapes/type-fest": ["type-fest@0.21.3", "", {}, "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="], + + "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "ast-types/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "attr-accept/core-js": ["core-js@2.6.12", "", {}, "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ=="], + + "babel-jest/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "babel-plugin-istanbul/istanbul-lib-instrument": ["istanbul-lib-instrument@5.2.1", "", { "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.2.0", "semver": "^6.3.0" } }, "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg=="], + + "babel-plugin-polyfill-corejs2/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "baseui/baseui": ["baseui@14.0.0", "", { "dependencies": { "@date-io/date-fns": "^2.13.1", "@date-io/moment": "^2.13.1", "card-validator": "^6.2.0", "csstype": "2.6.11", "d3": "^6.7.0", "d3-array": "2.4.0", "date-fns": "^2.28.0", "date-fns-tz": "^1.2.2", "just-extend": "4.1.1", "memoize-one": "5.0.0", "mockdate": "2.0.5", "moment": "^2.29.4", "polished": "^4.2.2", "popper.js": "^1.16.1", "prop-types": "^15.8.1", "react-dropzone": "9.0.0", "react-focus-lock": "^2.8.1", "react-hook-form": "^7.30.0", "react-input-mask": "^2.0.4", "react-is": "^17.0.2", "react-map-gl": "5.2.13", "react-movable": "^3.0.4", "react-multi-ref": "^1.0.0", "react-range": "^1.8.12", "react-uid": "2.3.0", "react-virtualized": "^9.22.3", "react-virtualized-auto-sizer": "1.0.2", "react-window": "1.8.5", "resize-observer-polyfill": "1.5.1", "styletron-standard": "^3.1.0" }, "peerDependencies": { "react": ">=18", "react-dom": ">=18", "styletron-react": ">=6" } }, "sha512-+lKgTfMow9jAfugBwmxo0QSi2vSo88UThQZoMxDiNwPGP85xGGSaK+Rqlo0FfshqJYJp0mlc8QyEKQgUsWLmbQ=="], + + "baseui/csstype": ["csstype@2.6.11", "", {}, "sha512-l8YyEC9NBkSm783PFTvh0FmJy7s5pFKrDp49ZL7zBGX3fWkO+N4EEyan1qqp8cwPLDcD0OSdyY6hAMoxp34JFw=="], + + "baseui/date-fns": ["date-fns@2.30.0", "", { "dependencies": { "@babel/runtime": "^7.21.0" } }, "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw=="], + + "bcrypt-pbkdf/tweetnacl": ["tweetnacl@0.14.5", "", {}, "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="], + + "better-opn/open": ["open@8.4.2", "", { "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", "is-wsl": "^2.2.0" } }, "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ=="], + + "biome/chalk": ["chalk@1.1.3", "", { "dependencies": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", "has-ansi": "^2.0.0", "strip-ansi": "^3.0.0", "supports-color": "^2.0.0" } }, "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A=="], + + "biome/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + + "bl/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + + "caller-callsite/callsites": ["callsites@2.0.0", "", {}, "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ=="], + + "chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "chrome-launcher/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + + "chromium-edge-launcher/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + + "chromium-edge-launcher/mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="], + + "chromium-edge-launcher/rimraf": ["rimraf@3.0.2", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" } }, "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="], + + "compression/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "compression/negotiator": ["negotiator@0.6.4", "", {}, "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w=="], + + "connect/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "connect/finalhandler": ["finalhandler@1.1.2", "", { "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "on-finished": "~2.3.0", "parseurl": "~1.3.3", "statuses": "~1.5.0", "unpipe": "~1.0.0" } }, "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA=="], + + "cosmiconfig/yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="], + + "create-jest/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "csso/css-tree": ["css-tree@2.2.1", "", { "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" } }, "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA=="], + + "d3-contour/d3-array": ["d3-array@2.12.1", "", { "dependencies": { "internmap": "^1.0.0" } }, "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ=="], + + "d3-dsv/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + + "d3-dsv/iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], + + "d3-geo/d3-array": ["d3-array@2.12.1", "", { "dependencies": { "internmap": "^1.0.0" } }, "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ=="], + + "d3-scale/d3-array": ["d3-array@2.12.1", "", { "dependencies": { "internmap": "^1.0.0" } }, "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ=="], + + "d3-time/d3-array": ["d3-array@2.12.1", "", { "dependencies": { "internmap": "^1.0.0" } }, "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ=="], + + "earlgrey-runtime/core-js": ["core-js@2.6.12", "", {}, "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ=="], + + "earlgrey-runtime/regenerator-runtime": ["regenerator-runtime@0.9.6", "", {}, "sha512-D0Y/JJ4VhusyMOd/o25a3jdUqN/bC85EFsaoL9Oqmy/O4efCh+xhp7yj2EEOsj974qvMkcW8AwUzJ1jB/MbxCw=="], + + "error-ex/is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], + + "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "eslint-config-expo/globals": ["globals@16.2.0", "", {}, "sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg=="], + + "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], + + "eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], + + "eslint-plugin-import/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], + + "eslint-plugin-import/doctrine": ["doctrine@2.1.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw=="], + + "eslint-plugin-import/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "eslint-plugin-import/tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], + + "eslint-plugin-react/doctrine": ["doctrine@2.1.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw=="], + + "eslint-plugin-react/resolve": ["resolve@2.0.0-next.5", "", { "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA=="], + + "eslint-plugin-react/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "espree/acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], + + "execa/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + + "expo-modules-autolinking/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "expo-modules-autolinking/commander": ["commander@7.2.0", "", {}, "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="], + + "expo-modules-autolinking/glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], + + "expo-router/schema-utils": ["schema-utils@4.3.2", "", { "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", "ajv-formats": "^2.1.1", "ajv-keywords": "^5.1.0" } }, "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ=="], + + "expo-router/semver": ["semver@7.6.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="], + + "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "fbjs/promise": ["promise@7.3.1", "", { "dependencies": { "asap": "~2.0.3" } }, "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg=="], + + "figures/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "file-selector/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "focus-lock/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "form-data/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "fs-extra/jsonfile": ["jsonfile@2.4.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw=="], + + "gaxios/https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], + + "gaxios/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], + + "get-source/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "google-auth-library/jws": ["jws@4.0.0", "", { "dependencies": { "jwa": "^2.0.0", "safe-buffer": "^5.0.1" } }, "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg=="], + + "googleapis-common/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], + + "gtoken/jws": ["jws@4.0.0", "", { "dependencies": { "jwa": "^2.0.0", "safe-buffer": "^5.0.1" } }, "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg=="], + + "has-ansi/ansi-regex": ["ansi-regex@2.1.1", "", {}, "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="], + + "hoist-non-react-statics/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], + + "http-errors/statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], + + "import-fresh/resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + + "import-in-the-middle/acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], + + "inquirer/ansi-escapes": ["ansi-escapes@1.4.0", "", {}, "sha512-wiXutNjDUlNEDWHcYH3jtZUhd3c4/VojassD8zHdHCY13xbZy2XbW+NKQwA0tWGBVzDA9qEzYwfoSsWmviidhw=="], + + "inquirer/ansi-regex": ["ansi-regex@2.1.1", "", {}, "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="], + + "inquirer/chalk": ["chalk@1.1.3", "", { "dependencies": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", "has-ansi": "^2.0.0", "strip-ansi": "^3.0.0", "supports-color": "^2.0.0" } }, "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A=="], + + "inquirer/lodash": ["lodash@3.10.1", "", {}, "sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ=="], + + "inquirer/string-width": ["string-width@1.0.2", "", { "dependencies": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", "strip-ansi": "^3.0.0" } }, "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw=="], + + "inquirer/strip-ansi": ["strip-ansi@3.0.1", "", { "dependencies": { "ansi-regex": "^2.0.0" } }, "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg=="], + + "istanbul-lib-report/make-dir": ["make-dir@4.0.0", "", { "dependencies": { "semver": "^7.5.3" } }, "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw=="], + + "istanbul-lib-report/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "istanbul-lib-source-maps/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "jest-circus/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "jest-cli/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "jest-config/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "jest-diff/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "jest-each/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "jest-haste-map/jest-worker": ["jest-worker@29.7.0", "", { "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw=="], + + "jest-matcher-utils/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "jest-message-util/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "jest-resolve/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "jest-runner/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "jest-runner/jest-worker": ["jest-worker@29.7.0", "", { "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw=="], + + "jest-runner/source-map-support": ["source-map-support@0.5.13", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w=="], + + "jest-runtime/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "jest-runtime/strip-bom": ["strip-bom@4.0.0", "", {}, "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w=="], + + "jest-snapshot/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "jest-util/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "jest-util/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "jest-validate/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "jest-watcher/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "lighthouse-logger/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "log-symbols/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], + + "make-dir/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "metro/accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="], + + "metro/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "metro/ci-info": ["ci-info@2.0.0", "", {}, "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="], + + "metro/hermes-parser": ["hermes-parser@0.28.1", "", { "dependencies": { "hermes-estree": "0.28.1" } }, "sha512-nf8o+hE8g7UJWParnccljHumE9Vlq8F7MqIdeahl+4x0tvCUJYRrT0L7h0MMg/X9YJmkNwsfbaNNrzPtFXOscg=="], + + "metro/jest-worker": ["jest-worker@29.7.0", "", { "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw=="], + + "metro/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "metro/source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], + + "metro/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], + + "metro-babel-transformer/hermes-parser": ["hermes-parser@0.28.1", "", { "dependencies": { "hermes-estree": "0.28.1" } }, "sha512-nf8o+hE8g7UJWParnccljHumE9Vlq8F7MqIdeahl+4x0tvCUJYRrT0L7h0MMg/X9YJmkNwsfbaNNrzPtFXOscg=="], + + "metro-cache/https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], + + "metro-config/cosmiconfig": ["cosmiconfig@5.2.1", "", { "dependencies": { "import-fresh": "^2.0.0", "is-directory": "^0.3.1", "js-yaml": "^3.13.1", "parse-json": "^4.0.0" } }, "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA=="], + + "metro-file-map/jest-worker": ["jest-worker@29.7.0", "", { "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw=="], + + "metro-source-map/source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], + + "metro-symbolicate/source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], + + "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "mimetext/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "miniflare/workerd": ["workerd@1.20250204.0", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20250204.0", "@cloudflare/workerd-darwin-arm64": "1.20250204.0", "@cloudflare/workerd-linux-64": "1.20250204.0", "@cloudflare/workerd-linux-arm64": "1.20250204.0", "@cloudflare/workerd-windows-64": "1.20250204.0" }, "bin": { "workerd": "bin/workerd" } }, "sha512-zcKufjVFsQMiD3/acg1Ix00HIMCkXCrDxQXYRDn/1AIz3QQGkmbVDwcUk1Ki2jBUoXmBCMsJdycRucgMVEypWg=="], + + "miniflare/ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], + + "miniflare/zod": ["zod@3.22.3", "", {}, "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug=="], + + "mlly/acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], + + "mlly/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + + "ora/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], + + "ora/cli-cursor": ["cli-cursor@2.1.0", "", { "dependencies": { "restore-cursor": "^2.0.0" } }, "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw=="], + + "ora/strip-ansi": ["strip-ansi@5.2.0", "", { "dependencies": { "ansi-regex": "^4.1.0" } }, "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA=="], + + "pkg-dir/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], + + "pkg-types/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + + "posthog-js/fflate": ["fflate@0.4.8", "", {}, "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA=="], + + "pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + + "pretty-format/react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], + + "prop-types/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], + + "prop-types-extra/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], + + "psl/punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + + "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + + "react-devtools-core/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], + + "react-native/@react-native/normalize-colors": ["@react-native/normalize-colors@0.79.2", "", {}, "sha512-+b+GNrupWrWw1okHnEENz63j7NSMqhKeFMOyzYLBwKcprG8fqJQhDIGXfizKdxeIa5NnGSAevKL1Ev1zJ56X8w=="], + + "react-native/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "react-native/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], + + "react-native/react": ["react@19.0.0", "", {}, "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ=="], + + "react-native/scheduler": ["scheduler@0.25.0", "", {}, "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA=="], + + "react-native/ws": ["ws@6.2.3", "", { "dependencies": { "async-limiter": "~1.0.0" } }, "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA=="], + + "react-native-css-interop/tailwindcss": ["tailwindcss@3.4.17", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.6.0", "didyoumean": "^1.2.2", "dlv": "^1.1.3", "fast-glob": "^3.3.2", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "jiti": "^1.21.6", "lilconfig": "^3.1.3", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.1.1", "postcss": "^8.4.47", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", "postcss-load-config": "^4.0.2", "postcss-nested": "^6.2.0", "postcss-selector-parser": "^6.1.2", "resolve": "^1.22.8", "sucrase": "^3.35.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" } }, "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og=="], + + "react-native-svg/css-tree": ["css-tree@1.1.3", "", { "dependencies": { "mdn-data": "2.0.14", "source-map": "^0.6.1" } }, "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q=="], + + "react-native-web/@react-native/normalize-colors": ["@react-native/normalize-colors@0.74.89", "", {}, "sha512-qoMMXddVKVhZ8PA1AbUCk83trpd6N+1nF2A6k1i6LsQObyS92fELuk8kU/lQs6M7BsMHwqyLCpQJ1uFgNvIQXg=="], + + "react-native-web/inline-style-prefixer": ["inline-style-prefixer@7.0.1", "", { "dependencies": { "css-in-js-utils": "^3.1.0" } }, "sha512-lhYo5qNTQp3EvSSp3sRvXMbVQTLrvGV6DycRMJ5dm2BLMiJ30wpXKdDdgX+GmJZ5uQMucwRKHamXSst3Sj/Giw=="], + + "react-native-web/memoize-one": ["memoize-one@6.0.0", "", {}, "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw=="], + + "react-promise-suspense/fast-deep-equal": ["fast-deep-equal@2.0.1", "", {}, "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w=="], + + "react-router/cookie": ["cookie@1.0.2", "", {}, "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA=="], + + "react-test-renderer/react": ["react@19.0.0", "", {}, "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ=="], + + "react-test-renderer/react-is": ["react-is@19.1.0", "", {}, "sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg=="], + + "react-test-renderer/scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], + + "react-uid/react": ["react@19.0.0", "", {}, "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ=="], + + "react-uid/tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], + + "react-virtualized/clsx": ["clsx@1.2.1", "", {}, "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg=="], + + "react-virtualized-auto-sizer/react": ["react@19.0.0", "", {}, "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ=="], + + "react-virtualized-auto-sizer/react-dom": ["react-dom@19.0.0", "", { "dependencies": { "scheduler": "^0.25.0" }, "peerDependencies": { "react": "^19.0.0" } }, "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ=="], + + "react-window/react": ["react@19.0.0", "", {}, "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ=="], + + "react-window/react-dom": ["react-dom@19.0.0", "", { "dependencies": { "scheduler": "^0.25.0" }, "peerDependencies": { "react": "^19.0.0" } }, "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ=="], + + "readable-stream/buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], + + "readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "readline2/is-fullwidth-code-point": ["is-fullwidth-code-point@1.0.0", "", { "dependencies": { "number-is-nan": "^1.0.0" } }, "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw=="], + + "recast/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "recast/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "recharts/react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], + + "redent/strip-indent": ["strip-indent@3.0.0", "", { "dependencies": { "min-indent": "^1.0.0" } }, "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ=="], + + "regjsparser/jsesc": ["jsesc@3.0.2", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g=="], + + "request/form-data": ["form-data@2.3.3", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ=="], + + "request/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "request/qs": ["qs@6.5.3", "", {}, "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA=="], + + "request/uuid": ["uuid@3.4.0", "", { "bin": { "uuid": "./bin/uuid" } }, "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="], + + "requireg/resolve": ["resolve@1.7.1", "", { "dependencies": { "path-parse": "^1.0.5" } }, "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw=="], + + "restore-cursor/exit-hook": ["exit-hook@1.1.1", "", {}, "sha512-MsG3prOVw1WtLXAZbM3KiYtooKR1LvxHh3VHsVtIy0uiUu8usxgB/94DP2HxtD/661lLdB6yzQ09lGJSQr6nkg=="], + + "restore-cursor/onetime": ["onetime@1.1.0", "", {}, "sha512-GZ+g4jayMqzCRMgB2sol7GiCLjKfS1PINkjmx8spcKce1LiVqcbQreXwqs2YAFXC6R03VIG28ZS31t8M866v6A=="], + + "rocksky/typescript": ["typescript@5.6.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw=="], + + "rocksky/vitest": ["vitest@3.2.4", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/expect": "3.2.4", "@vitest/mocker": "3.2.4", "@vitest/pretty-format": "^3.2.4", "@vitest/runner": "3.2.4", "@vitest/snapshot": "3.2.4", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "debug": "^4.4.1", "expect-type": "^1.2.1", "magic-string": "^0.30.17", "pathe": "^2.0.3", "picomatch": "^4.0.2", "std-env": "^3.9.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.14", "tinypool": "^1.1.1", "tinyrainbow": "^2.0.0", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", "vite-node": "3.2.4", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "@vitest/browser": "3.2.4", "@vitest/ui": "3.2.4", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@types/debug", "@types/node", "@vitest/browser", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A=="], + + "rocksky-app/@hookform/resolvers": ["@hookform/resolvers@5.1.1", "", { "dependencies": { "@standard-schema/utils": "^0.3.0" }, "peerDependencies": { "react-hook-form": "^7.55.0" } }, "sha512-J/NVING3LMAEvexJkyTLjruSm7aOFx7QX21pzkiJfMoNG0wl5aFEjLTl7ay7IQb9EWY6AkrBy7tHL2Alijpdcg=="], + + "rocksky-app/@types/react": ["@types/react@19.0.14", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-ixLZ7zG7j1fM0DijL9hDArwhwcCb4vqmePgwtV0GfnkHRSCUEv4LvzarcTdhoqgyMznUx/EhoTUv31CKZzkQlw=="], + + "rocksky-app/i18next": ["i18next@25.2.1", "", { "dependencies": { "@babel/runtime": "^7.27.1" }, "peerDependencies": { "typescript": "^5" }, "optionalPeers": ["typescript"] }, "sha512-+UoXK5wh+VlE1Zy5p6MjcvctHXAhRwQKCxiJD8noKZzIXmnAX8gdHX5fLPA3MEVxEN4vbZkQFy8N0LyD9tUqPw=="], + + "rocksky-app/react": ["react@19.0.0", "", {}, "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ=="], + + "rocksky-app/react-dom": ["react-dom@19.0.0", "", { "dependencies": { "scheduler": "^0.25.0" }, "peerDependencies": { "react": "^19.0.0" } }, "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ=="], + + "rocksky-app/tailwindcss": ["tailwindcss@3.4.17", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.6.0", "didyoumean": "^1.2.2", "dlv": "^1.1.3", "fast-glob": "^3.3.2", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "jiti": "^1.21.6", "lilconfig": "^3.1.3", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.1.1", "postcss": "^8.4.47", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", "postcss-load-config": "^4.0.2", "postcss-nested": "^6.2.0", "postcss-selector-parser": "^6.1.2", "resolve": "^1.22.8", "sucrase": "^3.35.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" } }, "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og=="], + + "rocksky-app/vitest": ["vitest@3.2.4", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/expect": "3.2.4", "@vitest/mocker": "3.2.4", "@vitest/pretty-format": "^3.2.4", "@vitest/runner": "3.2.4", "@vitest/snapshot": "3.2.4", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "debug": "^4.4.1", "expect-type": "^1.2.1", "magic-string": "^0.30.17", "pathe": "^2.0.3", "picomatch": "^4.0.2", "std-env": "^3.9.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.14", "tinypool": "^1.1.1", "tinyrainbow": "^2.0.0", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", "vite-node": "3.2.4", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "@vitest/browser": "3.2.4", "@vitest/ui": "3.2.4", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@types/debug", "@types/node", "@vitest/browser", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A=="], + + "rocksky-auth/@atproto/api": ["@atproto/api@0.13.35", "", { "dependencies": { "@atproto/common-web": "^0.4.0", "@atproto/lexicon": "^0.4.6", "@atproto/syntax": "^0.3.2", "@atproto/xrpc": "^0.6.8", "await-lock": "^2.2.2", "multiformats": "^9.9.0", "tlds": "^1.234.0", "zod": "^3.23.8" } }, "sha512-vsEfBj0C333TLjDppvTdTE0IdKlXuljKSveAeI4PPx/l6eUKNnDTsYxvILtXUVzwUlTDmSRqy5O4Ryh78n1b7g=="], + + "rocksky-web-mobile/typescript": ["typescript@5.6.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw=="], + + "rocksky-web-mobile/vitest": ["vitest@3.2.4", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/expect": "3.2.4", "@vitest/mocker": "3.2.4", "@vitest/pretty-format": "^3.2.4", "@vitest/runner": "3.2.4", "@vitest/snapshot": "3.2.4", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "debug": "^4.4.1", "expect-type": "^1.2.1", "magic-string": "^0.30.17", "pathe": "^2.0.3", "picomatch": "^4.0.2", "std-env": "^3.9.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.14", "tinypool": "^1.1.1", "tinyrainbow": "^2.0.0", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", "vite-node": "3.2.4", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "@vitest/browser": "3.2.4", "@vitest/ui": "3.2.4", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@types/debug", "@types/node", "@vitest/browser", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A=="], + + "rollup/@types/estree": ["@types/estree@1.0.7", "", {}, "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ=="], + + "rollup-plugin-inject/estree-walker": ["estree-walker@0.6.1", "", {}, "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w=="], + + "rollup-plugin-inject/magic-string": ["magic-string@0.25.9", "", { "dependencies": { "sourcemap-codec": "^1.4.8" } }, "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ=="], + + "rollup-pluginutils/estree-walker": ["estree-walker@0.6.1", "", {}, "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w=="], + + "router/path-to-regexp": ["path-to-regexp@8.2.0", "", {}, "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ=="], + + "simple-plist/bplist-parser": ["bplist-parser@0.3.1", "", { "dependencies": { "big-integer": "1.6.x" } }, "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA=="], + + "slice-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "spotify-proxy/@cloudflare/vitest-pool-workers": ["@cloudflare/vitest-pool-workers@0.8.39", "", { "dependencies": { "birpc": "0.2.14", "cjs-module-lexer": "^1.2.3", "devalue": "^4.3.0", "miniflare": "4.20250612.0", "semver": "^7.7.1", "wrangler": "4.20.1", "zod": "^3.22.3" }, "peerDependencies": { "@vitest/runner": "2.0.x - 3.2.x", "@vitest/snapshot": "2.0.x - 3.2.x", "vitest": "2.0.x - 3.2.x" } }, "sha512-4+kwpyH9Tw7uRfQuMWSdecfYrGwNWzr/t/v58sWgISGTg1n/2NxhxiyygXVLnirhI9+wOegcKvlerj/POKzI/w=="], + + "spotify-proxy/vitest": ["vitest@3.0.9", "", { "dependencies": { "@vitest/expect": "3.0.9", "@vitest/mocker": "3.0.9", "@vitest/pretty-format": "^3.0.9", "@vitest/runner": "3.0.9", "@vitest/snapshot": "3.0.9", "@vitest/spy": "3.0.9", "@vitest/utils": "3.0.9", "chai": "^5.2.0", "debug": "^4.4.0", "expect-type": "^1.1.0", "magic-string": "^0.30.17", "pathe": "^2.0.3", "std-env": "^3.8.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", "tinypool": "^1.0.2", "tinyrainbow": "^2.0.0", "vite": "^5.0.0 || ^6.0.0", "vite-node": "3.0.9", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "@vitest/browser": "3.0.9", "@vitest/ui": "3.0.9", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@types/debug", "@types/node", "@vitest/browser", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-BbcFDqNyBlfSpATmTtXOAOj71RNKDDvjBM/uPfnxxVGrG+FSH2RQIwgeEngTaTkuU/h0ScFvf+tRcKfYXzBybQ=="], + + "spotify-proxy/wrangler": ["wrangler@4.20.1", "", { "dependencies": { "@cloudflare/kv-asset-handler": "0.4.0", "@cloudflare/unenv-preset": "2.3.3", "blake3-wasm": "2.1.5", "esbuild": "0.25.4", "miniflare": "4.20250612.0", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.17", "workerd": "1.20250612.0" }, "optionalDependencies": { "fsevents": "~2.3.2" }, "peerDependencies": { "@cloudflare/workers-types": "^4.20250612.0" }, "optionalPeers": ["@cloudflare/workers-types"], "bin": { "wrangler": "bin/wrangler.js", "wrangler2": "bin/wrangler.js" } }, "sha512-XbjBqpi2vTJSxqacovcGK33UtCrnmUAC69kJWLD2UvIZc5Ixeh0jAdjd6N1mcQB2M1/A2jGQSA4Pkoqw/Xw3bQ=="], + + "sshpk/tweetnacl": ["tweetnacl@0.14.5", "", {}, "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="], + + "stack-utils/escape-string-regexp": ["escape-string-regexp@2.0.0", "", {}, "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="], + + "stacktrace-parser/type-fest": ["type-fest@0.7.1", "", {}, "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg=="], + + "strip-literal/js-tokens": ["js-tokens@9.0.1", "", {}, "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ=="], + + "styled-components/@emotion/is-prop-valid": ["@emotion/is-prop-valid@1.2.2", "", { "dependencies": { "@emotion/memoize": "^0.8.1" } }, "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw=="], + + "styled-components/@emotion/unitless": ["@emotion/unitless@0.8.1", "", {}, "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ=="], + + "styled-components/postcss": ["postcss@8.4.49", "", { "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA=="], + + "styled-components/stylis": ["stylis@4.3.2", "", {}, "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg=="], + + "sucrase/commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="], + + "sucrase/glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], + + "supports-hyperlinks/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "svgo/commander": ["commander@7.2.0", "", {}, "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="], + + "table/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + + "tar/yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], + + "tar-fs/chownr": ["chownr@1.1.4", "", {}, "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="], + + "tar-stream/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + + "terser/acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], + + "terser/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + + "terser-webpack-plugin/schema-utils": ["schema-utils@4.3.2", "", { "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", "ajv-formats": "^2.1.1", "ajv-keywords": "^5.1.0" } }, "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ=="], + + "tiny-salad-4531/vitest": ["vitest@2.1.9", "", { "dependencies": { "@vitest/expect": "2.1.9", "@vitest/mocker": "2.1.9", "@vitest/pretty-format": "^2.1.9", "@vitest/runner": "2.1.9", "@vitest/snapshot": "2.1.9", "@vitest/spy": "2.1.9", "@vitest/utils": "2.1.9", "chai": "^5.1.2", "debug": "^4.3.7", "expect-type": "^1.1.0", "magic-string": "^0.30.12", "pathe": "^1.1.2", "std-env": "^3.8.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.1", "tinypool": "^1.0.1", "tinyrainbow": "^1.2.0", "vite": "^5.0.0", "vite-node": "2.1.9", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@types/node": "^18.0.0 || >=20.0.0", "@vitest/browser": "2.1.9", "@vitest/ui": "2.1.9", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@types/node", "@vitest/browser", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q=="], + + "tough-cookie/punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + + "unenv/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + + "unplugin/acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], + + "unstorage/chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], + + "uri-js/punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + + "use-callback-ref/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "use-sidecar/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "verror/core-util-is": ["core-util-is@1.0.2", "", {}, "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="], + + "victory-vendor/d3-array": ["d3-array@3.2.4", "", { "dependencies": { "internmap": "1 - 2" } }, "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg=="], + + "victory-vendor/d3-ease": ["d3-ease@3.0.1", "", {}, "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w=="], + + "victory-vendor/d3-interpolate": ["d3-interpolate@3.0.1", "", { "dependencies": { "d3-color": "1 - 3" } }, "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g=="], + + "victory-vendor/d3-scale": ["d3-scale@4.0.2", "", { "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", "d3-interpolate": "1.2.0 - 3", "d3-time": "2.1.1 - 3", "d3-time-format": "2 - 4" } }, "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ=="], + + "victory-vendor/d3-shape": ["d3-shape@3.2.0", "", { "dependencies": { "d3-path": "^3.1.0" } }, "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA=="], + + "victory-vendor/d3-time": ["d3-time@3.1.0", "", { "dependencies": { "d3-array": "2 - 3" } }, "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q=="], + + "victory-vendor/d3-timer": ["d3-timer@3.0.1", "", {}, "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA=="], + + "vite-node/vite": ["vite@5.4.19", "", { "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", "rollup": "^4.20.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" }, "optionalPeers": ["@types/node", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser"], "bin": { "vite": "bin/vite.js" } }, "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA=="], + + "vitest/@vitest/runner": ["@vitest/runner@2.1.8", "", { "dependencies": { "@vitest/utils": "2.1.8", "pathe": "^1.1.2" } }, "sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg=="], + + "vitest/@vitest/snapshot": ["@vitest/snapshot@2.1.8", "", { "dependencies": { "@vitest/pretty-format": "2.1.8", "magic-string": "^0.30.12", "pathe": "^1.1.2" } }, "sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg=="], + + "vitest/vite": ["vite@5.4.19", "", { "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", "rollup": "^4.20.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" }, "optionalPeers": ["@types/node", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser"], "bin": { "vite": "bin/vite.js" } }, "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA=="], + + "webpack/acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], + + "webpack/eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="], + + "webpack/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "webpack/schema-utils": ["schema-utils@4.3.2", "", { "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", "ajv-formats": "^2.1.1", "ajv-keywords": "^5.1.0" } }, "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ=="], + + "whatwg-url/webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], + + "whatwg-url-without-unicode/punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + + "white-scene-4cbd/vitest": ["vitest@2.1.9", "", { "dependencies": { "@vitest/expect": "2.1.9", "@vitest/mocker": "2.1.9", "@vitest/pretty-format": "^2.1.9", "@vitest/runner": "2.1.9", "@vitest/snapshot": "2.1.9", "@vitest/spy": "2.1.9", "@vitest/utils": "2.1.9", "chai": "^5.1.2", "debug": "^4.3.7", "expect-type": "^1.1.0", "magic-string": "^0.30.12", "pathe": "^1.1.2", "std-env": "^3.8.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.1", "tinypool": "^1.0.1", "tinyrainbow": "^1.2.0", "vite": "^5.0.0", "vite-node": "2.1.9", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@types/node": "^18.0.0 || >=20.0.0", "@vitest/browser": "2.1.9", "@vitest/ui": "2.1.9", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@types/node", "@vitest/browser", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q=="], + + "wrangler/esbuild": ["esbuild@0.17.19", "", { "optionalDependencies": { "@esbuild/android-arm": "0.17.19", "@esbuild/android-arm64": "0.17.19", "@esbuild/android-x64": "0.17.19", "@esbuild/darwin-arm64": "0.17.19", "@esbuild/darwin-x64": "0.17.19", "@esbuild/freebsd-arm64": "0.17.19", "@esbuild/freebsd-x64": "0.17.19", "@esbuild/linux-arm": "0.17.19", "@esbuild/linux-arm64": "0.17.19", "@esbuild/linux-ia32": "0.17.19", "@esbuild/linux-loong64": "0.17.19", "@esbuild/linux-mips64el": "0.17.19", "@esbuild/linux-ppc64": "0.17.19", "@esbuild/linux-riscv64": "0.17.19", "@esbuild/linux-s390x": "0.17.19", "@esbuild/linux-x64": "0.17.19", "@esbuild/netbsd-x64": "0.17.19", "@esbuild/openbsd-x64": "0.17.19", "@esbuild/sunos-x64": "0.17.19", "@esbuild/win32-arm64": "0.17.19", "@esbuild/win32-ia32": "0.17.19", "@esbuild/win32-x64": "0.17.19" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw=="], + + "wrangler/miniflare": ["miniflare@3.20250408.2", "", { "dependencies": { "@cspotcode/source-map-support": "0.8.1", "acorn": "8.14.0", "acorn-walk": "8.3.2", "exit-hook": "2.2.1", "glob-to-regexp": "0.4.1", "stoppable": "1.1.0", "undici": "^5.28.5", "workerd": "1.20250408.0", "ws": "8.18.0", "youch": "3.3.4", "zod": "3.22.3" }, "bin": { "miniflare": "bootstrap.js" } }, "sha512-uTs7cGWFErgJTKtBdmtctwhuoxniuCQqDT8+xaEiJdEC8d+HsaZVYfZwIX2NuSmdAiHMe7NtbdZYjFMbIXtJsQ=="], + + "wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "wrap-ansi-cjs/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "write-file-atomic/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + + "xcode/uuid": ["uuid@7.0.3", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg=="], + + "xml2js/xmlbuilder": ["xmlbuilder@11.0.1", "", {}, "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="], + + "youch/cookie": ["cookie@0.5.0", "", {}, "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw=="], + + "@atproto/common/@ipld/dag-cbor/cborg": ["cborg@1.10.2", "", { "bin": { "cborg": "cli.js" } }, "sha512-b3tFPA9pUr2zCUiCfRd2+wok2/LBSNUMKOuRRok+WlvvAgEt/PlbgPTsZUcwCOs53IJvLgTp0eotwtosE6njug=="], + + "@atproto/lex-cli/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "@atproto/lex-cli/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "@atproto/repo/@ipld/dag-cbor/cborg": ["cborg@1.10.2", "", { "bin": { "cborg": "cli.js" } }, "sha512-b3tFPA9pUr2zCUiCfRd2+wok2/LBSNUMKOuRRok+WlvvAgEt/PlbgPTsZUcwCOs53IJvLgTp0eotwtosE6njug=="], + + "@atproto/sync/@atproto/xrpc-server/express": ["express@4.21.2", "", { "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.19.0", "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" } }, "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA=="], + + "@atproto/sync/@atproto/xrpc-server/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "@atproto/xrpc-server/express/accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="], + + "@atproto/xrpc-server/express/body-parser": ["body-parser@1.20.3", "", { "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" } }, "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g=="], + + "@atproto/xrpc-server/express/content-disposition": ["content-disposition@0.5.4", "", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ=="], + + "@atproto/xrpc-server/express/cookie": ["cookie@0.7.1", "", {}, "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w=="], + + "@atproto/xrpc-server/express/cookie-signature": ["cookie-signature@1.0.6", "", {}, "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="], + + "@atproto/xrpc-server/express/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "@atproto/xrpc-server/express/finalhandler": ["finalhandler@1.3.1", "", { "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", "statuses": "2.0.1", "unpipe": "~1.0.0" } }, "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ=="], + + "@atproto/xrpc-server/express/fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="], + + "@atproto/xrpc-server/express/merge-descriptors": ["merge-descriptors@1.0.3", "", {}, "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ=="], + + "@atproto/xrpc-server/express/path-to-regexp": ["path-to-regexp@0.1.12", "", {}, "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ=="], + + "@atproto/xrpc-server/express/qs": ["qs@6.13.0", "", { "dependencies": { "side-channel": "^1.0.6" } }, "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg=="], + + "@atproto/xrpc-server/express/send": ["send@0.19.0", "", { "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "2.4.1", "range-parser": "~1.2.1", "statuses": "2.0.1" } }, "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw=="], + + "@atproto/xrpc-server/express/serve-static": ["serve-static@1.16.2", "", { "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "0.19.0" } }, "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw=="], + + "@atproto/xrpc-server/express/statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], + + "@atproto/xrpc-server/express/type-is": ["type-is@1.6.18", "", { "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" } }, "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g=="], + + "@atproto/xrpc-server/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "@babel/helper-compilation-targets/lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + + "@babel/highlight/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], + + "@babel/highlight/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "@babel/highlight/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], + + "@chromatic-com/storybook/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.17.19", "", { "os": "android", "cpu": "arm" }, "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.17.19", "", { "os": "android", "cpu": "arm64" }, "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.17.19", "", { "os": "android", "cpu": "x64" }, "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.17.19", "", { "os": "darwin", "cpu": "arm64" }, "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.17.19", "", { "os": "darwin", "cpu": "x64" }, "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.17.19", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.17.19", "", { "os": "freebsd", "cpu": "x64" }, "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.17.19", "", { "os": "linux", "cpu": "arm" }, "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.17.19", "", { "os": "linux", "cpu": "arm64" }, "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.17.19", "", { "os": "linux", "cpu": "ia32" }, "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.17.19", "", { "os": "linux", "cpu": "none" }, "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.17.19", "", { "os": "linux", "cpu": "none" }, "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.17.19", "", { "os": "linux", "cpu": "ppc64" }, "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.17.19", "", { "os": "linux", "cpu": "none" }, "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.17.19", "", { "os": "linux", "cpu": "s390x" }, "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.17.19", "", { "os": "linux", "cpu": "x64" }, "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.17.19", "", { "os": "none", "cpu": "x64" }, "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.17.19", "", { "os": "openbsd", "cpu": "x64" }, "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.17.19", "", { "os": "sunos", "cpu": "x64" }, "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.17.19", "", { "os": "win32", "cpu": "arm64" }, "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.17.19", "", { "os": "win32", "cpu": "ia32" }, "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.17.19", "", { "os": "win32", "cpu": "x64" }, "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA=="], + + "@cloudflare/vitest-pool-workers/wrangler/unenv": ["unenv@2.0.0-rc.1", "", { "dependencies": { "defu": "^6.1.4", "mlly": "^1.7.4", "ohash": "^1.1.4", "pathe": "^1.1.2", "ufo": "^1.5.4" } }, "sha512-PU5fb40H8X149s117aB4ytbORcCvlASdtF97tfls4BPIyj4PeVxvpSuy1jAptqYHqB0vb2w2sHvzM0XWcp2OKg=="], + + "@cloudflare/vitest-pool-workers/wrangler/workerd": ["workerd@1.20250204.0", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20250204.0", "@cloudflare/workerd-darwin-arm64": "1.20250204.0", "@cloudflare/workerd-linux-64": "1.20250204.0", "@cloudflare/workerd-linux-arm64": "1.20250204.0", "@cloudflare/workerd-windows-64": "1.20250204.0" }, "bin": { "workerd": "bin/workerd" } }, "sha512-zcKufjVFsQMiD3/acg1Ix00HIMCkXCrDxQXYRDn/1AIz3QQGkmbVDwcUk1Ki2jBUoXmBCMsJdycRucgMVEypWg=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.18.20", "", { "os": "android", "cpu": "arm" }, "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.18.20", "", { "os": "android", "cpu": "arm64" }, "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.18.20", "", { "os": "android", "cpu": "x64" }, "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.18.20", "", { "os": "darwin", "cpu": "arm64" }, "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.18.20", "", { "os": "darwin", "cpu": "x64" }, "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.18.20", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.18.20", "", { "os": "freebsd", "cpu": "x64" }, "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.18.20", "", { "os": "linux", "cpu": "arm" }, "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.18.20", "", { "os": "linux", "cpu": "arm64" }, "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.18.20", "", { "os": "linux", "cpu": "ia32" }, "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.18.20", "", { "os": "linux", "cpu": "none" }, "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.18.20", "", { "os": "linux", "cpu": "none" }, "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.18.20", "", { "os": "linux", "cpu": "ppc64" }, "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.18.20", "", { "os": "linux", "cpu": "none" }, "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.18.20", "", { "os": "linux", "cpu": "s390x" }, "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.18.20", "", { "os": "linux", "cpu": "x64" }, "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.18.20", "", { "os": "none", "cpu": "x64" }, "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.18.20", "", { "os": "openbsd", "cpu": "x64" }, "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.18.20", "", { "os": "sunos", "cpu": "x64" }, "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.18.20", "", { "os": "win32", "cpu": "arm64" }, "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.18.20", "", { "os": "win32", "cpu": "ia32" }, "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.18.20", "", { "os": "win32", "cpu": "x64" }, "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ=="], + + "@expo/cli/accepts/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "@expo/cli/accepts/negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], + + "@expo/cli/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "@expo/cli/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "@expo/cli/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "@expo/cli/send/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "@expo/cli/send/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="], + + "@expo/cli/send/fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="], + + "@expo/cli/send/mime": ["mime@1.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="], + + "@expo/cli/send/statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], + + "@expo/config-plugins/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "@expo/config-plugins/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "@expo/config-plugins/glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "@expo/config/glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "@expo/devcert/glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "@expo/env/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "@expo/env/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "@expo/fingerprint/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "@expo/fingerprint/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "@expo/fingerprint/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "@expo/image-utils/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "@expo/image-utils/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "@expo/metro-config/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "@expo/metro-config/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "@expo/metro-config/lightningcss/detect-libc": ["detect-libc@1.0.3", "", { "bin": { "detect-libc": "./bin/detect-libc.js" } }, "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg=="], + + "@expo/metro-config/lightningcss/lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.27.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Gl/lqIXY+d+ySmMbgDf0pgaWSqrWYxVHoc88q+Vhf2YNzZ8DwoRzGt5NZDVqqIW5ScpSnmmjcgXP87Dn2ylSSQ=="], + + "@expo/metro-config/lightningcss/lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.27.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-0+mZa54IlcNAoQS9E0+niovhyjjQWEMrwW0p2sSdLRhLDc8LMQ/b67z7+B5q4VmjYCMSfnFi3djAAQFIDuj/Tg=="], + + "@expo/metro-config/lightningcss/lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.27.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-n1sEf85fePoU2aDN2PzYjoI8gbBqnmLGEhKq7q0DKLj0UTVmOTwDC7PtLcy/zFxzASTSBlVQYJUhwIStQMIpRA=="], + + "@expo/metro-config/lightningcss/lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.27.0", "", { "os": "linux", "cpu": "arm" }, "sha512-MUMRmtdRkOkd5z3h986HOuNBD1c2lq2BSQA1Jg88d9I7bmPGx08bwGcnB75dvr17CwxjxD6XPi3Qh8ArmKFqCA=="], + + "@expo/metro-config/lightningcss/lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.27.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-cPsxo1QEWq2sfKkSq2Bq5feQDHdUEwgtA9KaB27J5AX22+l4l0ptgjMZZtYtUnteBofjee+0oW1wQ1guv04a7A=="], + + "@expo/metro-config/lightningcss/lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.27.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-rCGBm2ax7kQ9pBSeITfCW9XSVF69VX+fm5DIpvDZQl4NnQoMQyRwhZQm9pd59m8leZ1IesRqWk2v/DntMo26lg=="], + + "@expo/metro-config/lightningcss/lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.27.0", "", { "os": "linux", "cpu": "x64" }, "sha512-Dk/jovSI7qqhJDiUibvaikNKI2x6kWPN79AQiD/E/KeQWMjdGe9kw51RAgoWFDi0coP4jinaH14Nrt/J8z3U4A=="], + + "@expo/metro-config/lightningcss/lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.27.0", "", { "os": "linux", "cpu": "x64" }, "sha512-QKjTxXm8A9s6v9Tg3Fk0gscCQA1t/HMoF7Woy1u68wCk5kS4fR+q3vXa1p3++REW784cRAtkYKrPy6JKibrEZA=="], + + "@expo/metro-config/lightningcss/lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.27.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-/wXegPS1hnhkeG4OXQKEMQeJd48RDC3qdh+OA8pCuOPCyvnm/yEayrJdJVqzBsqpy1aJklRCVxscpFur80o6iQ=="], + + "@expo/metro-config/lightningcss/lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.27.0", "", { "os": "win32", "cpu": "x64" }, "sha512-/OJLj94Zm/waZShL8nB5jsNj3CfNATLCTyFxZyouilfTmSoLDX7VlVAmhPHoZWVFp4vdmoiEbPEYC8HID3m6yw=="], + + "@expo/metro-config/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "@expo/package-manager/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "@expo/package-manager/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "@expo/xcpretty/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "@expo/xcpretty/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + + "@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], + + "@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], + + "@istanbuljs/load-nyc-config/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], + + "@istanbuljs/load-nyc-config/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], + + "@jest/console/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "@jest/console/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "@jest/core/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "@jest/core/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "@jest/reporters/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "@jest/reporters/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "@jest/reporters/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "@jest/transform/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "@jest/transform/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "@jest/types/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "@jest/types/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "@joshwooding/vite-plugin-react-docgen-typescript/glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "@react-native/community-cli-plugin/@react-native/dev-middleware/@react-native/debugger-frontend": ["@react-native/debugger-frontend@0.79.2", "", {}, "sha512-cGmC7X6kju76DopSBNc+PRAEetbd7TWF9J9o84hOp/xL3ahxR2kuxJy0oJX8Eg8oehhGGEXTuMKHzNa3rDBeSg=="], + + "@react-native/community-cli-plugin/@react-native/dev-middleware/open": ["open@7.4.2", "", { "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" } }, "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q=="], + + "@react-native/community-cli-plugin/@react-native/dev-middleware/serve-static": ["serve-static@1.16.2", "", { "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "0.19.0" } }, "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw=="], + + "@react-native/community-cli-plugin/@react-native/dev-middleware/ws": ["ws@6.2.3", "", { "dependencies": { "async-limiter": "~1.0.0" } }, "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA=="], + + "@react-native/community-cli-plugin/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "@react-native/community-cli-plugin/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "@react-native/community-cli-plugin/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "@react-native/dev-middleware/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "@react-native/dev-middleware/open/is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], + + "@react-native/dev-middleware/open/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + + "@react-native/dev-middleware/serve-static/send": ["send@0.19.0", "", { "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "2.4.1", "range-parser": "~1.2.1", "statuses": "2.0.1" } }, "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw=="], + + "@storybook/addon-docs/react-dom/scheduler": ["scheduler@0.25.0", "", {}, "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA=="], + + "@storybook/test/@vitest/expect/@vitest/utils": ["@vitest/utils@2.0.5", "", { "dependencies": { "@vitest/pretty-format": "2.0.5", "estree-walker": "^3.0.3", "loupe": "^3.1.1", "tinyrainbow": "^1.2.0" } }, "sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ=="], + + "@testing-library/dom/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "@testing-library/dom/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "@testing-library/dom/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + + "@testing-library/jest-dom/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "@testing-library/jest-dom/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "@testing-library/react-native/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "@testing-library/react-native/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "@ts-morph/common/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "@vitest/ui/@vitest/utils/@vitest/pretty-format": ["@vitest/pretty-format@3.2.4", "", { "dependencies": { "tinyrainbow": "^2.0.0" } }, "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA=="], + + "@vitest/ui/vitest/@vitest/expect": ["@vitest/expect@3.2.4", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" } }, "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig=="], + + "@vitest/ui/vitest/@vitest/mocker": ["@vitest/mocker@3.2.4", "", { "dependencies": { "@vitest/spy": "3.2.4", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "optionalPeers": ["msw", "vite"] }, "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ=="], + + "@vitest/ui/vitest/@vitest/pretty-format": ["@vitest/pretty-format@3.2.4", "", { "dependencies": { "tinyrainbow": "^2.0.0" } }, "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA=="], + + "@vitest/ui/vitest/@vitest/runner": ["@vitest/runner@3.2.4", "", { "dependencies": { "@vitest/utils": "3.2.4", "pathe": "^2.0.3", "strip-literal": "^3.0.0" } }, "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ=="], + + "@vitest/ui/vitest/@vitest/snapshot": ["@vitest/snapshot@3.2.4", "", { "dependencies": { "@vitest/pretty-format": "3.2.4", "magic-string": "^0.30.17", "pathe": "^2.0.3" } }, "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ=="], + + "@vitest/ui/vitest/@vitest/spy": ["@vitest/spy@3.2.4", "", { "dependencies": { "tinyspy": "^4.0.3" } }, "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw=="], + + "@vitest/ui/vitest/vite-node": ["vite-node@3.2.4", "", { "dependencies": { "cac": "^6.7.14", "debug": "^4.4.1", "es-module-lexer": "^1.7.0", "pathe": "^2.0.3", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "bin": { "vite-node": "vite-node.mjs" } }, "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg=="], + + "ajv-formats/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + + "babel-jest/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "babel-jest/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "babel-plugin-istanbul/istanbul-lib-instrument/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "better-opn/open/define-lazy-prop": ["define-lazy-prop@2.0.0", "", {}, "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og=="], + + "better-opn/open/is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], + + "better-opn/open/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + + "biome/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "biome/chalk/strip-ansi": ["strip-ansi@3.0.1", "", { "dependencies": { "ansi-regex": "^2.0.0" } }, "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg=="], + + "chrome-launcher/is-wsl/is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], + + "chromium-edge-launcher/is-wsl/is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], + + "compression/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "connect/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "connect/finalhandler/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="], + + "connect/finalhandler/on-finished": ["on-finished@2.3.0", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww=="], + + "connect/finalhandler/statuses": ["statuses@1.5.0", "", {}, "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA=="], + + "create-jest/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "create-jest/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "csso/css-tree/mdn-data": ["mdn-data@2.0.28", "", {}, "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="], + + "d3-contour/d3-array/internmap": ["internmap@1.0.1", "", {}, "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw=="], + + "d3-geo/d3-array/internmap": ["internmap@1.0.1", "", {}, "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw=="], + + "d3-scale/d3-array/internmap": ["internmap@1.0.1", "", {}, "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw=="], + + "d3-time/d3-array/internmap": ["internmap@1.0.1", "", {}, "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw=="], + + "eslint-plugin-import/tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], + + "eslint/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "eslint/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "expo-modules-autolinking/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "expo-modules-autolinking/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "expo-modules-autolinking/glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "expo-router/schema-utils/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + + "expo-router/schema-utils/ajv-keywords": ["ajv-keywords@5.1.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3" }, "peerDependencies": { "ajv": "^8.8.2" } }, "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw=="], + + "form-data/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "gaxios/https-proxy-agent/agent-base": ["agent-base@7.1.3", "", {}, "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw=="], + + "google-auth-library/jws/jwa": ["jwa@2.0.1", "", { "dependencies": { "buffer-equal-constant-time": "^1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } }, "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg=="], + + "gtoken/jws/jwa": ["jwa@2.0.1", "", { "dependencies": { "buffer-equal-constant-time": "^1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } }, "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg=="], + + "inquirer/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "inquirer/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@1.0.0", "", { "dependencies": { "number-is-nan": "^1.0.0" } }, "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw=="], + + "jest-circus/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "jest-circus/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "jest-cli/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "jest-cli/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "jest-config/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "jest-config/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "jest-diff/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "jest-diff/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "jest-each/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "jest-each/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "jest-haste-map/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "jest-matcher-utils/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "jest-matcher-utils/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "jest-message-util/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "jest-message-util/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "jest-resolve/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "jest-resolve/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "jest-runner/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "jest-runner/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "jest-runner/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "jest-runner/source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "jest-runtime/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "jest-runtime/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "jest-snapshot/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "jest-snapshot/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "jest-util/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "jest-util/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "jest-validate/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "jest-validate/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "jest-watcher/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "jest-watcher/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "lighthouse-logger/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "log-symbols/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], + + "log-symbols/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "log-symbols/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], + + "metro-babel-transformer/hermes-parser/hermes-estree": ["hermes-estree@0.28.1", "", {}, "sha512-w3nxl/RGM7LBae0v8LH2o36+8VqwOZGv9rX1wyoWT6YaKZLqpJZ0YQ5P0LVr3tuRpf7vCx0iIG4i/VmBJejxTQ=="], + + "metro-cache/https-proxy-agent/agent-base": ["agent-base@7.1.3", "", {}, "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw=="], + + "metro-config/cosmiconfig/import-fresh": ["import-fresh@2.0.0", "", { "dependencies": { "caller-path": "^2.0.0", "resolve-from": "^3.0.0" } }, "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg=="], + + "metro-config/cosmiconfig/js-yaml": ["js-yaml@3.14.1", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g=="], + + "metro-config/cosmiconfig/parse-json": ["parse-json@4.0.0", "", { "dependencies": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" } }, "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw=="], + + "metro-file-map/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "metro/accepts/negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], + + "metro/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "metro/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "metro/hermes-parser/hermes-estree": ["hermes-estree@0.28.1", "", {}, "sha512-w3nxl/RGM7LBae0v8LH2o36+8VqwOZGv9rX1wyoWT6YaKZLqpJZ0YQ5P0LVr3tuRpf7vCx0iIG4i/VmBJejxTQ=="], + + "metro/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "metro/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "mimetext/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "miniflare/workerd/@cloudflare/workerd-darwin-64": ["@cloudflare/workerd-darwin-64@1.20250204.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-HpsgbWEfvdcwuZ8WAZhi1TlSCyyHC3tbghpKsOqGDaQNltyAFAWqa278TPNfcitYf/FmV4961v3eqUE+RFdHNQ=="], + + "miniflare/workerd/@cloudflare/workerd-darwin-arm64": ["@cloudflare/workerd-darwin-arm64@1.20250204.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-AJ8Tk7KMJqePlch3SH8oL41ROtsrb07hKRHD6M+FvGC3tLtf26rpteAAMNYKMDYKzFNFUIKZNijYDFZjBFndXQ=="], + + "miniflare/workerd/@cloudflare/workerd-linux-64": ["@cloudflare/workerd-linux-64@1.20250204.0", "", { "os": "linux", "cpu": "x64" }, "sha512-RIUfUSnDC8h73zAa+u1K2Frc7nc+eeQoBBP7SaqsRe6JdX8jfIv/GtWjQWCoj8xQFgLvhpJKZ4sTTTV+AilQbw=="], + + "miniflare/workerd/@cloudflare/workerd-linux-arm64": ["@cloudflare/workerd-linux-arm64@1.20250204.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-8Ql8jDjoIgr2J7oBD01kd9kduUz60njofrBpAOkjCPed15He8e8XHkYaYow3g0xpae4S2ryrPOeoD3M64sRxeg=="], + + "miniflare/workerd/@cloudflare/workerd-windows-64": ["@cloudflare/workerd-windows-64@1.20250204.0", "", { "os": "win32", "cpu": "x64" }, "sha512-RpDJO3+to+e17X3EWfRCagboZYwBz2fowc+jL53+fd7uD19v3F59H48lw2BDpHJMRyhg6ouWcpM94OhsHv8ecA=="], + + "ora/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], + + "ora/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "ora/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], + + "ora/cli-cursor/restore-cursor": ["restore-cursor@2.0.0", "", { "dependencies": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" } }, "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q=="], + + "ora/strip-ansi/ansi-regex": ["ansi-regex@4.1.1", "", {}, "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g=="], + + "pkg-dir/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], + + "react-native-svg/css-tree/mdn-data": ["mdn-data@2.0.14", "", {}, "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow=="], + + "react-native-svg/css-tree/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "react-native-web/inline-style-prefixer/css-in-js-utils": ["css-in-js-utils@3.1.0", "", { "dependencies": { "hyphenate-style-name": "^1.0.3" } }, "sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A=="], + + "react-native/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "react-native/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "react-virtualized-auto-sizer/react-dom/scheduler": ["scheduler@0.25.0", "", {}, "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA=="], + + "react-window/react-dom/scheduler": ["scheduler@0.25.0", "", {}, "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA=="], + + "request/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "rocksky-app/react-dom/scheduler": ["scheduler@0.25.0", "", {}, "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA=="], + + "rocksky-app/vitest/@vitest/expect": ["@vitest/expect@3.2.4", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" } }, "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig=="], + + "rocksky-app/vitest/@vitest/mocker": ["@vitest/mocker@3.2.4", "", { "dependencies": { "@vitest/spy": "3.2.4", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "optionalPeers": ["msw", "vite"] }, "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ=="], + + "rocksky-app/vitest/@vitest/pretty-format": ["@vitest/pretty-format@3.2.4", "", { "dependencies": { "tinyrainbow": "^2.0.0" } }, "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA=="], + + "rocksky-app/vitest/@vitest/runner": ["@vitest/runner@3.2.4", "", { "dependencies": { "@vitest/utils": "3.2.4", "pathe": "^2.0.3", "strip-literal": "^3.0.0" } }, "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ=="], + + "rocksky-app/vitest/@vitest/snapshot": ["@vitest/snapshot@3.2.4", "", { "dependencies": { "@vitest/pretty-format": "3.2.4", "magic-string": "^0.30.17", "pathe": "^2.0.3" } }, "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ=="], + + "rocksky-app/vitest/@vitest/spy": ["@vitest/spy@3.2.4", "", { "dependencies": { "tinyspy": "^4.0.3" } }, "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw=="], + + "rocksky-app/vitest/@vitest/utils": ["@vitest/utils@3.2.4", "", { "dependencies": { "@vitest/pretty-format": "3.2.4", "loupe": "^3.1.4", "tinyrainbow": "^2.0.0" } }, "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA=="], + + "rocksky-app/vitest/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + + "rocksky-app/vitest/tinyrainbow": ["tinyrainbow@2.0.0", "", {}, "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw=="], + + "rocksky-app/vitest/vite-node": ["vite-node@3.2.4", "", { "dependencies": { "cac": "^6.7.14", "debug": "^4.4.1", "es-module-lexer": "^1.7.0", "pathe": "^2.0.3", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "bin": { "vite-node": "vite-node.mjs" } }, "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg=="], + + "rocksky-auth/@atproto/api/@atproto/xrpc": ["@atproto/xrpc@0.6.12", "", { "dependencies": { "@atproto/lexicon": "^0.4.10", "zod": "^3.23.8" } }, "sha512-Ut3iISNLujlmY9Gu8sNU+SPDJDvqlVzWddU8qUr0Yae5oD4SguaUFjjhireMGhQ3M5E0KljQgDbTmnBo1kIZ3w=="], + + "rocksky-web-mobile/vitest/@vitest/expect": ["@vitest/expect@3.2.4", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" } }, "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig=="], + + "rocksky-web-mobile/vitest/@vitest/mocker": ["@vitest/mocker@3.2.4", "", { "dependencies": { "@vitest/spy": "3.2.4", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "optionalPeers": ["msw", "vite"] }, "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ=="], + + "rocksky-web-mobile/vitest/@vitest/pretty-format": ["@vitest/pretty-format@3.2.4", "", { "dependencies": { "tinyrainbow": "^2.0.0" } }, "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA=="], + + "rocksky-web-mobile/vitest/@vitest/runner": ["@vitest/runner@3.2.4", "", { "dependencies": { "@vitest/utils": "3.2.4", "pathe": "^2.0.3", "strip-literal": "^3.0.0" } }, "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ=="], + + "rocksky-web-mobile/vitest/@vitest/snapshot": ["@vitest/snapshot@3.2.4", "", { "dependencies": { "@vitest/pretty-format": "3.2.4", "magic-string": "^0.30.17", "pathe": "^2.0.3" } }, "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ=="], + + "rocksky-web-mobile/vitest/@vitest/spy": ["@vitest/spy@3.2.4", "", { "dependencies": { "tinyspy": "^4.0.3" } }, "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw=="], + + "rocksky-web-mobile/vitest/@vitest/utils": ["@vitest/utils@3.2.4", "", { "dependencies": { "@vitest/pretty-format": "3.2.4", "loupe": "^3.1.4", "tinyrainbow": "^2.0.0" } }, "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA=="], + + "rocksky-web-mobile/vitest/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + + "rocksky-web-mobile/vitest/tinyrainbow": ["tinyrainbow@2.0.0", "", {}, "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw=="], + + "rocksky-web-mobile/vitest/vite-node": ["vite-node@3.2.4", "", { "dependencies": { "cac": "^6.7.14", "debug": "^4.4.1", "es-module-lexer": "^1.7.0", "pathe": "^2.0.3", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "bin": { "vite-node": "vite-node.mjs" } }, "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg=="], + + "rocksky/vitest/@vitest/expect": ["@vitest/expect@3.2.4", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" } }, "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig=="], + + "rocksky/vitest/@vitest/mocker": ["@vitest/mocker@3.2.4", "", { "dependencies": { "@vitest/spy": "3.2.4", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "optionalPeers": ["msw", "vite"] }, "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ=="], + + "rocksky/vitest/@vitest/pretty-format": ["@vitest/pretty-format@3.2.4", "", { "dependencies": { "tinyrainbow": "^2.0.0" } }, "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA=="], + + "rocksky/vitest/@vitest/runner": ["@vitest/runner@3.2.4", "", { "dependencies": { "@vitest/utils": "3.2.4", "pathe": "^2.0.3", "strip-literal": "^3.0.0" } }, "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ=="], + + "rocksky/vitest/@vitest/snapshot": ["@vitest/snapshot@3.2.4", "", { "dependencies": { "@vitest/pretty-format": "3.2.4", "magic-string": "^0.30.17", "pathe": "^2.0.3" } }, "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ=="], + + "rocksky/vitest/@vitest/spy": ["@vitest/spy@3.2.4", "", { "dependencies": { "tinyspy": "^4.0.3" } }, "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw=="], + + "rocksky/vitest/@vitest/utils": ["@vitest/utils@3.2.4", "", { "dependencies": { "@vitest/pretty-format": "3.2.4", "loupe": "^3.1.4", "tinyrainbow": "^2.0.0" } }, "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA=="], + + "rocksky/vitest/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + + "rocksky/vitest/tinyrainbow": ["tinyrainbow@2.0.0", "", {}, "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw=="], + + "rocksky/vitest/vite-node": ["vite-node@3.2.4", "", { "dependencies": { "cac": "^6.7.14", "debug": "^4.4.1", "es-module-lexer": "^1.7.0", "pathe": "^2.0.3", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "bin": { "vite-node": "vite-node.mjs" } }, "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg=="], + + "spotify-proxy/@cloudflare/vitest-pool-workers/miniflare": ["miniflare@4.20250612.0", "", { "dependencies": { "@cspotcode/source-map-support": "0.8.1", "acorn": "8.14.0", "acorn-walk": "8.3.2", "exit-hook": "2.2.1", "glob-to-regexp": "0.4.1", "sharp": "^0.33.5", "stoppable": "1.1.0", "undici": "^5.28.5", "workerd": "1.20250612.0", "ws": "8.18.0", "youch": "3.3.4", "zod": "3.22.3" }, "bin": { "miniflare": "bootstrap.js" } }, "sha512-zMUKXBS8Ru1DcmX8dSCmxm7ZjEd7jHQlZpJMNT1/LqxHo3KEye/CHgoEZ1vdsH7T3fe0I0qRcRQx7IWhlXnN1w=="], + + "spotify-proxy/vitest/@vitest/expect": ["@vitest/expect@3.0.9", "", { "dependencies": { "@vitest/spy": "3.0.9", "@vitest/utils": "3.0.9", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" } }, "sha512-5eCqRItYgIML7NNVgJj6TVCmdzE7ZVgJhruW0ziSQV4V7PvLkDL1bBkBdcTs/VuIz0IxPb5da1IDSqc1TR9eig=="], + + "spotify-proxy/vitest/@vitest/mocker": ["@vitest/mocker@3.0.9", "", { "dependencies": { "@vitest/spy": "3.0.9", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^5.0.0 || ^6.0.0" }, "optionalPeers": ["msw", "vite"] }, "sha512-ryERPIBOnvevAkTq+L1lD+DTFBRcjueL9lOUfXsLfwP92h4e+Heb+PjiqS3/OURWPtywfafK0kj++yDFjWUmrA=="], + + "spotify-proxy/vitest/@vitest/pretty-format": ["@vitest/pretty-format@3.2.4", "", { "dependencies": { "tinyrainbow": "^2.0.0" } }, "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA=="], + + "spotify-proxy/vitest/@vitest/runner": ["@vitest/runner@3.0.9", "", { "dependencies": { "@vitest/utils": "3.0.9", "pathe": "^2.0.3" } }, "sha512-NX9oUXgF9HPfJSwl8tUZCMP1oGx2+Sf+ru6d05QjzQz4OwWg0psEzwY6VexP2tTHWdOkhKHUIZH+fS6nA7jfOw=="], + + "spotify-proxy/vitest/@vitest/snapshot": ["@vitest/snapshot@3.0.9", "", { "dependencies": { "@vitest/pretty-format": "3.0.9", "magic-string": "^0.30.17", "pathe": "^2.0.3" } }, "sha512-AiLUiuZ0FuA+/8i19mTYd+re5jqjEc2jZbgJ2up0VY0Ddyyxg/uUtBDpIFAy4uzKaQxOW8gMgBdAJJ2ydhu39A=="], + + "spotify-proxy/vitest/@vitest/spy": ["@vitest/spy@3.0.9", "", { "dependencies": { "tinyspy": "^3.0.2" } }, "sha512-/CcK2UDl0aQ2wtkp3YVWldrpLRNCfVcIOFGlVGKO4R5eajsH393Z1yiXLVQ7vWsj26JOEjeZI0x5sm5P4OGUNQ=="], + + "spotify-proxy/vitest/@vitest/utils": ["@vitest/utils@3.0.9", "", { "dependencies": { "@vitest/pretty-format": "3.0.9", "loupe": "^3.1.3", "tinyrainbow": "^2.0.0" } }, "sha512-ilHM5fHhZ89MCp5aAaM9uhfl1c2JdxVxl3McqsdVyVNN6JffnEen8UMCdRTzOhGXNQGo5GNL9QugHrz727Wnng=="], + + "spotify-proxy/vitest/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + + "spotify-proxy/vitest/tinyrainbow": ["tinyrainbow@2.0.0", "", {}, "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw=="], + + "spotify-proxy/vitest/vite-node": ["vite-node@3.0.9", "", { "dependencies": { "cac": "^6.7.14", "debug": "^4.4.0", "es-module-lexer": "^1.6.0", "pathe": "^2.0.3", "vite": "^5.0.0 || ^6.0.0" }, "bin": { "vite-node": "vite-node.mjs" } }, "sha512-w3Gdx7jDcuT9cNn9jExXgOyKmf5UOTb6WMHz8LGAm54eS1Elf5OuBhCxl6zJxGhEeIkgsE1WbHuoL0mj/UXqXg=="], + + "spotify-proxy/wrangler/@cloudflare/kv-asset-handler": ["@cloudflare/kv-asset-handler@0.4.0", "", { "dependencies": { "mime": "^3.0.0" } }, "sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA=="], + + "spotify-proxy/wrangler/@cloudflare/unenv-preset": ["@cloudflare/unenv-preset@2.3.3", "", { "peerDependencies": { "unenv": "2.0.0-rc.17", "workerd": "^1.20250508.0" }, "optionalPeers": ["workerd"] }, "sha512-/M3MEcj3V2WHIRSW1eAQBPRJ6JnGQHc6JKMAPLkDb7pLs3m6X9ES/+K3ceGqxI6TKeF32AWAi7ls0AYzVxCP0A=="], + + "spotify-proxy/wrangler/esbuild": ["esbuild@0.25.4", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.4", "@esbuild/android-arm": "0.25.4", "@esbuild/android-arm64": "0.25.4", "@esbuild/android-x64": "0.25.4", "@esbuild/darwin-arm64": "0.25.4", "@esbuild/darwin-x64": "0.25.4", "@esbuild/freebsd-arm64": "0.25.4", "@esbuild/freebsd-x64": "0.25.4", "@esbuild/linux-arm": "0.25.4", "@esbuild/linux-arm64": "0.25.4", "@esbuild/linux-ia32": "0.25.4", "@esbuild/linux-loong64": "0.25.4", "@esbuild/linux-mips64el": "0.25.4", "@esbuild/linux-ppc64": "0.25.4", "@esbuild/linux-riscv64": "0.25.4", "@esbuild/linux-s390x": "0.25.4", "@esbuild/linux-x64": "0.25.4", "@esbuild/netbsd-arm64": "0.25.4", "@esbuild/netbsd-x64": "0.25.4", "@esbuild/openbsd-arm64": "0.25.4", "@esbuild/openbsd-x64": "0.25.4", "@esbuild/sunos-x64": "0.25.4", "@esbuild/win32-arm64": "0.25.4", "@esbuild/win32-ia32": "0.25.4", "@esbuild/win32-x64": "0.25.4" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q=="], + + "spotify-proxy/wrangler/miniflare": ["miniflare@4.20250612.0", "", { "dependencies": { "@cspotcode/source-map-support": "0.8.1", "acorn": "8.14.0", "acorn-walk": "8.3.2", "exit-hook": "2.2.1", "glob-to-regexp": "0.4.1", "sharp": "^0.33.5", "stoppable": "1.1.0", "undici": "^5.28.5", "workerd": "1.20250612.0", "ws": "8.18.0", "youch": "3.3.4", "zod": "3.22.3" }, "bin": { "miniflare": "bootstrap.js" } }, "sha512-zMUKXBS8Ru1DcmX8dSCmxm7ZjEd7jHQlZpJMNT1/LqxHo3KEye/CHgoEZ1vdsH7T3fe0I0qRcRQx7IWhlXnN1w=="], + + "spotify-proxy/wrangler/unenv": ["unenv@2.0.0-rc.17", "", { "dependencies": { "defu": "^6.1.4", "exsolve": "^1.0.4", "ohash": "^2.0.11", "pathe": "^2.0.3", "ufo": "^1.6.1" } }, "sha512-B06u0wXkEd+o5gOCMl/ZHl5cfpYbDZKAT+HWTL+Hws6jWu7dCiqBBXXXzMFcFVJb8D4ytAnYmxJA83uwOQRSsg=="], + + "spotify-proxy/wrangler/workerd": ["workerd@1.20250612.0", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20250612.0", "@cloudflare/workerd-darwin-arm64": "1.20250612.0", "@cloudflare/workerd-linux-64": "1.20250612.0", "@cloudflare/workerd-linux-arm64": "1.20250612.0", "@cloudflare/workerd-windows-64": "1.20250612.0" }, "bin": { "workerd": "bin/workerd" } }, "sha512-YWCjj4uZf3eH32epQy/c7tKWOInAswgFRAJoH6I/EY08OJKDfoJtKvRZj5f675KoJlKTPAoJ1ig/oE+RUKP3uw=="], + + "styled-components/@emotion/is-prop-valid/@emotion/memoize": ["@emotion/memoize@0.8.1", "", {}, "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA=="], + + "sucrase/glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "table/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + + "terser-webpack-plugin/schema-utils/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + + "terser-webpack-plugin/schema-utils/ajv-keywords": ["ajv-keywords@5.1.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3" }, "peerDependencies": { "ajv": "^8.8.2" } }, "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw=="], + + "tiny-salad-4531/vitest/@vitest/expect": ["@vitest/expect@2.1.9", "", { "dependencies": { "@vitest/spy": "2.1.9", "@vitest/utils": "2.1.9", "chai": "^5.1.2", "tinyrainbow": "^1.2.0" } }, "sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw=="], + + "tiny-salad-4531/vitest/@vitest/mocker": ["@vitest/mocker@2.1.9", "", { "dependencies": { "@vitest/spy": "2.1.9", "estree-walker": "^3.0.3", "magic-string": "^0.30.12" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^5.0.0" }, "optionalPeers": ["msw", "vite"] }, "sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg=="], + + "tiny-salad-4531/vitest/@vitest/spy": ["@vitest/spy@2.1.9", "", { "dependencies": { "tinyspy": "^3.0.2" } }, "sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ=="], + + "tiny-salad-4531/vitest/@vitest/utils": ["@vitest/utils@2.1.9", "", { "dependencies": { "@vitest/pretty-format": "2.1.9", "loupe": "^3.1.2", "tinyrainbow": "^1.2.0" } }, "sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ=="], + + "tiny-salad-4531/vitest/vite": ["vite@5.4.19", "", { "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", "rollup": "^4.20.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" }, "optionalPeers": ["@types/node", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser"], "bin": { "vite": "bin/vite.js" } }, "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA=="], + + "tiny-salad-4531/vitest/vite-node": ["vite-node@2.1.9", "", { "dependencies": { "cac": "^6.7.14", "debug": "^4.3.7", "es-module-lexer": "^1.5.4", "pathe": "^1.1.2", "vite": "^5.0.0" }, "bin": { "vite-node": "vite-node.mjs" } }, "sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA=="], + + "unstorage/chokidar/readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], + + "victory-vendor/d3-shape/d3-path": ["d3-path@3.1.0", "", {}, "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ=="], + + "vite-node/vite/esbuild": ["esbuild@0.21.5", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.21.5", "@esbuild/android-arm": "0.21.5", "@esbuild/android-arm64": "0.21.5", "@esbuild/android-x64": "0.21.5", "@esbuild/darwin-arm64": "0.21.5", "@esbuild/darwin-x64": "0.21.5", "@esbuild/freebsd-arm64": "0.21.5", "@esbuild/freebsd-x64": "0.21.5", "@esbuild/linux-arm": "0.21.5", "@esbuild/linux-arm64": "0.21.5", "@esbuild/linux-ia32": "0.21.5", "@esbuild/linux-loong64": "0.21.5", "@esbuild/linux-mips64el": "0.21.5", "@esbuild/linux-ppc64": "0.21.5", "@esbuild/linux-riscv64": "0.21.5", "@esbuild/linux-s390x": "0.21.5", "@esbuild/linux-x64": "0.21.5", "@esbuild/netbsd-x64": "0.21.5", "@esbuild/openbsd-x64": "0.21.5", "@esbuild/sunos-x64": "0.21.5", "@esbuild/win32-arm64": "0.21.5", "@esbuild/win32-ia32": "0.21.5", "@esbuild/win32-x64": "0.21.5" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw=="], + + "vitest/@vitest/snapshot/@vitest/pretty-format": ["@vitest/pretty-format@2.1.8", "", { "dependencies": { "tinyrainbow": "^1.2.0" } }, "sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ=="], + + "vitest/vite/esbuild": ["esbuild@0.21.5", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.21.5", "@esbuild/android-arm": "0.21.5", "@esbuild/android-arm64": "0.21.5", "@esbuild/android-x64": "0.21.5", "@esbuild/darwin-arm64": "0.21.5", "@esbuild/darwin-x64": "0.21.5", "@esbuild/freebsd-arm64": "0.21.5", "@esbuild/freebsd-x64": "0.21.5", "@esbuild/linux-arm": "0.21.5", "@esbuild/linux-arm64": "0.21.5", "@esbuild/linux-ia32": "0.21.5", "@esbuild/linux-loong64": "0.21.5", "@esbuild/linux-mips64el": "0.21.5", "@esbuild/linux-ppc64": "0.21.5", "@esbuild/linux-riscv64": "0.21.5", "@esbuild/linux-s390x": "0.21.5", "@esbuild/linux-x64": "0.21.5", "@esbuild/netbsd-x64": "0.21.5", "@esbuild/openbsd-x64": "0.21.5", "@esbuild/sunos-x64": "0.21.5", "@esbuild/win32-arm64": "0.21.5", "@esbuild/win32-ia32": "0.21.5", "@esbuild/win32-x64": "0.21.5" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw=="], + + "webpack/eslint-scope/estraverse": ["estraverse@4.3.0", "", {}, "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="], + + "webpack/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "webpack/schema-utils/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + + "webpack/schema-utils/ajv-keywords": ["ajv-keywords@5.1.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3" }, "peerDependencies": { "ajv": "^8.8.2" } }, "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw=="], + + "white-scene-4cbd/vitest/@vitest/expect": ["@vitest/expect@2.1.9", "", { "dependencies": { "@vitest/spy": "2.1.9", "@vitest/utils": "2.1.9", "chai": "^5.1.2", "tinyrainbow": "^1.2.0" } }, "sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw=="], + + "white-scene-4cbd/vitest/@vitest/mocker": ["@vitest/mocker@2.1.9", "", { "dependencies": { "@vitest/spy": "2.1.9", "estree-walker": "^3.0.3", "magic-string": "^0.30.12" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^5.0.0" }, "optionalPeers": ["msw", "vite"] }, "sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg=="], + + "white-scene-4cbd/vitest/@vitest/spy": ["@vitest/spy@2.1.9", "", { "dependencies": { "tinyspy": "^3.0.2" } }, "sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ=="], + + "white-scene-4cbd/vitest/@vitest/utils": ["@vitest/utils@2.1.9", "", { "dependencies": { "@vitest/pretty-format": "2.1.9", "loupe": "^3.1.2", "tinyrainbow": "^1.2.0" } }, "sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ=="], + + "white-scene-4cbd/vitest/vite": ["vite@5.4.19", "", { "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", "rollup": "^4.20.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" }, "optionalPeers": ["@types/node", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser"], "bin": { "vite": "bin/vite.js" } }, "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA=="], + + "white-scene-4cbd/vitest/vite-node": ["vite-node@2.1.9", "", { "dependencies": { "cac": "^6.7.14", "debug": "^4.3.7", "es-module-lexer": "^1.5.4", "pathe": "^1.1.2", "vite": "^5.0.0" }, "bin": { "vite-node": "vite-node.mjs" } }, "sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA=="], + + "wrangler/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.17.19", "", { "os": "android", "cpu": "arm" }, "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A=="], + + "wrangler/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.17.19", "", { "os": "android", "cpu": "arm64" }, "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA=="], + + "wrangler/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.17.19", "", { "os": "android", "cpu": "x64" }, "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww=="], + + "wrangler/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.17.19", "", { "os": "darwin", "cpu": "arm64" }, "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg=="], + + "wrangler/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.17.19", "", { "os": "darwin", "cpu": "x64" }, "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw=="], + + "wrangler/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.17.19", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ=="], + + "wrangler/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.17.19", "", { "os": "freebsd", "cpu": "x64" }, "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ=="], + + "wrangler/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.17.19", "", { "os": "linux", "cpu": "arm" }, "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA=="], + + "wrangler/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.17.19", "", { "os": "linux", "cpu": "arm64" }, "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg=="], + + "wrangler/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.17.19", "", { "os": "linux", "cpu": "ia32" }, "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ=="], + + "wrangler/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.17.19", "", { "os": "linux", "cpu": "none" }, "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ=="], + + "wrangler/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.17.19", "", { "os": "linux", "cpu": "none" }, "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A=="], + + "wrangler/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.17.19", "", { "os": "linux", "cpu": "ppc64" }, "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg=="], + + "wrangler/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.17.19", "", { "os": "linux", "cpu": "none" }, "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA=="], + + "wrangler/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.17.19", "", { "os": "linux", "cpu": "s390x" }, "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q=="], + + "wrangler/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.17.19", "", { "os": "linux", "cpu": "x64" }, "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw=="], + + "wrangler/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.17.19", "", { "os": "none", "cpu": "x64" }, "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q=="], + + "wrangler/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.17.19", "", { "os": "openbsd", "cpu": "x64" }, "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g=="], + + "wrangler/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.17.19", "", { "os": "sunos", "cpu": "x64" }, "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg=="], + + "wrangler/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.17.19", "", { "os": "win32", "cpu": "arm64" }, "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag=="], + + "wrangler/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.17.19", "", { "os": "win32", "cpu": "ia32" }, "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw=="], + + "wrangler/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.17.19", "", { "os": "win32", "cpu": "x64" }, "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA=="], + + "wrangler/miniflare/ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], + + "wrangler/miniflare/youch": ["youch@3.3.4", "", { "dependencies": { "cookie": "^0.7.1", "mustache": "^4.2.0", "stacktracey": "^2.1.8" } }, "sha512-UeVBXie8cA35DS6+nBkls68xaBBXCye0CNznrhszZjTbRVnJKQuNsyLKBTTL4ln1o1rh2PKtv35twV7irj5SEg=="], + + "wrangler/miniflare/zod": ["zod@3.22.3", "", {}, "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug=="], + + "@atproto/sync/@atproto/xrpc-server/express/accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="], + + "@atproto/sync/@atproto/xrpc-server/express/body-parser": ["body-parser@1.20.3", "", { "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" } }, "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g=="], + + "@atproto/sync/@atproto/xrpc-server/express/content-disposition": ["content-disposition@0.5.4", "", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ=="], + + "@atproto/sync/@atproto/xrpc-server/express/cookie": ["cookie@0.7.1", "", {}, "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w=="], + + "@atproto/sync/@atproto/xrpc-server/express/cookie-signature": ["cookie-signature@1.0.6", "", {}, "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="], + + "@atproto/sync/@atproto/xrpc-server/express/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "@atproto/sync/@atproto/xrpc-server/express/finalhandler": ["finalhandler@1.3.1", "", { "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", "statuses": "2.0.1", "unpipe": "~1.0.0" } }, "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ=="], + + "@atproto/sync/@atproto/xrpc-server/express/fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="], + + "@atproto/sync/@atproto/xrpc-server/express/merge-descriptors": ["merge-descriptors@1.0.3", "", {}, "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ=="], + + "@atproto/sync/@atproto/xrpc-server/express/path-to-regexp": ["path-to-regexp@0.1.12", "", {}, "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ=="], + + "@atproto/sync/@atproto/xrpc-server/express/qs": ["qs@6.13.0", "", { "dependencies": { "side-channel": "^1.0.6" } }, "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg=="], + + "@atproto/sync/@atproto/xrpc-server/express/send": ["send@0.19.0", "", { "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "2.4.1", "range-parser": "~1.2.1", "statuses": "2.0.1" } }, "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw=="], + + "@atproto/sync/@atproto/xrpc-server/express/serve-static": ["serve-static@1.16.2", "", { "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "0.19.0" } }, "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw=="], + + "@atproto/sync/@atproto/xrpc-server/express/statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], + + "@atproto/sync/@atproto/xrpc-server/express/type-is": ["type-is@1.6.18", "", { "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" } }, "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g=="], + + "@atproto/sync/@atproto/xrpc-server/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "@atproto/xrpc-server/express/accepts/negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], + + "@atproto/xrpc-server/express/body-parser/iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], + + "@atproto/xrpc-server/express/body-parser/raw-body": ["raw-body@2.5.2", "", { "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" } }, "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA=="], + + "@atproto/xrpc-server/express/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "@atproto/xrpc-server/express/send/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="], + + "@atproto/xrpc-server/express/send/mime": ["mime@1.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="], + + "@atproto/xrpc-server/express/type-is/media-typer": ["media-typer@0.3.0", "", {}, "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="], + + "@babel/highlight/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + + "@babel/highlight/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], + + "@cloudflare/vitest-pool-workers/wrangler/unenv/ohash": ["ohash@1.1.6", "", {}, "sha512-TBu7PtV8YkAZn0tSxobKY2n2aAQva936lhRrj6957aDaCf9IEtqsKbgMzXE/F/sjqYOwmrukeORHNLe5glk7Cg=="], + + "@cloudflare/vitest-pool-workers/wrangler/workerd/@cloudflare/workerd-darwin-64": ["@cloudflare/workerd-darwin-64@1.20250204.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-HpsgbWEfvdcwuZ8WAZhi1TlSCyyHC3tbghpKsOqGDaQNltyAFAWqa278TPNfcitYf/FmV4961v3eqUE+RFdHNQ=="], + + "@cloudflare/vitest-pool-workers/wrangler/workerd/@cloudflare/workerd-darwin-arm64": ["@cloudflare/workerd-darwin-arm64@1.20250204.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-AJ8Tk7KMJqePlch3SH8oL41ROtsrb07hKRHD6M+FvGC3tLtf26rpteAAMNYKMDYKzFNFUIKZNijYDFZjBFndXQ=="], + + "@cloudflare/vitest-pool-workers/wrangler/workerd/@cloudflare/workerd-linux-64": ["@cloudflare/workerd-linux-64@1.20250204.0", "", { "os": "linux", "cpu": "x64" }, "sha512-RIUfUSnDC8h73zAa+u1K2Frc7nc+eeQoBBP7SaqsRe6JdX8jfIv/GtWjQWCoj8xQFgLvhpJKZ4sTTTV+AilQbw=="], + + "@cloudflare/vitest-pool-workers/wrangler/workerd/@cloudflare/workerd-linux-arm64": ["@cloudflare/workerd-linux-arm64@1.20250204.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-8Ql8jDjoIgr2J7oBD01kd9kduUz60njofrBpAOkjCPed15He8e8XHkYaYow3g0xpae4S2ryrPOeoD3M64sRxeg=="], + + "@cloudflare/vitest-pool-workers/wrangler/workerd/@cloudflare/workerd-windows-64": ["@cloudflare/workerd-windows-64@1.20250204.0", "", { "os": "win32", "cpu": "x64" }, "sha512-RpDJO3+to+e17X3EWfRCagboZYwBz2fowc+jL53+fd7uD19v3F59H48lw2BDpHJMRyhg6ouWcpM94OhsHv8ecA=="], + + "@expo/cli/accepts/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "@expo/cli/send/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "@expo/config-plugins/glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "@expo/config/glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "@expo/devcert/glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "@istanbuljs/load-nyc-config/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], + + "@joshwooding/vite-plugin-react-docgen-typescript/glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "@react-native/community-cli-plugin/@react-native/dev-middleware/open/is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], + + "@react-native/community-cli-plugin/@react-native/dev-middleware/open/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + + "@react-native/community-cli-plugin/@react-native/dev-middleware/serve-static/send": ["send@0.19.0", "", { "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "2.4.1", "range-parser": "~1.2.1", "statuses": "2.0.1" } }, "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw=="], + + "@react-native/dev-middleware/serve-static/send/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="], + + "@react-native/dev-middleware/serve-static/send/fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="], + + "@react-native/dev-middleware/serve-static/send/mime": ["mime@1.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="], + + "@react-native/dev-middleware/serve-static/send/statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], + + "@storybook/test/@vitest/expect/@vitest/utils/@vitest/pretty-format": ["@vitest/pretty-format@2.0.5", "", { "dependencies": { "tinyrainbow": "^1.2.0" } }, "sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ=="], + + "@storybook/test/@vitest/expect/@vitest/utils/estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + + "@vitest/ui/vitest/@vitest/mocker/estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + + "@vitest/ui/vitest/@vitest/spy/tinyspy": ["tinyspy@4.0.3", "", {}, "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A=="], + + "biome/chalk/strip-ansi/ansi-regex": ["ansi-regex@2.1.1", "", {}, "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="], + + "expo-modules-autolinking/glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "expo-router/schema-utils/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + + "log-symbols/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + + "log-symbols/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], + + "metro-config/cosmiconfig/import-fresh/resolve-from": ["resolve-from@3.0.0", "", {}, "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw=="], + + "metro-config/cosmiconfig/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], + + "ora/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + + "ora/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], + + "ora/cli-cursor/restore-cursor/onetime": ["onetime@2.0.1", "", { "dependencies": { "mimic-fn": "^1.0.0" } }, "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ=="], + + "ora/cli-cursor/restore-cursor/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + + "pkg-dir/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], + + "rocksky-app/vitest/@vitest/mocker/estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + + "rocksky-app/vitest/@vitest/spy/tinyspy": ["tinyspy@4.0.3", "", {}, "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A=="], + + "rocksky-web-mobile/vitest/@vitest/mocker/estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + + "rocksky-web-mobile/vitest/@vitest/spy/tinyspy": ["tinyspy@4.0.3", "", {}, "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A=="], + + "rocksky/vitest/@vitest/mocker/estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + + "rocksky/vitest/@vitest/spy/tinyspy": ["tinyspy@4.0.3", "", {}, "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A=="], + + "spotify-proxy/@cloudflare/vitest-pool-workers/miniflare/workerd": ["workerd@1.20250612.0", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20250612.0", "@cloudflare/workerd-darwin-arm64": "1.20250612.0", "@cloudflare/workerd-linux-64": "1.20250612.0", "@cloudflare/workerd-linux-arm64": "1.20250612.0", "@cloudflare/workerd-windows-64": "1.20250612.0" }, "bin": { "workerd": "bin/workerd" } }, "sha512-YWCjj4uZf3eH32epQy/c7tKWOInAswgFRAJoH6I/EY08OJKDfoJtKvRZj5f675KoJlKTPAoJ1ig/oE+RUKP3uw=="], + + "spotify-proxy/@cloudflare/vitest-pool-workers/miniflare/ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], + + "spotify-proxy/@cloudflare/vitest-pool-workers/miniflare/youch": ["youch@3.3.4", "", { "dependencies": { "cookie": "^0.7.1", "mustache": "^4.2.0", "stacktracey": "^2.1.8" } }, "sha512-UeVBXie8cA35DS6+nBkls68xaBBXCye0CNznrhszZjTbRVnJKQuNsyLKBTTL4ln1o1rh2PKtv35twV7irj5SEg=="], + + "spotify-proxy/@cloudflare/vitest-pool-workers/miniflare/zod": ["zod@3.22.3", "", {}, "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug=="], + + "spotify-proxy/vitest/@vitest/mocker/estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + + "spotify-proxy/vitest/@vitest/snapshot/@vitest/pretty-format": ["@vitest/pretty-format@3.0.9", "", { "dependencies": { "tinyrainbow": "^2.0.0" } }, "sha512-OW9F8t2J3AwFEwENg3yMyKWweF7oRJlMyHOMIhO5F3n0+cgQAJZBjNgrF8dLwFTEXl5jUqBLXd9QyyKv8zEcmA=="], + + "spotify-proxy/vitest/@vitest/utils/@vitest/pretty-format": ["@vitest/pretty-format@3.0.9", "", { "dependencies": { "tinyrainbow": "^2.0.0" } }, "sha512-OW9F8t2J3AwFEwENg3yMyKWweF7oRJlMyHOMIhO5F3n0+cgQAJZBjNgrF8dLwFTEXl5jUqBLXd9QyyKv8zEcmA=="], + + "spotify-proxy/wrangler/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.4", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q=="], + + "spotify-proxy/wrangler/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.4", "", { "os": "android", "cpu": "arm" }, "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ=="], + + "spotify-proxy/wrangler/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.4", "", { "os": "android", "cpu": "arm64" }, "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A=="], + + "spotify-proxy/wrangler/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.25.4", "", { "os": "android", "cpu": "x64" }, "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ=="], + + "spotify-proxy/wrangler/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g=="], + + "spotify-proxy/wrangler/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A=="], + + "spotify-proxy/wrangler/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.4", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ=="], + + "spotify-proxy/wrangler/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ=="], + + "spotify-proxy/wrangler/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.4", "", { "os": "linux", "cpu": "arm" }, "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ=="], + + "spotify-proxy/wrangler/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ=="], + + "spotify-proxy/wrangler/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.4", "", { "os": "linux", "cpu": "ia32" }, "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ=="], + + "spotify-proxy/wrangler/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA=="], + + "spotify-proxy/wrangler/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg=="], + + "spotify-proxy/wrangler/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag=="], + + "spotify-proxy/wrangler/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA=="], + + "spotify-proxy/wrangler/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g=="], + + "spotify-proxy/wrangler/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.4", "", { "os": "linux", "cpu": "x64" }, "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA=="], + + "spotify-proxy/wrangler/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.4", "", { "os": "none", "cpu": "arm64" }, "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ=="], + + "spotify-proxy/wrangler/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.4", "", { "os": "none", "cpu": "x64" }, "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw=="], + + "spotify-proxy/wrangler/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.4", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A=="], + + "spotify-proxy/wrangler/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.4", "", { "os": "openbsd", "cpu": "x64" }, "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw=="], + + "spotify-proxy/wrangler/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.4", "", { "os": "sunos", "cpu": "x64" }, "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q=="], + + "spotify-proxy/wrangler/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ=="], + + "spotify-proxy/wrangler/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg=="], + + "spotify-proxy/wrangler/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.4", "", { "os": "win32", "cpu": "x64" }, "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ=="], + + "spotify-proxy/wrangler/miniflare/ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], + + "spotify-proxy/wrangler/miniflare/youch": ["youch@3.3.4", "", { "dependencies": { "cookie": "^0.7.1", "mustache": "^4.2.0", "stacktracey": "^2.1.8" } }, "sha512-UeVBXie8cA35DS6+nBkls68xaBBXCye0CNznrhszZjTbRVnJKQuNsyLKBTTL4ln1o1rh2PKtv35twV7irj5SEg=="], + + "spotify-proxy/wrangler/miniflare/zod": ["zod@3.22.3", "", {}, "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug=="], + + "spotify-proxy/wrangler/unenv/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + + "spotify-proxy/wrangler/workerd/@cloudflare/workerd-darwin-64": ["@cloudflare/workerd-darwin-64@1.20250612.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-IpL/tOvNY04n2hvp/XGdOGjeMDycEjbwJL8gJ0kenBFBa13EE82I61ceA56kuCiEdb1vBv3O+xiD9zN6AuQlmQ=="], + + "spotify-proxy/wrangler/workerd/@cloudflare/workerd-darwin-arm64": ["@cloudflare/workerd-darwin-arm64@1.20250612.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Hb9GWzLT4ydBYfGE29jxZFkx58NEA+oRMuGP358A6PUZ9UEDYWTDhskVQovhjELZMgOppUYXN2v/Je3sO1anpg=="], + + "spotify-proxy/wrangler/workerd/@cloudflare/workerd-linux-64": ["@cloudflare/workerd-linux-64@1.20250612.0", "", { "os": "linux", "cpu": "x64" }, "sha512-7kOA1sCfl9m2osolplDM9XqyBPf5KupvDs4UbD2kQq0zfd+u6acLz/YB9Q5tsVQIyhQoP32Oe+kr6IZJBImq9A=="], + + "spotify-proxy/wrangler/workerd/@cloudflare/workerd-linux-arm64": ["@cloudflare/workerd-linux-arm64@1.20250612.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-x2UsZhfacZftD/kpDE2mtAlrLZPmkwRInFHJc7uIl8mvovQqVKMBkexH7dkfrgvBV98S2hOjxqFKP9mETuQQAQ=="], + + "spotify-proxy/wrangler/workerd/@cloudflare/workerd-windows-64": ["@cloudflare/workerd-windows-64@1.20250612.0", "", { "os": "win32", "cpu": "x64" }, "sha512-CeYe4OM5doIVGsOtrmDTrIBV2/wa/SPREEXH/N7ZCEs7mRhsTNFOwmctC0CYe3ZiutJ02dJmmyh/CIij2mkOLQ=="], + + "sucrase/glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "terser-webpack-plugin/schema-utils/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + + "tiny-salad-4531/vitest/@vitest/mocker/estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + + "tiny-salad-4531/vitest/vite/esbuild": ["esbuild@0.21.5", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.21.5", "@esbuild/android-arm": "0.21.5", "@esbuild/android-arm64": "0.21.5", "@esbuild/android-x64": "0.21.5", "@esbuild/darwin-arm64": "0.21.5", "@esbuild/darwin-x64": "0.21.5", "@esbuild/freebsd-arm64": "0.21.5", "@esbuild/freebsd-x64": "0.21.5", "@esbuild/linux-arm": "0.21.5", "@esbuild/linux-arm64": "0.21.5", "@esbuild/linux-ia32": "0.21.5", "@esbuild/linux-loong64": "0.21.5", "@esbuild/linux-mips64el": "0.21.5", "@esbuild/linux-ppc64": "0.21.5", "@esbuild/linux-riscv64": "0.21.5", "@esbuild/linux-s390x": "0.21.5", "@esbuild/linux-x64": "0.21.5", "@esbuild/netbsd-x64": "0.21.5", "@esbuild/openbsd-x64": "0.21.5", "@esbuild/sunos-x64": "0.21.5", "@esbuild/win32-arm64": "0.21.5", "@esbuild/win32-ia32": "0.21.5", "@esbuild/win32-x64": "0.21.5" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw=="], + + "vite-node/vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.21.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ=="], + + "vite-node/vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.21.5", "", { "os": "android", "cpu": "arm" }, "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg=="], + + "vite-node/vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.21.5", "", { "os": "android", "cpu": "arm64" }, "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A=="], + + "vite-node/vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.21.5", "", { "os": "android", "cpu": "x64" }, "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA=="], + + "vite-node/vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.21.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ=="], + + "vite-node/vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.21.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw=="], + + "vite-node/vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.21.5", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g=="], + + "vite-node/vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.21.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ=="], + + "vite-node/vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.21.5", "", { "os": "linux", "cpu": "arm" }, "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA=="], + + "vite-node/vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.21.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q=="], + + "vite-node/vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.21.5", "", { "os": "linux", "cpu": "ia32" }, "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg=="], + + "vite-node/vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg=="], + + "vite-node/vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg=="], + + "vite-node/vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.21.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w=="], + + "vite-node/vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA=="], + + "vite-node/vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.21.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A=="], + + "vite-node/vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.21.5", "", { "os": "linux", "cpu": "x64" }, "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ=="], + + "vite-node/vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.21.5", "", { "os": "none", "cpu": "x64" }, "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg=="], + + "vite-node/vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.21.5", "", { "os": "openbsd", "cpu": "x64" }, "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow=="], + + "vite-node/vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.21.5", "", { "os": "sunos", "cpu": "x64" }, "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg=="], + + "vite-node/vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.21.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A=="], + + "vite-node/vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.21.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA=="], + + "vite-node/vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.21.5", "", { "os": "win32", "cpu": "x64" }, "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw=="], + + "vitest/vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.21.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ=="], + + "vitest/vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.21.5", "", { "os": "android", "cpu": "arm" }, "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg=="], + + "vitest/vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.21.5", "", { "os": "android", "cpu": "arm64" }, "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A=="], + + "vitest/vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.21.5", "", { "os": "android", "cpu": "x64" }, "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA=="], + + "vitest/vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.21.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ=="], + + "vitest/vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.21.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw=="], + + "vitest/vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.21.5", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g=="], + + "vitest/vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.21.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ=="], + + "vitest/vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.21.5", "", { "os": "linux", "cpu": "arm" }, "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA=="], + + "vitest/vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.21.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q=="], + + "vitest/vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.21.5", "", { "os": "linux", "cpu": "ia32" }, "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg=="], + + "vitest/vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg=="], + + "vitest/vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg=="], + + "vitest/vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.21.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w=="], + + "vitest/vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA=="], + + "vitest/vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.21.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A=="], + + "vitest/vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.21.5", "", { "os": "linux", "cpu": "x64" }, "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ=="], + + "vitest/vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.21.5", "", { "os": "none", "cpu": "x64" }, "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg=="], + + "vitest/vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.21.5", "", { "os": "openbsd", "cpu": "x64" }, "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow=="], + + "vitest/vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.21.5", "", { "os": "sunos", "cpu": "x64" }, "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg=="], + + "vitest/vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.21.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A=="], + + "vitest/vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.21.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA=="], + + "vitest/vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.21.5", "", { "os": "win32", "cpu": "x64" }, "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw=="], + + "webpack/schema-utils/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + + "white-scene-4cbd/vitest/@vitest/mocker/estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + + "white-scene-4cbd/vitest/vite/esbuild": ["esbuild@0.21.5", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.21.5", "@esbuild/android-arm": "0.21.5", "@esbuild/android-arm64": "0.21.5", "@esbuild/android-x64": "0.21.5", "@esbuild/darwin-arm64": "0.21.5", "@esbuild/darwin-x64": "0.21.5", "@esbuild/freebsd-arm64": "0.21.5", "@esbuild/freebsd-x64": "0.21.5", "@esbuild/linux-arm": "0.21.5", "@esbuild/linux-arm64": "0.21.5", "@esbuild/linux-ia32": "0.21.5", "@esbuild/linux-loong64": "0.21.5", "@esbuild/linux-mips64el": "0.21.5", "@esbuild/linux-ppc64": "0.21.5", "@esbuild/linux-riscv64": "0.21.5", "@esbuild/linux-s390x": "0.21.5", "@esbuild/linux-x64": "0.21.5", "@esbuild/netbsd-x64": "0.21.5", "@esbuild/openbsd-x64": "0.21.5", "@esbuild/sunos-x64": "0.21.5", "@esbuild/win32-arm64": "0.21.5", "@esbuild/win32-ia32": "0.21.5", "@esbuild/win32-x64": "0.21.5" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw=="], + + "@atproto/sync/@atproto/xrpc-server/express/accepts/negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], + + "@atproto/sync/@atproto/xrpc-server/express/body-parser/iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], + + "@atproto/sync/@atproto/xrpc-server/express/body-parser/raw-body": ["raw-body@2.5.2", "", { "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" } }, "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA=="], + + "@atproto/sync/@atproto/xrpc-server/express/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "@atproto/sync/@atproto/xrpc-server/express/send/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="], + + "@atproto/sync/@atproto/xrpc-server/express/send/mime": ["mime@1.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="], + + "@atproto/sync/@atproto/xrpc-server/express/type-is/media-typer": ["media-typer@0.3.0", "", {}, "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="], + + "@babel/highlight/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + + "@istanbuljs/load-nyc-config/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], + + "@react-native/community-cli-plugin/@react-native/dev-middleware/serve-static/send/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="], + + "@react-native/community-cli-plugin/@react-native/dev-middleware/serve-static/send/fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="], + + "@react-native/community-cli-plugin/@react-native/dev-middleware/serve-static/send/mime": ["mime@1.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="], + + "@react-native/community-cli-plugin/@react-native/dev-middleware/serve-static/send/statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], + + "log-symbols/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + + "ora/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + + "ora/cli-cursor/restore-cursor/onetime/mimic-fn": ["mimic-fn@1.2.0", "", {}, "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="], + + "pkg-dir/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], + + "spotify-proxy/@cloudflare/vitest-pool-workers/miniflare/workerd/@cloudflare/workerd-darwin-64": ["@cloudflare/workerd-darwin-64@1.20250612.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-IpL/tOvNY04n2hvp/XGdOGjeMDycEjbwJL8gJ0kenBFBa13EE82I61ceA56kuCiEdb1vBv3O+xiD9zN6AuQlmQ=="], + + "spotify-proxy/@cloudflare/vitest-pool-workers/miniflare/workerd/@cloudflare/workerd-darwin-arm64": ["@cloudflare/workerd-darwin-arm64@1.20250612.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Hb9GWzLT4ydBYfGE29jxZFkx58NEA+oRMuGP358A6PUZ9UEDYWTDhskVQovhjELZMgOppUYXN2v/Je3sO1anpg=="], + + "spotify-proxy/@cloudflare/vitest-pool-workers/miniflare/workerd/@cloudflare/workerd-linux-64": ["@cloudflare/workerd-linux-64@1.20250612.0", "", { "os": "linux", "cpu": "x64" }, "sha512-7kOA1sCfl9m2osolplDM9XqyBPf5KupvDs4UbD2kQq0zfd+u6acLz/YB9Q5tsVQIyhQoP32Oe+kr6IZJBImq9A=="], + + "spotify-proxy/@cloudflare/vitest-pool-workers/miniflare/workerd/@cloudflare/workerd-linux-arm64": ["@cloudflare/workerd-linux-arm64@1.20250612.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-x2UsZhfacZftD/kpDE2mtAlrLZPmkwRInFHJc7uIl8mvovQqVKMBkexH7dkfrgvBV98S2hOjxqFKP9mETuQQAQ=="], + + "spotify-proxy/@cloudflare/vitest-pool-workers/miniflare/workerd/@cloudflare/workerd-windows-64": ["@cloudflare/workerd-windows-64@1.20250612.0", "", { "os": "win32", "cpu": "x64" }, "sha512-CeYe4OM5doIVGsOtrmDTrIBV2/wa/SPREEXH/N7ZCEs7mRhsTNFOwmctC0CYe3ZiutJ02dJmmyh/CIij2mkOLQ=="], + + "tiny-salad-4531/vitest/vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.21.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ=="], + + "tiny-salad-4531/vitest/vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.21.5", "", { "os": "android", "cpu": "arm" }, "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg=="], + + "tiny-salad-4531/vitest/vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.21.5", "", { "os": "android", "cpu": "arm64" }, "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A=="], + + "tiny-salad-4531/vitest/vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.21.5", "", { "os": "android", "cpu": "x64" }, "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA=="], + + "tiny-salad-4531/vitest/vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.21.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ=="], + + "tiny-salad-4531/vitest/vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.21.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw=="], + + "tiny-salad-4531/vitest/vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.21.5", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g=="], + + "tiny-salad-4531/vitest/vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.21.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ=="], + + "tiny-salad-4531/vitest/vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.21.5", "", { "os": "linux", "cpu": "arm" }, "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA=="], + + "tiny-salad-4531/vitest/vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.21.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q=="], + + "tiny-salad-4531/vitest/vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.21.5", "", { "os": "linux", "cpu": "ia32" }, "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg=="], + + "tiny-salad-4531/vitest/vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg=="], + + "tiny-salad-4531/vitest/vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg=="], + + "tiny-salad-4531/vitest/vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.21.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w=="], + + "tiny-salad-4531/vitest/vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA=="], + + "tiny-salad-4531/vitest/vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.21.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A=="], + + "tiny-salad-4531/vitest/vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.21.5", "", { "os": "linux", "cpu": "x64" }, "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ=="], + + "tiny-salad-4531/vitest/vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.21.5", "", { "os": "none", "cpu": "x64" }, "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg=="], + + "tiny-salad-4531/vitest/vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.21.5", "", { "os": "openbsd", "cpu": "x64" }, "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow=="], + + "tiny-salad-4531/vitest/vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.21.5", "", { "os": "sunos", "cpu": "x64" }, "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg=="], + + "tiny-salad-4531/vitest/vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.21.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A=="], + + "tiny-salad-4531/vitest/vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.21.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA=="], + + "tiny-salad-4531/vitest/vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.21.5", "", { "os": "win32", "cpu": "x64" }, "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw=="], + + "white-scene-4cbd/vitest/vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.21.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ=="], + + "white-scene-4cbd/vitest/vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.21.5", "", { "os": "android", "cpu": "arm" }, "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg=="], + + "white-scene-4cbd/vitest/vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.21.5", "", { "os": "android", "cpu": "arm64" }, "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A=="], + + "white-scene-4cbd/vitest/vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.21.5", "", { "os": "android", "cpu": "x64" }, "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA=="], + + "white-scene-4cbd/vitest/vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.21.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ=="], + + "white-scene-4cbd/vitest/vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.21.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw=="], + + "white-scene-4cbd/vitest/vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.21.5", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g=="], + + "white-scene-4cbd/vitest/vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.21.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ=="], + + "white-scene-4cbd/vitest/vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.21.5", "", { "os": "linux", "cpu": "arm" }, "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA=="], + + "white-scene-4cbd/vitest/vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.21.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q=="], + + "white-scene-4cbd/vitest/vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.21.5", "", { "os": "linux", "cpu": "ia32" }, "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg=="], + + "white-scene-4cbd/vitest/vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg=="], + + "white-scene-4cbd/vitest/vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg=="], + + "white-scene-4cbd/vitest/vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.21.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w=="], + + "white-scene-4cbd/vitest/vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA=="], + + "white-scene-4cbd/vitest/vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.21.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A=="], + + "white-scene-4cbd/vitest/vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.21.5", "", { "os": "linux", "cpu": "x64" }, "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ=="], + + "white-scene-4cbd/vitest/vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.21.5", "", { "os": "none", "cpu": "x64" }, "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg=="], + + "white-scene-4cbd/vitest/vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.21.5", "", { "os": "openbsd", "cpu": "x64" }, "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow=="], + + "white-scene-4cbd/vitest/vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.21.5", "", { "os": "sunos", "cpu": "x64" }, "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg=="], + + "white-scene-4cbd/vitest/vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.21.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A=="], + + "white-scene-4cbd/vitest/vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.21.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA=="], + + "white-scene-4cbd/vitest/vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.21.5", "", { "os": "win32", "cpu": "x64" }, "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw=="], + } +} diff --git a/compose.yaml b/compose.yaml new file mode 100644 index 00000000..5555f32e --- /dev/null +++ b/compose.yaml @@ -0,0 +1,46 @@ +services: + nats: + image: nats:2.11 + ports: + - "4223:4222" + - "6223:6222" + - "8223:8222" + + dragonfly: + image: docker.dragonflydb.io/dragonflydb/dragonfly:latest + command: --maxmemory=4g + ports: + - "6380:6379" + ulimits: + memlock: + soft: -1 + hard: -1 + + meilisearch: + image: getmeili/meilisearch:v1.14 + ports: + - "7700:7700" + environment: + MEILI_MASTER_KEY: 'masterKey' + volumes: + - meilisearch_data:/data.ms + + db: + image: postgres:15 + ports: + - '5433:5432' + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: mysecretpassword + POSTGRES_DB: rocksky + volumes: + - pgdata:/var/lib/postgresql/data + healthcheck: + test: ['CMD', 'pg_isready'] + interval: 10s + timeout: 5s + retries: 5 + +volumes: + pgdata: + meilisearch_data: diff --git a/package.json b/package.json new file mode 100644 index 00000000..da0a225d --- /dev/null +++ b/package.json @@ -0,0 +1,19 @@ +{ + "name": "rocksky", + "private": true, + "version": "0.0.0", + "packageManager": "bun@1.2.15", + "workspaces": [ + "apps/*", + "packages/*" + ], + "scripts": { + "dev": "turbo dev", + "db:migrate": "cd apps/api && bun run db:migrate" + }, + "devDependencies": { + "biome": "^0.3.3", + "prettier": "^3.5.3", + "turbo": "^2.5.4" + } +} \ No newline at end of file diff --git a/rockskyapi/rocksky-auth/.env.example b/rockskyapi/rocksky-auth/.env.example index 06962837..4f2025fa 100644 --- a/rockskyapi/rocksky-auth/.env.example +++ b/rockskyapi/rocksky-auth/.env.example @@ -27,4 +27,6 @@ ANALYTICS_URL="http://localhost:7879" DROPBOX_REDIRECT_URI="http://localhost:8000/dropbox/oauth/callback" DROPBOX_CLIENT_ID="" DROPBOX_CLIENT_SECRET="" -GOOGLE_REDIRECT_URI="http://localhost:8000/googledrive/oauth/callback" \ No newline at end of file +GOOGLE_REDIRECT_URI="http://localhost:8000/googledrive/oauth/callback" + +POSTGTRES_URL="postgresql://postgres@localhost:5432/rocksky" \ No newline at end of file diff --git a/rockskyapi/rocksky-auth/drizzle.config.ts b/rockskyapi/rocksky-auth/drizzle.config.ts new file mode 100644 index 00000000..6363f4b3 --- /dev/null +++ b/rockskyapi/rocksky-auth/drizzle.config.ts @@ -0,0 +1,10 @@ +import "dotenv/config"; +import { defineConfig } from "drizzle-kit"; + +export default defineConfig({ + dialect: "postgresql", + schema: "./src/schema", + dbCredentials: { + url: process.env.POSTGRES_URL!, + }, +}); diff --git a/rockskyapi/rocksky-auth/package.json b/rockskyapi/rocksky-auth/package.json index cde11cd6..9c0cd600 100644 --- a/rockskyapi/rocksky-auth/package.json +++ b/rockskyapi/rocksky-auth/package.json @@ -1,87 +1,87 @@ { - "name": "rocksky-auth", - "version": "0.0.1", - "private": true, - "type": "module", - "module": "dist/index.js", - "scripts": { - "lexgen": "lex gen-server ./src/lexicon ./lexicons/**/* ./lexicons/*", - "dev": "tsx --watch ./src/index.ts", - "prod": "tsx ./src/index.ts", - "build": "pkgroll", - "sync": "tsx ./src/scripts/sync.ts", - "meili:sync": "tsx ./src/scripts/meili.ts", - "avatar": "tsx ./src/scripts/avatar.ts", - "pkl:eval": "pkl eval -f json", - "pkl:gen": "tsx ./scripts/pkl.ts", - "dev:xrpc": "tsx --watch ./src/server.ts", - "drizzle": "drizzle-kit" - }, - "dependencies": { - "@atproto/api": "^0.13.31", - "@atproto/common": "^0.4.6", - "@atproto/identity": "^0.4.5", - "@atproto/lex-cli": "^0.5.6", - "@atproto/lexicon": "^0.4.5", - "@atproto/oauth-client-node": "^0.2.14", - "@atproto/sync": "^0.1.11", - "@atproto/syntax": "^0.3.1", - "@atproto/xrpc-server": "^0.7.8", - "@hono/node-server": "^1.13.8", - "@hono/node-ws": "^1.1.0", - "@opentelemetry/api": "^1.9.0", - "@opentelemetry/auto-instrumentations-node": "^0.58.0", - "@opentelemetry/exporter-metrics-otlp-http": "^0.200.0", - "@opentelemetry/exporter-trace-otlp-http": "^0.200.0", - "@opentelemetry/resources": "^2.0.0", - "@opentelemetry/sdk-metrics": "^2.0.0", - "@opentelemetry/sdk-node": "^0.200.0", - "@opentelemetry/semantic-conventions": "^1.32.0", - "@pyroscope/nodejs": "^0.4.5", - "@xata.io/client": "^0.0.0-next.va121e4207b94bfe0a3c025fc00b247b923880930", - "assert": "^2.1.0", - "axios": "^1.7.9", - "better-sqlite3": "^11.8.1", - "chalk": "^5.4.1", - "chanfana": "^2.0.2", - "dayjs": "^1.11.13", - "dotenv": "^16.4.7", - "drizzle-orm": "^0.44.2", - "dropbox": "^10.34.0", - "effect": "^3.14.22", - "envalid": "^8.0.0", - "express": "^5.1.0", - "googleapis": "^146.0.0", - "hono": "^4.4.7", - "iron-session": "^8.0.4", - "jsonwebtoken": "^9.0.2", - "kysely": "^0.27.5", - "lodash": "^4.17.21", - "nats": "^2.29.2", - "pg": "^8.13.3", - "ramda": "^0.30.1", - "redis": "^4.7.0", - "unstorage": "^1.14.4", - "url": "^0.11.4", - "uuid": "^11.1.0", - "ws": "^8.18.1", - "zod": "^3.24.1" - }, - "devDependencies": { - "@pkl-community/pkl": "^0.28.2", - "@types/express": "^5.0.2", - "@types/lodash": "^4.17.17", - "@types/node": "^22.13.0", - "@types/ramda": "^0.30.2", - "@types/service-worker-mock": "^2.0.1", - "drizzle-kit": "^0.31.1", - "pkgroll": "^2.6.1", - "tsx": "^4.19.2", - "zx": "^8.5.4" - }, - "exports": { - ".": { - "import": "./dist/index.js" - } - } -} + "name": "rocksky-auth", + "version": "0.0.1", + "private": true, + "type": "module", + "module": "dist/index.js", + "scripts": { + "lexgen": "lex gen-server ./src/lexicon ./lexicons/**/* ./lexicons/*", + "dev": "tsx --watch ./src/index.ts", + "prod": "tsx ./src/index.ts", + "build": "pkgroll", + "sync": "tsx ./src/scripts/sync.ts", + "meili:sync": "tsx ./src/scripts/meili.ts", + "avatar": "tsx ./src/scripts/avatar.ts", + "pkl:eval": "pkl eval -f json", + "pkl:gen": "tsx ./scripts/pkl.ts", + "dev:xrpc": "tsx --watch ./src/server.ts", + "db:migrate": "drizzle-kit migrate" + }, + "dependencies": { + "@atproto/api": "^0.13.31", + "@atproto/common": "^0.4.6", + "@atproto/identity": "^0.4.5", + "@atproto/lex-cli": "^0.5.6", + "@atproto/lexicon": "^0.4.5", + "@atproto/oauth-client-node": "^0.2.14", + "@atproto/sync": "^0.1.11", + "@atproto/syntax": "^0.3.1", + "@atproto/xrpc-server": "^0.7.8", + "@hono/node-server": "^1.13.8", + "@hono/node-ws": "^1.1.0", + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/auto-instrumentations-node": "^0.58.0", + "@opentelemetry/exporter-metrics-otlp-http": "^0.200.0", + "@opentelemetry/exporter-trace-otlp-http": "^0.200.0", + "@opentelemetry/resources": "^2.0.0", + "@opentelemetry/sdk-metrics": "^2.0.0", + "@opentelemetry/sdk-node": "^0.200.0", + "@opentelemetry/semantic-conventions": "^1.32.0", + "@pyroscope/nodejs": "^0.4.5", + "@xata.io/client": "^0.0.0-next.va121e4207b94bfe0a3c025fc00b247b923880930", + "assert": "^2.1.0", + "axios": "^1.7.9", + "better-sqlite3": "^11.8.1", + "chalk": "^5.4.1", + "chanfana": "^2.0.2", + "dayjs": "^1.11.13", + "dotenv": "^16.4.7", + "drizzle-orm": "^0.44.2", + "dropbox": "^10.34.0", + "effect": "^3.14.22", + "envalid": "^8.0.0", + "express": "^5.1.0", + "googleapis": "^146.0.0", + "hono": "^4.4.7", + "iron-session": "^8.0.4", + "jsonwebtoken": "^9.0.2", + "kysely": "^0.27.5", + "lodash": "^4.17.21", + "nats": "^2.29.2", + "pg": "^8.13.3", + "ramda": "^0.30.1", + "redis": "^4.7.0", + "unstorage": "^1.14.4", + "url": "^0.11.4", + "uuid": "^11.1.0", + "ws": "^8.18.1", + "zod": "^3.24.1" + }, + "devDependencies": { + "@pkl-community/pkl": "^0.28.2", + "@types/express": "^5.0.2", + "@types/lodash": "^4.17.17", + "@types/node": "^22.13.0", + "@types/ramda": "^0.30.2", + "@types/service-worker-mock": "^2.0.1", + "drizzle-kit": "^0.31.1", + "pkgroll": "^2.6.1", + "tsx": "^4.19.2", + "zx": "^8.5.4" + }, + "exports": { + ".": { + "import": "./dist/index.js" + } + } +} \ No newline at end of file diff --git a/turbo.json b/turbo.json new file mode 100644 index 00000000..d459005b --- /dev/null +++ b/turbo.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://turbo.build/schema.json", + "tasks": { + "install": { + "dependsOn": [ + "^install" + ] + }, + "build": { + "dependsOn": [ + "^build" + ], + "outputs": [ + "./dist/**" + ] + }, + "dev": { + "persistent": true, + "cache": false + }, + "db:migrate": { + "cache": false + } + } +} \ No newline at end of file