From bc29a9f60f567957b55e3c1e3c98f0ab374bdbfe Mon Sep 17 00:00:00 2001 From: Vinlic Date: Wed, 4 Dec 2024 16:34:01 +0800 Subject: [PATCH] first commit --- .dockerignore | 9 + .github/workflows/docker-image.yml | 46 + .github/workflows/sync.yml | 48 + .gitignore | 4 + Dockerfile | 21 + LICENSE | 674 +++++++++ README.md | 317 ++++ configs/dev/service.yml | 6 + configs/dev/system.yml | 14 + doc/example-0.png | Bin 0 -> 272165 bytes libs.d.ts | 0 package.json | 50 + public/welcome.html | 10 + src/api/consts/exceptions.ts | 12 + src/api/controllers/chat.ts | 804 ++++++++++ src/api/routes/chat.ts | 37 + src/api/routes/index.ts | 27 + src/api/routes/models.ts | 21 + src/api/routes/ping.ts | 6 + src/api/routes/token.ts | 25 + src/api/routes/videos.ts | 78 + src/daemon.ts | 82 + src/index.ts | 32 + src/lib/config.ts | 14 + src/lib/configs/service-config.ts | 68 + src/lib/configs/system-config.ts | 84 ++ src/lib/consts/exceptions.ts | 5 + src/lib/environment.ts | 44 + src/lib/exceptions/APIException.ts | 14 + src/lib/exceptions/Exception.ts | 47 + src/lib/http-status-codes.ts | 61 + src/lib/initialize.ts | 28 + src/lib/interfaces/ICompletionMessage.ts | 4 + src/lib/logger.ts | 184 +++ src/lib/request/Request.ts | 72 + src/lib/response/Body.ts | 41 + src/lib/response/FailureBody.ts | 31 + src/lib/response/Response.ts | 63 + src/lib/response/SuccessfulBody.ts | 19 + src/lib/server.ts | 173 +++ src/lib/util.ts | 307 ++++ tsconfig.json | 16 + vercel.json | 27 + yarn.lock | 1742 ++++++++++++++++++++++ 44 files changed, 5367 insertions(+) create mode 100644 .dockerignore create mode 100644 .github/workflows/docker-image.yml create mode 100644 .github/workflows/sync.yml create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 LICENSE create mode 100644 README.md create mode 100644 configs/dev/service.yml create mode 100644 configs/dev/system.yml create mode 100644 doc/example-0.png create mode 100644 libs.d.ts create mode 100644 package.json create mode 100644 public/welcome.html create mode 100644 src/api/consts/exceptions.ts create mode 100644 src/api/controllers/chat.ts create mode 100644 src/api/routes/chat.ts create mode 100644 src/api/routes/index.ts create mode 100644 src/api/routes/models.ts create mode 100644 src/api/routes/ping.ts create mode 100644 src/api/routes/token.ts create mode 100644 src/api/routes/videos.ts create mode 100644 src/daemon.ts create mode 100644 src/index.ts create mode 100644 src/lib/config.ts create mode 100644 src/lib/configs/service-config.ts create mode 100644 src/lib/configs/system-config.ts create mode 100644 src/lib/consts/exceptions.ts create mode 100644 src/lib/environment.ts create mode 100644 src/lib/exceptions/APIException.ts create mode 100644 src/lib/exceptions/Exception.ts create mode 100644 src/lib/http-status-codes.ts create mode 100644 src/lib/initialize.ts create mode 100644 src/lib/interfaces/ICompletionMessage.ts create mode 100644 src/lib/logger.ts create mode 100644 src/lib/request/Request.ts create mode 100644 src/lib/response/Body.ts create mode 100644 src/lib/response/FailureBody.ts create mode 100644 src/lib/response/Response.ts create mode 100644 src/lib/response/SuccessfulBody.ts create mode 100644 src/lib/server.ts create mode 100644 src/lib/util.ts create mode 100644 tsconfig.json create mode 100644 vercel.json create mode 100644 yarn.lock diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..d525fd0 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,9 @@ +logs +dist +doc +node_modules +.vscode +.git +.gitignore +README.md +*.tar.gz \ No newline at end of file diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml new file mode 100644 index 0000000..666312f --- /dev/null +++ b/.github/workflows/docker-image.yml @@ -0,0 +1,46 @@ +name: Build and Push Docker Image + +on: + release: + types: [created] + workflow_dispatch: + inputs: + tag: + description: 'Tag Name' + required: true + +jobs: + build-and-push: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + + - name: Login to Docker Hub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_PASSWORD }} + + - name: Set tag name + id: tag_name + run: | + if [ "${{ github.event_name }}" = "release" ]; then + echo "::set-output name=tag::${GITHUB_REF#refs/tags/}" + elif [ "${{ github.event_name }}" = "workflow_dispatch" ]; then + echo "::set-output name=tag::${{ github.event.inputs.tag }}" + fi + + - name: Build and push Docker image with Release tag + uses: docker/build-push-action@v2 + with: + context: . + file: ./Dockerfile + push: true + tags: | + vinlic/doubao-free-api:${{ steps.tag_name.outputs.tag }} + vinlic/doubao-free-api:latest + platforms: linux/amd64,linux/arm64 + build-args: TARGETPLATFORM=${{ matrix.platform }} diff --git a/.github/workflows/sync.yml b/.github/workflows/sync.yml new file mode 100644 index 0000000..fbe2e55 --- /dev/null +++ b/.github/workflows/sync.yml @@ -0,0 +1,48 @@ +name: Upstream Sync + +permissions: + contents: write + issues: write + actions: write + +on: + schedule: + - cron: '0 * * * *' # every hour + workflow_dispatch: + +jobs: + sync_latest_from_upstream: + name: Sync latest commits from upstream repo + runs-on: ubuntu-latest + if: ${{ github.event.repository.fork }} + + steps: + - uses: actions/checkout@v4 + + - name: Clean issue notice + uses: actions-cool/issues-helper@v3 + with: + actions: 'close-issues' + labels: '🚨 Sync Fail' + + - name: Sync upstream changes + id: sync + uses: aormsby/Fork-Sync-With-Upstream-action@v3.4 + with: + upstream_sync_repo: LLM-Red-Team/doubao-free-api + upstream_sync_branch: master + target_sync_branch: master + target_repo_token: ${{ secrets.GITHUB_TOKEN }} # automatically generated, no need to set + test_mode: false + + - name: Sync check + if: failure() + uses: actions-cool/issues-helper@v3 + with: + actions: 'create-issue' + title: '🚨 同步失败 | Sync Fail' + labels: '🚨 Sync Fail' + body: | + Due to a change in the workflow file of the LLM-Red-Team/doubao-free-api upstream repository, GitHub has automatically suspended the scheduled automatic update. You need to manually sync your fork. Please refer to the detailed [Tutorial][tutorial-en-US] for instructions. + + 由于 LLM-Red-Team/doubao-free-api 上游仓库的 workflow 文件变更,导致 GitHub 自动暂停了本次自动更新,你需要手动 Sync Fork 一次, \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ada3e92 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +dist/ +node_modules/ +logs/ +.vercel diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..e2cfce5 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,21 @@ +FROM node:lts AS BUILD_IMAGE + +WORKDIR /app + +COPY . /app + +RUN yarn install --registry https://registry.npmmirror.com/ --ignore-engines && yarn run build + +FROM node:lts-alpine + +COPY --from=BUILD_IMAGE /app/configs /app/configs +COPY --from=BUILD_IMAGE /app/package.json /app/package.json +COPY --from=BUILD_IMAGE /app/dist /app/dist +COPY --from=BUILD_IMAGE /app/public /app/public +COPY --from=BUILD_IMAGE /app/node_modules /app/node_modules + +WORKDIR /app + +EXPOSE 8000 + +CMD ["npm", "start"] \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..54ab311 --- /dev/null +++ b/README.md @@ -0,0 +1,317 @@ +# Doubao AI Free 服务 + +[![](https://img.shields.io/github/license/llm-red-team/doubao-free-api.svg)](LICENSE) +![](https://img.shields.io/github/stars/llm-red-team/doubao-free-api.svg) +![](https://img.shields.io/github/forks/llm-red-team/doubao-free-api.svg) +![](https://img.shields.io/docker/pulls/vinlic/doubao-free-api.svg) + +支持高速流式输出、支持多轮对话、支持联网搜索、支持智能体对话(计划支持)、支持AI绘图(计划支持)、支持长文档解读(计划支持)、支持图像解析(计划支持),零配置部署,多路token支持,自动清理会话痕迹。 + +与ChatGPT接口完全兼容。 + +还有以下九个free-api欢迎关注: + +Moonshot AI(Kimi.ai)接口转API [kimi-free-api](https://github.com/LLM-Red-Team/kimi-free-api) + +阶跃星辰 (跃问StepChat) 接口转API [step-free-api](https://github.com/LLM-Red-Team/step-free-api) + +阿里通义 (Qwen) 接口转API [qwen-free-api](https://github.com/LLM-Red-Team/qwen-free-api) + +智谱AI (智谱清言) 接口转API [glm-free-api](https://github.com/LLM-Red-Team/glm-free-api) + +秘塔AI (Metaso) 接口转API [metaso-free-api](https://github.com/LLM-Red-Team/metaso-free-api) + +讯飞星火(Spark)接口转API [spark-free-api](https://github.com/LLM-Red-Team/spark-free-api) + +MiniMax(海螺AI)接口转API [hailuo-free-api](https://github.com/LLM-Red-Team/hailuo-free-api) + +深度求索(DeepSeek)接口转API [deepseek-free-api](https://github.com/LLM-Red-Team/deepseek-free-api) + +聆心智能 (Emohaa) 接口转API [emohaa-free-api](https://github.com/LLM-Red-Team/emohaa-free-api) + +## 目录 + +* [免责声明](#免责声明) +* [接入准备](#接入准备) + * [智能体接入](#智能体接入) + * [多账号接入](#多账号接入) +* [Docker部署](#Docker部署) + * [Docker-compose部署](#Docker-compose部署) +* [Render部署](#Render部署) +* [Vercel部署](#Vercel部署) +* [原生部署](#原生部署) +* [推荐使用客户端](#推荐使用客户端) +* [接口列表](#接口列表) + * [对话补全](#对话补全) + * [视频生成](#视频生成) + * [AI绘图](#AI绘图) + * [文档解读](#文档解读) + * [图像解析](#图像解析) + * [sessionid存活检测](#sessionid存活检测) +* [注意事项](#注意事项) + * [Nginx反代优化](#Nginx反代优化) + * [Token统计](#Token统计) +* [Star History](#star-history) + +## 免责声明 + +**逆向API是不稳定的,建议前往火山引擎官方 https://www.volcengine.com/product/doubao 付费使用API,避免封禁的风险。** + +**本组织和个人不接受任何资金捐助和交易,此项目是纯粹研究交流学习性质!** + +**仅限自用,禁止对外提供服务或商用,避免对官方造成服务压力,否则风险自担!** + +**仅限自用,禁止对外提供服务或商用,避免对官方造成服务压力,否则风险自担!** + +**仅限自用,禁止对外提供服务或商用,避免对官方造成服务压力,否则风险自担!** + +## 接入准备 + +从 [豆包](https://www.doubao.com/) 获取sessionid + +进入豆包登录账号,然后F12打开开发者工具,从Application > Cookies中找到`sessionid`的值,这将作为Authorization的Bearer Token值:`Authorization: Bearer sessionid` + +![example0](./doc/example-0.png) + +### 多账号接入 + +你可以通过提供多个账号的sessionid并使用`,`拼接提供: + +`Authorization: Bearer sessionid1,sessionid2,sessionid3` + +每次请求服务会从中挑选一个。 + +## Docker部署 + +请准备一台具有公网IP的服务器并将8000端口开放。 + +拉取镜像并启动服务 + +```shell +docker run -it -d --init --name doubao-free-api -p 8000:8000 -e TZ=Asia/Shanghai vinlic/doubao-free-api:latest +``` + +查看服务实时日志 + +```shell +docker logs -f doubao-free-api +``` + +重启服务 + +```shell +docker restart doubao-free-api +``` + +停止服务 + +```shell +docker stop doubao-free-api +``` + +### Docker-compose部署 + +```yaml +version: '3' + +services: + doubao-free-api: + container_name: doubao-free-api + image: vinlic/doubao-free-api:latest + restart: always + ports: + - "8000:8000" + environment: + - TZ=Asia/Shanghai +``` + +### Render部署 + +**注意:部分部署区域可能无法连接豆包,如容器日志出现请求超时或无法连接,请切换其他区域部署!** +**注意:免费账户的容器实例将在一段时间不活动时自动停止运行,这会导致下次请求时遇到50秒或更长的延迟,建议查看[Render容器保活](https://github.com/LLM-Red-Team/free-api-hub/#Render%E5%AE%B9%E5%99%A8%E4%BF%9D%E6%B4%BB)** + +1. fork本项目到你的github账号下。 + +2. 访问 [Render](https://dashboard.render.com/) 并登录你的github账号。 + +3. 构建你的 Web Service(New+ -> Build and deploy from a Git repository -> Connect你fork的项目 -> 选择部署区域 -> 选择实例类型为Free -> Create Web Service)。 + +4. 等待构建完成后,复制分配的域名并拼接URL访问即可。 + +### Vercel部署 + +**注意:Vercel免费账户的请求响应超时时间为10秒,但接口响应通常较久,可能会遇到Vercel返回的504超时错误!** + +请先确保安装了Node.js环境。 + +```shell +npm i -g vercel --registry http://registry.npmmirror.com +vercel login +git clone https://github.com/LLM-Red-Team/doubao-free-api +cd doubao-free-api +vercel --prod +``` + +## 原生部署 + +请准备一台具有公网IP的服务器并将8000端口开放。 + +请先安装好Node.js环境并且配置好环境变量,确认node命令可用。 + +安装依赖 + +```shell +npm i +``` + +安装PM2进行进程守护 + +```shell +npm i -g pm2 +``` + +编译构建,看到dist目录就是构建完成 + +```shell +npm run build +``` + +启动服务 + +```shell +pm2 start dist/index.js --name "doubao-free-api" +``` + +查看服务实时日志 + +```shell +pm2 logs doubao-free-api +``` + +重启服务 + +```shell +pm2 reload doubao-free-api +``` + +停止服务 + +```shell +pm2 stop doubao-free-api +``` + +## 推荐使用客户端 + +使用以下二次开发客户端接入free-api系列项目更快更简单,支持文档/图像上传! + +由 [Clivia](https://github.com/Yanyutin753/lobe-chat) 二次开发的LobeChat [https://github.com/Yanyutin753/lobe-chat](https://github.com/Yanyutin753/lobe-chat) + +由 [时光@](https://github.com/SuYxh) 二次开发的ChatGPT Web [https://github.com/SuYxh/chatgpt-web-sea](https://github.com/SuYxh/chatgpt-web-sea) + +## 接口列表 + +目前支持与openai兼容的 `/v1/chat/completions` 接口,可自行使用与openai或其他兼容的客户端接入接口,或者使用 [dify](https://dify.ai/) 等线上服务接入使用。 + +### 对话补全 + +对话补全接口,与openai的 [chat-completions-api](https://platform.openai.com/docs/guides/text-generation/chat-completions-api) 兼容。 + +**POST /v1/chat/completions** + +header 需要设置 Authorization 头部: + +``` +Authorization: Bearer [sessionid] +``` + +请求数据: +```json +{ + // 固定使用doubao + "model": "doubao", + // 目前多轮对话基于消息合并实现,某些场景可能导致能力下降且受单轮最大token数限制 + // 如果您想获得原生的多轮对话体验,可以传入首轮消息获得的id,来接续上下文 + // "conversation_id": "397193850580994", + "messages": [ + { + "role": "user", + "content": "你叫什么?" + } + ], + // 如果使用SSE流请设置为true,默认false + "stream": false +} +``` + +响应数据: +```json +{ + // 如果想获得原生多轮对话体验,此id,你可以传入到下一轮对话的conversation_id来接续上下文 + "id": "397193850645250", + "model": "doubao", + "object": "chat.completion", + "choices": [ + { + "index": 0, + "message": { + "role": "assistant", + "content": "我叫豆包呀,能陪你聊天、帮你答疑解惑呢。" + }, + "finish_reason": "stop" + } + ], + "usage": { + "prompt_tokens": 1, + "completion_tokens": 1, + "total_tokens": 2 + }, + "created": 1733300587 +} +``` + +### sessionid存活检测 + +检测sessionid是否存活,如果存活live未true,否则为false,请不要频繁(小于10分钟)调用此接口。 + +**POST /token/check** + +请求数据: +```json +{ + "token": "6750e5af32eb15976..." +} +``` + +响应数据: +```json +{ + "live": true +} +``` + +## 注意事项 + +### Nginx反代优化 + +如果您正在使用Nginx反向代理doubao-free-api,请添加以下配置项优化流的输出效果,优化体验感。 + +```nginx +# 关闭代理缓冲。当设置为off时,Nginx会立即将客户端请求发送到后端服务器,并立即将从后端服务器接收到的响应发送回客户端。 +proxy_buffering off; +# 启用分块传输编码。分块传输编码允许服务器为动态生成的内容分块发送数据,而不需要预先知道内容的大小。 +chunked_transfer_encoding on; +# 开启TCP_NOPUSH,这告诉Nginx在数据包发送到客户端之前,尽可能地发送数据。这通常在sendfile使用时配合使用,可以提高网络效率。 +tcp_nopush on; +# 开启TCP_NODELAY,这告诉Nginx不延迟发送数据,立即发送小数据包。在某些情况下,这可以减少网络的延迟。 +tcp_nodelay on; +# 设置保持连接的超时时间,这里设置为120秒。如果在这段时间内,客户端和服务器之间没有进一步的通信,连接将被关闭。 +keepalive_timeout 120; +``` + +### Token统计 + +由于推理侧不在doubao-free-api,因此token不可统计,将以固定数字返回。 + +## Star History + +[![Star History Chart](https://api.star-history.com/svg?repos=LLM-Red-Team/doubao-free-api&type=Date)](https://star-history.com/#LLM-Red-Team/doubao-free-api&Date) diff --git a/configs/dev/service.yml b/configs/dev/service.yml new file mode 100644 index 0000000..9ccde9c --- /dev/null +++ b/configs/dev/service.yml @@ -0,0 +1,6 @@ +# 服务名称 +name: doubao-free-api +# 服务绑定主机地址 +host: '0.0.0.0' +# 服务绑定端口 +port: 8000 \ No newline at end of file diff --git a/configs/dev/system.yml b/configs/dev/system.yml new file mode 100644 index 0000000..dca6170 --- /dev/null +++ b/configs/dev/system.yml @@ -0,0 +1,14 @@ +# 是否开启请求日志 +requestLog: true +# 临时目录路径 +tmpDir: ./tmp +# 日志目录路径 +logDir: ./logs +# 日志写入间隔(毫秒) +logWriteInterval: 200 +# 日志文件有效期(毫秒) +logFileExpires: 2626560000 +# 公共目录路径 +publicDir: ./public +# 临时文件有效期(毫秒) +tmpFileExpires: 86400000 \ No newline at end of file diff --git a/doc/example-0.png b/doc/example-0.png new file mode 100644 index 0000000000000000000000000000000000000000..1c95503da6c7e7a48dc0cb3145f8bd5e5e7e0cfa GIT binary patch literal 272165 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%0Des(|*2CM*otB0=#8|H|jCDv{alz_kn^O>ErnA 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 + + + + 🚀 服务已启动 + + +

doubao-free-api已启动!
请通过LobeChat / NextChat / Dify等客户端或OpenAI SDK接入!

+ + \ No newline at end of file diff --git a/src/api/consts/exceptions.ts b/src/api/consts/exceptions.ts new file mode 100644 index 0000000..a1801d1 --- /dev/null +++ b/src/api/consts/exceptions.ts @@ -0,0 +1,12 @@ +export default { + API_TEST: [-9999, 'API异常错误'], + API_REQUEST_PARAMS_INVALID: [-2000, '请求参数非法'], + API_REQUEST_FAILED: [-2001, '请求失败'], + API_TOKEN_EXPIRES: [-2002, 'Token已失效'], + API_FILE_URL_INVALID: [-2003, '远程文件URL非法'], + API_FILE_EXECEEDS_SIZE: [-2004, '远程文件超出大小'], + API_CHAT_STREAM_PUSHING: [-2005, '已有对话流正在输出'], + API_CONTENT_FILTERED: [-2006, '内容由于合规问题已被阻止生成'], + API_IMAGE_GENERATION_FAILED: [-2007, '图像生成失败'], + API_VIDEO_GENERATION_FAILED: [-2008, '视频生成失败'], +} \ No newline at end of file diff --git a/src/api/controllers/chat.ts b/src/api/controllers/chat.ts new file mode 100644 index 0000000..ca96255 --- /dev/null +++ b/src/api/controllers/chat.ts @@ -0,0 +1,804 @@ +import { PassThrough } from "stream"; +import path from "path"; +import _ from "lodash"; +import mime from "mime"; +import FormData from "form-data"; +import axios, { AxiosRequestConfig, AxiosResponse } from "axios"; + +import APIException from "@/lib/exceptions/APIException.ts"; +import EX from "@/api/consts/exceptions.ts"; +import { createParser } from "eventsource-parser"; +import logger from "@/lib/logger.ts"; +import util from "@/lib/util.ts"; + +// 模型名称 +const MODEL_NAME = "doubao"; +// 默认的AgentID +const DEFAULT_ASSISTANT_ID = "497858"; +// 版本号 +const VERSION_CODE = "20800"; +// 设备ID +const DEVICE_ID = Math.random() * 999999999999999999 + 7000000000000000000; +// WebID +const WEB_ID = Math.random() * 999999999999999999 + 7000000000000000000; +// 用户ID +const USER_ID = util.uuid(false); +// 最大重试次数 +const MAX_RETRY_COUNT = 3; +// 重试延迟 +const RETRY_DELAY = 5000; +// 伪装headers +const FAKE_HEADERS = { + Accept: "*/*", + "Accept-Encoding": "gzip, deflate, br, zstd", + "Accept-language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7", + "Cache-control": "no-cache", + "Last-event-id": "undefined", + Origin: "https://www.doubao.com", + Pragma: "no-cache", + Priority: "u=1, i", + Referer: "https://www.doubao.com", + "Sec-Ch-Ua": '"Google Chrome";v="131", "Chromium";v="131", "Not_A Brand";v="24"', + "Sec-Ch-Ua-Mobile": "?0", + "Sec-Ch-Ua-Platform": '"Windows"', + "Sec-Fetch-Dest": "empty", + "Sec-Fetch-Mode": "cors", + "Sec-Fetch-Site": "same-origin", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36" +}; +// 文件最大大小 +const FILE_MAX_SIZE = 100 * 1024 * 1024; + +/** + * 获取缓存中的access_token + * + * 目前doubao的access_token是固定的,暂无刷新功能 + * + * @param refreshToken 用于刷新access_token的refresh_token + */ +async function acquireToken(refreshToken: string): Promise { + return refreshToken; +} + +/** + * 生成伪msToken + */ +function generateFakeMsToken() { + const bytes = new Uint8Array(96); // 96 bytes = 128 base64 chars + crypto.getRandomValues(bytes); + return btoa(String.fromCharCode(...bytes)) + .replace(/\+/g, '-') // Convert + to - + .replace(/\//g, '_') // Convert / to _ + .replace(/=/g, ''); // Remove padding +} + +/** + * 生成伪a_bogus + */ +function generateFakeABogus() { + return `mf-${util.generateRandomString({ + length: 34, + })}-${util.generateRandomString({ + length: 6, + })}`; +} + +/** + * 生成cookie + */ +function generateCookie(refreshToken: string, msToken: string) { + return [ + `is_staff_user=false`, + `store-region=cn-gd`, + `store-region-src=uid`, + `sid_guard=${refreshToken}%7C${util.unixTimestamp()}%7C5184000%7CSun%2C+02-Feb-2025+04%3A17%3A20+GMT`, + `uid_tt=${USER_ID}`, + `uid_tt_ss=${USER_ID}`, + `sid_tt=${refreshToken}`, + `sessionid=${refreshToken}`, + `sessionid_ss=${refreshToken}`, + `msToken=${msToken}`, + ].join("; "); +} + +/** + * 请求doubao + * + * @param method 请求方法 + * @param uri 请求路径 + * @param params 请求参数 + * @param headers 请求头 + */ +async function request(method: string, uri: string, refreshToken: string, options: AxiosRequestConfig = {}) { + const token = await acquireToken(refreshToken); + const msToken = generateFakeMsToken(); + const response = await axios.request({ + method, + url: `https://www.doubao.com${uri}`, + params: { + aid: DEFAULT_ASSISTANT_ID, + device_id: DEVICE_ID, + device_platform: "web", + language: "zh", + pkg_type: "release_version", + real_aid: DEFAULT_ASSISTANT_ID, + region: "CN", + samantha_web: 1, + sys_region: "CN", + tea_uuid: WEB_ID, + use_olympus_account: 1, + version_code: VERSION_CODE, + web_id: WEB_ID, + msToken: msToken, + a_bogus: generateFakeABogus(), + ...(options.params || {}) + }, + headers: { + ...FAKE_HEADERS, + Cookie: generateCookie(token, msToken), + "X-Flow-Trace": `04-${util.uuid()}-${util.uuid().substring(0, 16)}-01`, + ...(options.headers || {}), + }, + timeout: 15000, + validateStatus: () => true, + ..._.omit(options, "params", "headers"), + }); + // 流式响应直接返回response + if (options.responseType == "stream") + return response; + return checkResult(response); +} + +/** + * 移除会话 + * + * 在对话流传输完毕后移除会话,避免创建的会话出现在用户的对话列表中 + * + * @param refreshToken 用于刷新access_token的refresh_token + */ +async function removeConversation( + convId: string, + refreshToken: string +) { + await request("post", "/samantha/thread/delete", refreshToken, { + data: { + conversation_id: convId + } + }); +} + +/** + * 同步对话补全 + * + * @param messages 参考gpt系列消息格式,多轮对话请完整提供上下文 + * @param refreshToken 用于刷新access_token的refresh_token + * @param assistantId 智能体ID,默认使用Doubao原版 + * @param retryCount 重试次数 + */ +async function createCompletion( + messages: any[], + refreshToken: string, + assistantId = DEFAULT_ASSISTANT_ID, + refConvId = "", + retryCount = 0 +) { + return (async () => { + logger.info(messages); + + // 提取引用文件URL并上传获得引用的文件ID列表 + const refFileUrls = extractRefFileUrls(messages); + const refs = refFileUrls.length + ? await Promise.all( + refFileUrls.map((fileUrl) => uploadFile(fileUrl, refreshToken)) + ) + : []; + + // 如果引用对话ID不正确则重置引用 + if (!/[0-9a-zA-Z]{24}/.test(refConvId)) refConvId = ""; + + // 请求流 + const response = await request("post", "/samantha/chat/completion", refreshToken, { + data: { + messages: messagesPrepare(messages, refs, !!refConvId), + completion_option: { + is_regen: false, + with_suggest: true, + need_create_conversation: true, + launch_stage: 1, + is_replace: false, + is_delete: false, + message_from: 0, + event_id: "0" + }, + conversation_id: "0", + local_conversation_id: `local_16${util.generateRandomString({ length: 14, charset: "numeric" })}`, + local_message_id: util.uuid() + }, + headers: { + Referer: "https://www.doubao.com/chat/", + "Agw-js-conv": "str", + }, + // 300秒超时 + timeout: 300000, + responseType: "stream" + }); + if (response.headers["content-type"].indexOf("text/event-stream") == -1) { + response.data.on("data", (buffer) => logger.error(buffer.toString())); + throw new APIException( + EX.API_REQUEST_FAILED, + `Stream response Content-Type invalid: ${response.headers["content-type"]}` + ); + } + + const streamStartTime = util.timestamp(); + // 接收流为输出文本 + const answer = await receiveStream(response.data); + logger.success( + `Stream has completed transfer ${util.timestamp() - streamStartTime}ms` + ); + + // 异步移除会话 + removeConversation(answer.id, refreshToken).catch( + (err) => !refConvId && console.error('移除会话失败:', err) + ); + + return answer; + })().catch((err) => { + if (retryCount < MAX_RETRY_COUNT) { + logger.error(`Stream response error: ${err.stack}`); + logger.warn(`Try again after ${RETRY_DELAY / 1000}s...`); + return (async () => { + await new Promise((resolve) => setTimeout(resolve, RETRY_DELAY)); + return createCompletion( + messages, + refreshToken, + assistantId, + refConvId, + retryCount + 1 + ); + })(); + } + throw err; + }); +} + +/** + * 流式对话补全 + * + * @param messages 参考gpt系列消息格式,多轮对话请完整提供上下文 + * @param refreshToken 用于刷新access_token的refresh_token + * @param assistantId 智能体ID,默认使用Doubao原版 + * @param retryCount 重试次数 + */ +async function createCompletionStream( + messages: any[], + refreshToken: string, + assistantId = DEFAULT_ASSISTANT_ID, + refConvId = "", + retryCount = 0 +) { + return (async () => { + logger.info(messages); + + // 提取引用文件URL并上传获得引用的文件ID列表 + const refFileUrls = extractRefFileUrls(messages); + const refs = refFileUrls.length + ? await Promise.all( + refFileUrls.map((fileUrl) => uploadFile(fileUrl, refreshToken)) + ) + : []; + + // 如果引用对话ID不正确则重置引用 + if (!/[0-9a-zA-Z]{24}/.test(refConvId)) refConvId = ""; + + // 请求流 + const response = await request("post", "/samantha/chat/completion", refreshToken, { + data: { + messages: messagesPrepare(messages, refs, !!refConvId), + completion_option: { + is_regen: false, + with_suggest: true, + need_create_conversation: true, + launch_stage: 1, + is_replace: false, + is_delete: false, + message_from: 0, + event_id: "0" + }, + conversation_id: "0", + local_conversation_id: `local_16${util.generateRandomString({ length: 14, charset: "numeric" })}`, + local_message_id: util.uuid() + }, + headers: { + Referer: "https://www.doubao.com/chat/", + "Agw-js-conv": "str", + }, + // 300秒超时 + timeout: 300000, + responseType: "stream" + }); + + if (response.headers["content-type"].indexOf("text/event-stream") == -1) { + logger.error( + `Invalid response Content-Type:`, + response.headers["content-type"] + ); + response.data.on("data", (buffer) => logger.error(buffer.toString())); + const transStream = new PassThrough(); + transStream.end( + `data: ${JSON.stringify({ + id: "", + model: MODEL_NAME, + object: "chat.completion.chunk", + choices: [ + { + index: 0, + delta: { + role: "assistant", + content: "服务暂时不可用,第三方响应错误", + }, + finish_reason: "stop", + }, + ], + usage: { prompt_tokens: 1, completion_tokens: 1, total_tokens: 2 }, + created: util.unixTimestamp(), + })}\n\n` + ); + return transStream; + } + + const streamStartTime = util.timestamp(); + // 创建转换流将消息格式转换为gpt兼容格式 + return createTransStream(response.data, (convId: string) => { + logger.success( + `Stream has completed transfer ${util.timestamp() - streamStartTime}ms` + ); + // 流传输结束后异步移除会话 + removeConversation(convId, refreshToken).catch( + (err) => !refConvId && console.error(err) + ); + }); + })().catch((err) => { + if (retryCount < MAX_RETRY_COUNT) { + logger.error(`Stream response error: ${err.stack}`); + logger.warn(`Try again after ${RETRY_DELAY / 1000}s...`); + return (async () => { + await new Promise((resolve) => setTimeout(resolve, RETRY_DELAY)); + return createCompletionStream( + messages, + refreshToken, + assistantId, + refConvId, + retryCount + 1 + ); + })(); + } + throw err; + }); +} + +/** + * 提取消息中引用的文件URL + * + * @param messages 参考gpt系列消息格式,多轮对话请完整提供上下文 + */ +function extractRefFileUrls(messages: any[]) { + const urls = []; + // 如果没有消息,则返回[] + if (!messages.length) { + return urls; + } + // 只获取最新的消息 + const lastMessage = messages[messages.length - 1]; + if (_.isArray(lastMessage.content)) { + lastMessage.content.forEach((v) => { + if (!_.isObject(v) || !["file", "image_url"].includes(v["type"])) return; + // doubao-free-api支持格式 + if ( + v["type"] == "file" && + _.isObject(v["file_url"]) && + _.isString(v["file_url"]["url"]) + ) + urls.push(v["file_url"]["url"]); + // 兼容gpt-4-vision-preview API格式 + else if ( + v["type"] == "image_url" && + _.isObject(v["image_url"]) && + _.isString(v["image_url"]["url"]) + ) + urls.push(v["image_url"]["url"]); + }); + } + logger.info("本次请求上传:" + urls.length + "个文件"); + return urls; +} + +/** + * 消息预处理 + * + * 由于接口只取第一条消息,此处会将多条消息合并为一条,实现多轮对话效果 + * + * @param messages 参考gpt系列消息格式,多轮对话请完整提供上下文 + * @param refs 参考文件列表 + * @param isRefConv 是否为引用会话 + */ +function messagesPrepare(messages: any[], refs: any[], isRefConv = false) { + let content; + if (isRefConv || messages.length < 2) { + content = messages.reduce((content, message) => { + if (_.isArray(message.content)) { + return message.content.reduce((_content, v) => { + if (!_.isObject(v) || v["type"] != "text") return _content; + return _content + (v["text"] || "") + "\n"; + }, content); + } + return content + `${message.content}\n`; + }, ""); + logger.info("\n透传内容:\n" + content); + } else { + // 检查最新消息是否含有"type": "image_url"或"type": "file",如果有则注入消息 + let latestMessage = messages[messages.length - 1]; + let hasFileOrImage = + Array.isArray(latestMessage.content) && + latestMessage.content.some( + (v) => + typeof v === "object" && ["file", "image_url"].includes(v["type"]) + ); + if (hasFileOrImage) { + let newFileMessage = { + content: "关注用户最新发送文件和消息", + role: "system", + }; + messages.splice(messages.length - 1, 0, newFileMessage); + logger.info("注入提升尾部文件注意力system prompt"); + } else { + // 由于注入会导致设定污染,暂时注释 + // let newTextMessage = { + // content: "关注用户最新的消息", + // role: "system", + // }; + // messages.splice(messages.length - 1, 0, newTextMessage); + // logger.info("注入提升尾部消息注意力system prompt"); + } + content = ( + messages.reduce((content, message) => { + const role = message.role + .replace("system", "<|im_start|>system") + .replace("assistant", "<|im_start|>assistant") + .replace("user", "<|im_start|>user"); + if (_.isArray(message.content)) { + return message.content.reduce((_content, v) => { + if (!_.isObject(v) || v["type"] != "text") return _content; + return _content + (`${role}\n` + v["text"] || "") + "\n"; + }, content); + } + return (content += `${role}\n${message.content}\n`) + '<|im_end|>\n'; + }, "") + ) + // 移除MD图像URL避免幻觉 + .replace(/\!\[.+\]\(.+\)/g, "") + // 移除临时路径避免在新会话引发幻觉 + .replace(/\/mnt\/data\/.+/g, ""); + logger.info("\n对话合并:\n" + content); + } + + const fileRefs = refs.filter((ref) => !ref.width && !ref.height); + const imageRefs = refs + .filter((ref) => ref.width || ref.height) + .map((ref) => { + ref.image_url = ref.file_url; + return ref; + }); + return [ + { + content: JSON.stringify({ text: content }), + content_type: 2001, + attachments: [], + references: [], + }, + ]; +} + +/** + * 预检查文件URL有效性 + * + * @param fileUrl 文件URL + */ +async function checkFileUrl(fileUrl: string) { + if (util.isBASE64Data(fileUrl)) return; + const result = await axios.head(fileUrl, { + timeout: 15000, + validateStatus: () => true, + }); + if (result.status >= 400) + throw new APIException( + EX.API_FILE_URL_INVALID, + `File ${fileUrl} is not valid: [${result.status}] ${result.statusText}` + ); + // 检查文件大小 + if (result.headers && result.headers["content-length"]) { + const fileSize = parseInt(result.headers["content-length"], 10); + if (fileSize > FILE_MAX_SIZE) + throw new APIException( + EX.API_FILE_EXECEEDS_SIZE, + `File ${fileUrl} is not valid` + ); + } +} + +/** + * 上传文件 + * + * @param fileUrl 文件URL + * @param refreshToken 用于刷新access_token的refresh_token + * @param isVideoImage 是否是用于视频图像 + */ +async function uploadFile( + fileUrl: string, + refreshToken: string, + isVideoImage: boolean = false +) { + // 预检查远程文件URL可用性 + await checkFileUrl(fileUrl); + + let filename, fileData, mimeType; + // 如果是BASE64数据则直接转换为Buffer + if (util.isBASE64Data(fileUrl)) { + mimeType = util.extractBASE64DataFormat(fileUrl); + const ext = mime.getExtension(mimeType); + filename = `${util.uuid()}.${ext}`; + fileData = Buffer.from(util.removeBASE64DataHeader(fileUrl), "base64"); + } + // 下载文件到内存,如果您的服务器内存很小,建议考虑改造为流直传到下一个接口上,避免停留占用内存 + else { + filename = path.basename(fileUrl); + ({ data: fileData } = await axios.get(fileUrl, { + responseType: "arraybuffer", + // 100M限制 + maxContentLength: FILE_MAX_SIZE, + // 60秒超时 + timeout: 60000, + })); + } + + // 获取文件的MIME类型 + mimeType = mimeType || mime.getType(filename); + + + // 待开发 +} + +/** + * 检查请求结果 + * + * @param result 结果 + */ +function checkResult(result: AxiosResponse) { + if (!result.data) return null; + const { code, msg, data } = result.data; + if (!_.isFinite(code)) return result.data; + if (code === 0) return data; + throw new APIException(EX.API_REQUEST_FAILED, `[请求doubao失败]: ${msg}`); +} + +/** + * 从流接收完整的消息内容 + * + * @param stream 消息流 + */ +async function receiveStream(stream: any): Promise { + return new Promise((resolve, reject) => { + // 消息初始化 + const data = { + id: "", + model: MODEL_NAME, + object: "chat.completion", + choices: [ + { + index: 0, + message: { role: "assistant", content: "" }, + finish_reason: "stop", + }, + ], + usage: { prompt_tokens: 1, completion_tokens: 1, total_tokens: 2 }, + created: util.unixTimestamp(), + }; + let isEnd = false; + const parser = createParser((event) => { + try { + if (event.type !== "event" || isEnd) return; + // 解析JSON + const rawResult = _.attempt(() => JSON.parse(event.data)); + if (_.isError(rawResult)) + throw new Error(`Stream response invalid: ${event.data}`); + // console.log(rawResult); + if (rawResult.code) + throw new APIException(EX.API_REQUEST_FAILED, `[请求doubao失败]: ${rawResult.code}-${rawResult.message}`); + if (rawResult.event_type == 2003) { + isEnd = true; + data.choices[0].message.content = data.choices[0].message.content.replace(/\n$/, ""); + return resolve(data); + } + if (rawResult.event_type != 2001) + return; + const result = _.attempt(() => JSON.parse(rawResult.event_data)); + if (_.isError(result)) + throw new Error(`Stream response invalid: ${rawResult.event_data}`); + if (result.is_finish) { + isEnd = true; + data.choices[0].message.content = data.choices[0].message.content.replace(/\n$/, ""); + return resolve(data); + } + if (!data.id && result.conversation_id) + data.id = result.conversation_id; + const message = result.message; + if (!message || ![2001, 2008].includes(message.content_type)) + return; + const content = JSON.parse(message.content); + if (content.text) + data.choices[0].message.content += content.text; + } catch (err) { + logger.error(err); + reject(err); + } + }); + // 将流数据喂给SSE转换器 + stream.on("data", (buffer) => parser.feed(buffer.toString())); + stream.once("error", (err) => reject(err)); + stream.once("close", () => resolve(data)); + }); +} + +/** + * 创建转换流 + * + * 将流格式转换为gpt兼容流格式 + * + * @param stream 消息流 + * @param endCallback 传输结束回调 + */ +function createTransStream(stream: any, endCallback?: Function) { + let isEnd = false; + let convId = ""; + // 消息创建时间 + const created = util.unixTimestamp(); + // 创建转换流 + const transStream = new PassThrough(); + !transStream.closed && + transStream.write( + `data: ${JSON.stringify({ + id: convId, + model: MODEL_NAME, + object: "chat.completion.chunk", + choices: [ + { + index: 0, + delta: { role: "assistant", content: "" }, + finish_reason: null, + }, + ], + created, + })}\n\n` + ); + const parser = createParser((event) => { + try { + if (event.type !== "event") return; + // 解析JSON + const rawResult = _.attempt(() => JSON.parse(event.data)); + if (_.isError(rawResult)) + throw new Error(`Stream response invalid: ${event.data}`); + // console.log(rawResult); + if (rawResult.code) + throw new APIException(EX.API_REQUEST_FAILED, `[请求doubao失败]: ${rawResult.code}-${rawResult.message}`); + if (rawResult.event_type == 2003) { + isEnd = true; + transStream.write(`data: ${JSON.stringify({ + id: convId, + model: MODEL_NAME, + object: "chat.completion.chunk", + choices: [ + { + index: 0, + delta: { role: "assistant", content: "" }, + finish_reason: "stop" + }, + ], + created, + })}\n\n`); + !transStream.closed && transStream.end("data: [DONE]\n\n"); + endCallback && endCallback(); + return; + } + if (rawResult.event_type != 2001) + return; + const result = _.attempt(() => JSON.parse(rawResult.event_data)); + if (_.isError(result)) + throw new Error(`Stream response invalid: ${rawResult.event_data}`); + if (!convId) + convId = result.conversation_id; + if (result.is_finish) { + isEnd = true; + transStream.write(`data: ${JSON.stringify({ + id: convId, + model: MODEL_NAME, + object: "chat.completion.chunk", + choices: [ + { + index: 0, + delta: { role: "assistant", content: "" }, + finish_reason: "stop" + }, + ], + created, + })}\n\n`); + !transStream.closed && transStream.end("data: [DONE]\n\n"); + endCallback && endCallback(); + return; + } + const message = result.message; + if (!message || ![2001, 2008].includes(message.content_type)) + return; + const content = JSON.parse(message.content); + transStream.write(`data: ${JSON.stringify({ + id: convId, + model: MODEL_NAME, + object: "chat.completion.chunk", + choices: [ + { + index: 0, + delta: { role: "assistant", content: content.text }, + finish_reason: null, + }, + ], + created, + })}\n\n`); + } catch (err) { + logger.error(err); + !transStream.closed && transStream.end("\n\n"); + } + }); + // 将流数据喂给SSE转换器 + stream.on("data", (buffer) => parser.feed(buffer.toString())); + stream.once( + "error", + () => !transStream.closed && transStream.end("data: [DONE]\n\n") + ); + stream.once( + "close", + () => !transStream.closed && transStream.end("data: [DONE]\n\n") + ); + return transStream; +} + +/** + * Token切分 + * + * @param authorization 认证字符串 + */ +function tokenSplit(authorization: string) { + return authorization.replace("Bearer ", "").split(","); +} + +/** + * 获取Token存活状态 + */ +async function getTokenLiveStatus(refreshToken: string) { + const result = await request("POST", "/passport/account/info/v2", refreshToken, { + params: { + account_sdk_source: "web" + } + }); + try { + const { user_id } = checkResult(result); + return !!user_id; + } catch (err) { + return false; + } +} + +export default { + createCompletion, + createCompletionStream, + getTokenLiveStatus, + tokenSplit, +}; diff --git a/src/api/routes/chat.ts b/src/api/routes/chat.ts new file mode 100644 index 0000000..12782c0 --- /dev/null +++ b/src/api/routes/chat.ts @@ -0,0 +1,37 @@ +import _ from 'lodash'; + +import Request from '@/lib/request/Request.ts'; +import Response from '@/lib/response/Response.ts'; +import chat from '@/api/controllers/chat.ts'; +import logger from '@/lib/logger.ts'; + +export default { + + prefix: '/v1/chat', + + post: { + + '/completions': async (request: Request) => { + request + .validate('body.conversation_id', v => _.isUndefined(v) || _.isString(v)) + .validate('body.messages', _.isArray) + .validate('headers.authorization', _.isString) + // refresh_token切分 + const tokens = chat.tokenSplit(request.headers.authorization); + // 随机挑选一个refresh_token + const token = _.sample(tokens); + const { model, conversation_id: convId, messages, stream } = request.body; + const assistantId = /^[a-z0-9]{24,}$/.test(model) ? model : undefined + if (stream) { + const stream = await chat.createCompletionStream(messages, token, assistantId, convId); + return new Response(stream, { + type: "text/event-stream" + }); + } + else + return await chat.createCompletion(messages, token, assistantId, convId); + } + + } + +} \ No newline at end of file diff --git a/src/api/routes/index.ts b/src/api/routes/index.ts new file mode 100644 index 0000000..2c5b1d0 --- /dev/null +++ b/src/api/routes/index.ts @@ -0,0 +1,27 @@ +import fs from 'fs-extra'; + +import Response from '@/lib/response/Response.ts'; +import chat from "./chat.ts"; +import ping from "./ping.ts"; +import token from './token.js'; +import models from './models.ts'; + +export default [ + { + get: { + '/': async () => { + const content = await fs.readFile('public/welcome.html'); + return new Response(content, { + type: 'html', + headers: { + Expires: '-1' + } + }); + } + } + }, + chat, + ping, + token, + models +]; \ No newline at end of file diff --git a/src/api/routes/models.ts b/src/api/routes/models.ts new file mode 100644 index 0000000..4914a3f --- /dev/null +++ b/src/api/routes/models.ts @@ -0,0 +1,21 @@ +import _ from 'lodash'; + +export default { + + prefix: '/v1', + + get: { + '/models': async () => { + return { + "data": [ + { + "id": "doubao", + "object": "model", + "owned_by": "doubao-free-api" + } + ] + }; + } + + } +} \ No newline at end of file diff --git a/src/api/routes/ping.ts b/src/api/routes/ping.ts new file mode 100644 index 0000000..dc9af72 --- /dev/null +++ b/src/api/routes/ping.ts @@ -0,0 +1,6 @@ +export default { + prefix: '/ping', + get: { + '': async () => "pong" + } +} \ No newline at end of file diff --git a/src/api/routes/token.ts b/src/api/routes/token.ts new file mode 100644 index 0000000..c69c512 --- /dev/null +++ b/src/api/routes/token.ts @@ -0,0 +1,25 @@ +import _ from 'lodash'; + +import Request from '@/lib/request/Request.ts'; +import Response from '@/lib/response/Response.ts'; +import chat from '@/api/controllers/chat.ts'; +import logger from '@/lib/logger.ts'; + +export default { + + prefix: '/token', + + post: { + + '/check': async (request: Request) => { + request + .validate('body.token', _.isString) + const live = await chat.getTokenLiveStatus(request.body.token); + return { + live + } + } + + } + +} \ No newline at end of file diff --git a/src/api/routes/videos.ts b/src/api/routes/videos.ts new file mode 100644 index 0000000..e0e0e87 --- /dev/null +++ b/src/api/routes/videos.ts @@ -0,0 +1,78 @@ +import _ from "lodash"; + +import Request from "@/lib/request/Request.ts"; +import chat from "@/api/controllers/chat.ts"; +import util from "@/lib/util.ts"; + +export default { + + prefix: "/v1/videos", + + post: { + + "/generations": async (request: Request) => { + request + .validate( + "body.conversation_id", + (v) => _.isUndefined(v) || _.isString(v) + ) + .validate("body.model", (v) => _.isUndefined(v) || _.isString(v)) + .validate("body.prompt", _.isString) + .validate("body.audio_id", (v) => _.isUndefined(v) || _.isString(v)) + .validate("body.image_url", (v) => _.isUndefined(v) || _.isString(v)) + .validate( + "body.video_style", + (v) => + _.isUndefined(v) || + ["卡通3D", "黑白老照片", "油画", "电影感"].includes(v), + "video_style must be one of 卡通3D/黑白老照片/油画/电影感" + ) + .validate( + "body.emotional_atmosphere", + (v) => + _.isUndefined(v) || + ["温馨和谐", "生动活泼", "紧张刺激", "凄凉寂寞"].includes(v), + "emotional_atmosphere must be one of 温馨和谐/生动活泼/紧张刺激/凄凉寂寞" + ) + .validate( + "body.mirror_mode", + (v) => + _.isUndefined(v) || ["水平", "垂直", "推近", "拉远"].includes(v), + "mirror_mode must be one of 水平/垂直/推近/拉远" + ) + .validate("headers.authorization", _.isString); + // refresh_token切分 + const tokens = chat.tokenSplit(request.headers.authorization); + // 随机挑选一个refresh_token + const token = _.sample(tokens); + const { + model, + conversation_id: convId, + prompt, + image_url: imageUrl, + video_style: videoStyle = "", + emotional_atmosphere: emotionalAtmosphere = "", + mirror_mode: mirrorMode = "", + audio_id: audioId, + } = request.body; + const data = await chat.generateVideos( + model, + prompt, + token, + { + imageUrl, + videoStyle, + emotionalAtmosphere, + mirrorMode, + audioId, + }, + convId + ); + return { + created: util.unixTimestamp(), + data, + }; + }, + }, + +}; diff --git a/src/daemon.ts b/src/daemon.ts new file mode 100644 index 0000000..0c5fe69 --- /dev/null +++ b/src/daemon.ts @@ -0,0 +1,82 @@ +/** + * 守护进程 + */ + +import process from 'process'; +import path from 'path'; +import { spawn } from 'child_process'; + +import fs from 'fs-extra'; +import { format as dateFormat } from 'date-fns'; +import 'colors'; + +const CRASH_RESTART_LIMIT = 600; //进程崩溃重启次数限制 +const CRASH_RESTART_DELAY = 5000; //进程崩溃重启延迟 +const LOG_PATH = path.resolve("./logs/daemon.log"); //守护进程日志路径 +let crashCount = 0; //进程崩溃次数 +let currentProcess; //当前运行进程 + +/** + * 写入守护进程日志 + */ +function daemonLog(value, color?: string) { + try { + const head = `[daemon][${dateFormat(new Date(), "yyyy-MM-dd HH:mm:ss.SSS")}] `; + value = head + value; + console.log(color ? value[color] : value); + fs.ensureDirSync(path.dirname(LOG_PATH)); + fs.appendFileSync(LOG_PATH, value + "\n"); + } + catch(err) { + console.error("daemon log write error:", err); + } +} + +daemonLog(`daemon pid: ${process.pid}`); + +function createProcess() { + const childProcess = spawn("node", ["index.js", ...process.argv.slice(2)]); //启动子进程 + childProcess.stdout.pipe(process.stdout, { end: false }); //将子进程输出管道到当前进程输出 + childProcess.stderr.pipe(process.stderr, { end: false }); //将子进程错误输出管道到当前进程输出 + currentProcess = childProcess; //更新当前进程 + daemonLog(`process(${childProcess.pid}) has started`); + childProcess.on("error", err => daemonLog(`process(${childProcess.pid}) error: ${err.stack}`, "red")); + childProcess.on("close", code => { + if(code === 0) //进程正常退出 + daemonLog(`process(${childProcess.pid}) has exited`); + else if(code === 2) //进程已被杀死 + daemonLog(`process(${childProcess.pid}) has been killed!`, "bgYellow"); + else if(code === 3) { //进程主动重启 + daemonLog(`process(${childProcess.pid}) has restart`, "yellow"); + createProcess(); //重新创建进程 + } + else { //进程发生崩溃 + if(crashCount++ < CRASH_RESTART_LIMIT) { //进程崩溃次数未达重启次数上限前尝试重启 + daemonLog(`process(${childProcess.pid}) has crashed! delay ${CRASH_RESTART_DELAY}ms try restarting...(${crashCount})`, "bgRed"); + setTimeout(() => createProcess(), CRASH_RESTART_DELAY); //延迟指定时长后再重启 + } + else //进程已崩溃,且无法重启 + daemonLog(`process(${childProcess.pid}) has crashed! unable to restart`, "bgRed"); + } + }); //子进程关闭监听 +} + +process.on("exit", code => { + if(code === 0) + daemonLog("daemon process exited"); + else if(code === 2) + daemonLog("daemon process has been killed!"); +}); //守护进程退出事件 + +process.on("SIGTERM", () => { + daemonLog("received kill signal", "yellow"); + currentProcess && currentProcess.kill("SIGINT"); + process.exit(2); +}); //kill退出守护进程 + +process.on("SIGINT", () => { + currentProcess && currentProcess.kill("SIGINT"); + process.exit(0); +}); //主动退出守护进程 + +createProcess(); //创建进程 diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..fa3157e --- /dev/null +++ b/src/index.ts @@ -0,0 +1,32 @@ +"use strict"; + +import environment from "@/lib/environment.ts"; +import config from "@/lib/config.ts"; +import "@/lib/initialize.ts"; +import server from "@/lib/server.ts"; +import routes from "@/api/routes/index.ts"; +import logger from "@/lib/logger.ts"; + +const startupTime = performance.now(); + +(async () => { + logger.header(); + + logger.info("<<<< doubao free server >>>>"); + logger.info("Version:", environment.package.version); + logger.info("Process id:", process.pid); + logger.info("Environment:", environment.env); + logger.info("Service name:", config.service.name); + + server.attachRoutes(routes); + await server.listen(); + + config.service.bindAddress && + logger.success("Service bind address:", config.service.bindAddress); +})() + .then(() => + logger.success( + `Service startup completed (${Math.floor(performance.now() - startupTime)}ms)` + ) + ) + .catch((err) => console.error(err)); diff --git a/src/lib/config.ts b/src/lib/config.ts new file mode 100644 index 0000000..b6072d2 --- /dev/null +++ b/src/lib/config.ts @@ -0,0 +1,14 @@ +import serviceConfig from "./configs/service-config.ts"; +import systemConfig from "./configs/system-config.ts"; + +class Config { + + /** 服务配置 */ + service = serviceConfig; + + /** 系统配置 */ + system = systemConfig; + +} + +export default new Config(); \ No newline at end of file diff --git a/src/lib/configs/service-config.ts b/src/lib/configs/service-config.ts new file mode 100644 index 0000000..79e1c35 --- /dev/null +++ b/src/lib/configs/service-config.ts @@ -0,0 +1,68 @@ +import path from 'path'; + +import fs from 'fs-extra'; +import yaml from 'yaml'; +import _ from 'lodash'; + +import environment from '../environment.ts'; +import util from '../util.ts'; + +const CONFIG_PATH = path.join(path.resolve(), 'configs/', environment.env, "/service.yml"); + +/** + * 服务配置 + */ +export class ServiceConfig { + + /** 服务名称 */ + name: string; + /** @type {string} 服务绑定主机地址 */ + host; + /** @type {number} 服务绑定端口 */ + port; + /** @type {string} 服务路由前缀 */ + urlPrefix; + /** @type {string} 服务绑定地址(外部访问地址) */ + bindAddress; + + constructor(options?: any) { + const { name, host, port, urlPrefix, bindAddress } = options || {}; + this.name = _.defaultTo(name, 'doubao-free-api'); + this.host = _.defaultTo(host, '0.0.0.0'); + this.port = _.defaultTo(port, 5566); + this.urlPrefix = _.defaultTo(urlPrefix, ''); + this.bindAddress = bindAddress; + } + + get addressHost() { + if(this.bindAddress) return this.bindAddress; + const ipAddresses = util.getIPAddressesByIPv4(); + for(let ipAddress of ipAddresses) { + if(ipAddress === this.host) + return ipAddress; + } + return ipAddresses[0] || "127.0.0.1"; + } + + get address() { + return `${this.addressHost}:${this.port}`; + } + + get pageDirUrl() { + return `http://127.0.0.1:${this.port}/page`; + } + + get publicDirUrl() { + return `http://127.0.0.1:${this.port}/public`; + } + + static load() { + const external = _.pickBy(environment, (v, k) => ["name", "host", "port"].includes(k) && !_.isUndefined(v)); + if(!fs.pathExistsSync(CONFIG_PATH)) return new ServiceConfig(external); + const data = yaml.parse(fs.readFileSync(CONFIG_PATH).toString()); + return new ServiceConfig({ ...data, ...external }); + } + +} + +export default ServiceConfig.load(); \ No newline at end of file diff --git a/src/lib/configs/system-config.ts b/src/lib/configs/system-config.ts new file mode 100644 index 0000000..7c589a6 --- /dev/null +++ b/src/lib/configs/system-config.ts @@ -0,0 +1,84 @@ +import path from 'path'; + +import fs from 'fs-extra'; +import yaml from 'yaml'; +import _ from 'lodash'; + +import environment from '../environment.ts'; + +const CONFIG_PATH = path.join(path.resolve(), 'configs/', environment.env, "/system.yml"); + +/** + * 系统配置 + */ +export class SystemConfig { + + /** 是否开启请求日志 */ + requestLog: boolean; + /** 临时目录路径 */ + tmpDir: string; + /** 日志目录路径 */ + logDir: string; + /** 日志写入间隔(毫秒) */ + logWriteInterval: number; + /** 日志文件有效期(毫秒) */ + logFileExpires: number; + /** 公共目录路径 */ + publicDir: string; + /** 临时文件有效期(毫秒) */ + tmpFileExpires: number; + /** 请求体配置 */ + requestBody: any; + /** 是否调试模式 */ + debug: boolean; + + constructor(options?: any) { + const { requestLog, tmpDir, logDir, logWriteInterval, logFileExpires, publicDir, tmpFileExpires, requestBody, debug } = options || {}; + this.requestLog = _.defaultTo(requestLog, false); + this.tmpDir = _.defaultTo(tmpDir, './tmp'); + this.logDir = _.defaultTo(logDir, './logs'); + this.logWriteInterval = _.defaultTo(logWriteInterval, 200); + this.logFileExpires = _.defaultTo(logFileExpires, 2626560000); + this.publicDir = _.defaultTo(publicDir, './public'); + this.tmpFileExpires = _.defaultTo(tmpFileExpires, 86400000); + this.requestBody = Object.assign(requestBody || {}, { + enableTypes: ['json', 'form', 'text', 'xml'], + encoding: 'utf-8', + formLimit: '100mb', + jsonLimit: '100mb', + textLimit: '100mb', + xmlLimit: '100mb', + formidable: { + maxFileSize: '100mb' + }, + multipart: true, + parsedMethods: ['POST', 'PUT', 'PATCH'] + }); + this.debug = _.defaultTo(debug, true); + } + + get rootDirPath() { + return path.resolve(); + } + + get tmpDirPath() { + return path.resolve(this.tmpDir); + } + + get logDirPath() { + return path.resolve(this.logDir); + } + + get publicDirPath() { + return path.resolve(this.publicDir); + } + + static load() { + if (!fs.pathExistsSync(CONFIG_PATH)) return new SystemConfig(); + const data = yaml.parse(fs.readFileSync(CONFIG_PATH).toString()); + return new SystemConfig(data); + } + +} + +export default SystemConfig.load(); \ No newline at end of file diff --git a/src/lib/consts/exceptions.ts b/src/lib/consts/exceptions.ts new file mode 100644 index 0000000..7a9b788 --- /dev/null +++ b/src/lib/consts/exceptions.ts @@ -0,0 +1,5 @@ +export default { + SYSTEM_ERROR: [-1000, '系统异常'], + SYSTEM_REQUEST_VALIDATION_ERROR: [-1001, '请求参数校验错误'], + SYSTEM_NOT_ROUTE_MATCHING: [-1002, '无匹配的路由'] +} as Record \ No newline at end of file diff --git a/src/lib/environment.ts b/src/lib/environment.ts new file mode 100644 index 0000000..6e52a84 --- /dev/null +++ b/src/lib/environment.ts @@ -0,0 +1,44 @@ +import path from 'path'; + +import fs from 'fs-extra'; +import minimist from 'minimist'; +import _ from 'lodash'; + +const cmdArgs = minimist(process.argv.slice(2)); //获取命令行参数 +const envVars = process.env; //获取环境变量 + +class Environment { + + /** 命令行参数 */ + cmdArgs: any; + /** 环境变量 */ + envVars: any; + /** 环境名称 */ + env?: string; + /** 服务名称 */ + name?: string; + /** 服务地址 */ + host?: string; + /** 服务端口 */ + port?: number; + /** 包参数 */ + package: any; + + constructor(options: any = {}) { + const { cmdArgs, envVars, package: _package } = options; + this.cmdArgs = cmdArgs; + this.envVars = envVars; + this.env = _.defaultTo(cmdArgs.env || envVars.SERVER_ENV, 'dev'); + this.name = cmdArgs.name || envVars.SERVER_NAME || undefined; + this.host = cmdArgs.host || envVars.SERVER_HOST || undefined; + this.port = Number(cmdArgs.port || envVars.SERVER_PORT) ? Number(cmdArgs.port || envVars.SERVER_PORT) : undefined; + this.package = _package; + } + +} + +export default new Environment({ + cmdArgs, + envVars, + package: JSON.parse(fs.readFileSync(path.join(path.resolve(), "package.json")).toString()) +}); \ No newline at end of file diff --git a/src/lib/exceptions/APIException.ts b/src/lib/exceptions/APIException.ts new file mode 100644 index 0000000..515c806 --- /dev/null +++ b/src/lib/exceptions/APIException.ts @@ -0,0 +1,14 @@ +import Exception from './Exception.js'; + +export default class APIException extends Exception { + + /** + * 构造异常 + * + * @param {[number, string]} exception 异常 + */ + constructor(exception: (string | number)[], errmsg?: string) { + super(exception, errmsg); + } + +} \ No newline at end of file diff --git a/src/lib/exceptions/Exception.ts b/src/lib/exceptions/Exception.ts new file mode 100644 index 0000000..ef0372f --- /dev/null +++ b/src/lib/exceptions/Exception.ts @@ -0,0 +1,47 @@ +import assert from 'assert'; + +import _ from 'lodash'; + +export default class Exception extends Error { + + /** 错误码 */ + errcode: number; + /** 错误消息 */ + errmsg: string; + /** 数据 */ + data: any; + /** HTTP状态码 */ + httpStatusCode: number; + + /** + * 构造异常 + * + * @param exception 异常 + * @param _errmsg 异常消息 + */ + constructor(exception: (string | number)[], _errmsg?: string) { + assert(_.isArray(exception), 'Exception must be Array'); + const [errcode, errmsg] = exception as [number, string]; + assert(_.isFinite(errcode), 'Exception errcode invalid'); + assert(_.isString(errmsg), 'Exception errmsg invalid'); + super(_errmsg || errmsg); + this.errcode = errcode; + this.errmsg = _errmsg || errmsg; + } + + compare(exception: (string | number)[]) { + const [errcode] = exception as [number, string]; + return this.errcode == errcode; + } + + setHTTPStatusCode(value: number) { + this.httpStatusCode = value; + return this; + } + + setData(value: any) { + this.data = _.defaultTo(value, null); + return this; + } + +} \ No newline at end of file diff --git a/src/lib/http-status-codes.ts b/src/lib/http-status-codes.ts new file mode 100644 index 0000000..cc0c571 --- /dev/null +++ b/src/lib/http-status-codes.ts @@ -0,0 +1,61 @@ +export default { + + CONTINUE: 100, //客户端应当继续发送请求。这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。服务器必须在请求完成后向客户端发送一个最终响应 + SWITCHING_PROTOCOLS: 101, //服务器已经理解了客户端的请求,并将通过Upgrade 消息头通知客户端采用不同的协议来完成这个请求。在发送完这个响应最后的空行后,服务器将会切换到在Upgrade 消息头中定义的那些协议。只有在切换新的协议更有好处的时候才应该采取类似措施。例如,切换到新的HTTP 版本比旧版本更有优势,或者切换到一个实时且同步的协议以传送利用此类特性的资源 + PROCESSING: 102, //处理将被继续执行 + + OK: 200, //请求已成功,请求所希望的响应头或数据体将随此响应返回 + CREATED: 201, //请求已经被实现,而且有一个新的资源已经依据请求的需要而建立,且其 URI 已经随Location 头信息返回。假如需要的资源无法及时建立的话,应当返回 '202 Accepted' + ACCEPTED: 202, //服务器已接受请求,但尚未处理。正如它可能被拒绝一样,最终该请求可能会也可能不会被执行。在异步操作的场合下,没有比发送这个状态码更方便的做法了。返回202状态码的响应的目的是允许服务器接受其他过程的请求(例如某个每天只执行一次的基于批处理的操作),而不必让客户端一直保持与服务器的连接直到批处理操作全部完成。在接受请求处理并返回202状态码的响应应当在返回的实体中包含一些指示处理当前状态的信息,以及指向处理状态监视器或状态预测的指针,以便用户能够估计操作是否已经完成 + NON_AUTHORITATIVE_INFO: 203, //服务器已成功处理了请求,但返回的实体头部元信息不是在原始服务器上有效的确定集合,而是来自本地或者第三方的拷贝。当前的信息可能是原始版本的子集或者超集。例如,包含资源的元数据可能导致原始服务器知道元信息的超级。使用此状态码不是必须的,而且只有在响应不使用此状态码便会返回200 OK的情况下才是合适的 + NO_CONTENT: 204, //服务器成功处理了请求,但不需要返回任何实体内容,并且希望返回更新了的元信息。响应可能通过实体头部的形式,返回新的或更新后的元信息。如果存在这些头部信息,则应当与所请求的变量相呼应。如果客户端是浏览器的话,那么用户浏览器应保留发送了该请求的页面,而不产生任何文档视图上的变化,即使按照规范新的或更新后的元信息应当被应用到用户浏览器活动视图中的文档。由于204响应被禁止包含任何消息体,因此它始终以消息头后的第一个空行结尾 + RESET_CONTENT: 205, //服务器成功处理了请求,且没有返回任何内容。但是与204响应不同,返回此状态码的响应要求请求者重置文档视图。该响应主要是被用于接受用户输入后,立即重置表单,以便用户能够轻松地开始另一次输入。与204响应一样,该响应也被禁止包含任何消息体,且以消息头后的第一个空行结束 + PARTIAL_CONTENT: 206, //服务器已经成功处理了部分 GET 请求。类似于FlashGet或者迅雷这类的HTTP下载工具都是使用此类响应实现断点续传或者将一个大文档分解为多个下载段同时下载。该请求必须包含 Range 头信息来指示客户端希望得到的内容范围,并且可能包含 If-Range 来作为请求条件。响应必须包含如下的头部域:Content-Range 用以指示本次响应中返回的内容的范围;如果是Content-Type为multipart/byteranges的多段下载,则每一段multipart中都应包含Content-Range域用以指示本段的内容范围。假如响应中包含Content-Length,那么它的数值必须匹配它返回的内容范围的真实字节数。Date和ETag或Content-Location,假如同样的请求本应该返回200响应。Expires, Cache-Control,和/或 Vary,假如其值可能与之前相同变量的其他响应对应的值不同的话。假如本响应请求使用了 If-Range 强缓存验证,那么本次响应不应该包含其他实体头;假如本响应的请求使用了 If-Range 弱缓存验证,那么本次响应禁止包含其他实体头;这避免了缓存的实体内容和更新了的实体头信息之间的不一致。否则,本响应就应当包含所有本应该返回200响应中应当返回的所有实体头部域。假如 ETag 或 Latest-Modified 头部不能精确匹配的话,则客户端缓存应禁止将206响应返回的内容与之前任何缓存过的内容组合在一起。任何不支持 Range 以及 Content-Range 头的缓存都禁止缓存206响应返回的内容 + MULTIPLE_STATUS: 207, //代表之后的消息体将是一个XML消息,并且可能依照之前子请求数量的不同,包含一系列独立的响应代码 + + MULTIPLE_CHOICES: 300, //被请求的资源有一系列可供选择的回馈信息,每个都有自己特定的地址和浏览器驱动的商议信息。用户或浏览器能够自行选择一个首选的地址进行重定向。除非这是一个HEAD请求,否则该响应应当包括一个资源特性及地址的列表的实体,以便用户或浏览器从中选择最合适的重定向地址。这个实体的格式由Content-Type定义的格式所决定。浏览器可能根据响应的格式以及浏览器自身能力,自动作出最合适的选择。当然,RFC 2616规范并没有规定这样的自动选择该如何进行。如果服务器本身已经有了首选的回馈选择,那么在Location中应当指明这个回馈的 URI;浏览器可能会将这个 Location 值作为自动重定向的地址。此外,除非额外指定,否则这个响应也是可缓存的 + MOVED_PERMANENTLY: 301, //被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个URI之一。如果可能,拥有链接编辑功能的客户端应当自动把请求的地址修改为从服务器反馈回来的地址。除非额外指定,否则这个响应也是可缓存的。新的永久性的URI应当在响应的Location域中返回。除非这是一个HEAD请求,否则响应的实体中应当包含指向新的URI的超链接及简短说明。如果这不是一个GET或者HEAD请求,因此浏览器禁止自动进行重定向,除非得到用户的确认,因为请求的条件可能因此发生变化。注意:对于某些使用 HTTP/1.0 协议的浏览器,当它们发送的POST请求得到了一个301响应的话,接下来的重定向请求将会变成GET方式 + FOUND: 302, //请求的资源现在临时从不同的URI响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。新的临时性的URI应当在响应的 Location 域中返回。除非这是一个HEAD请求,否则响应的实体中应当包含指向新的URI的超链接及简短说明。如果这不是一个GET或者HEAD请求,那么浏览器禁止自动进行重定向,除非得到用户的确认,因为请求的条件可能因此发生变化。注意:虽然RFC 1945和RFC 2068规范不允许客户端在重定向时改变请求的方法,但是很多现存的浏览器将302响应视作为303响应,并且使用GET方式访问在Location中规定的URI,而无视原先请求的方法。状态码303和307被添加了进来,用以明确服务器期待客户端进行何种反应 + SEE_OTHER: 303, //对应当前请求的响应可以在另一个URI上被找到,而且客户端应当采用 GET 的方式访问那个资源。这个方法的存在主要是为了允许由脚本激活的POST请求输出重定向到一个新的资源。这个新的 URI 不是原始资源的替代引用。同时,303响应禁止被缓存。当然,第二个请求(重定向)可能被缓存。新的 URI 应当在响应的Location域中返回。除非这是一个HEAD请求,否则响应的实体中应当包含指向新的URI的超链接及简短说明。注意:许多 HTTP/1.1 版以前的浏览器不能正确理解303状态。如果需要考虑与这些浏览器之间的互动,302状态码应该可以胜任,因为大多数的浏览器处理302响应时的方式恰恰就是上述规范要求客户端处理303响应时应当做的 + NOT_MODIFIED: 304, //如果客户端发送了一个带条件的GET请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码。304响应禁止包含消息体,因此始终以消息头后的第一个空行结尾。该响应必须包含以下的头信息:Date,除非这个服务器没有时钟。假如没有时钟的服务器也遵守这些规则,那么代理服务器以及客户端可以自行将Date字段添加到接收到的响应头中去(正如RFC 2068中规定的一样),缓存机制将会正常工作。ETag或 Content-Location,假如同样的请求本应返回200响应。Expires, Cache-Control,和/或Vary,假如其值可能与之前相同变量的其他响应对应的值不同的话。假如本响应请求使用了强缓存验证,那么本次响应不应该包含其他实体头;否则(例如,某个带条件的 GET 请求使用了弱缓存验证),本次响应禁止包含其他实体头;这避免了缓存了的实体内容和更新了的实体头信息之间的不一致。假如某个304响应指明了当前某个实体没有缓存,那么缓存系统必须忽视这个响应,并且重复发送不包含限制条件的请求。假如接收到一个要求更新某个缓存条目的304响应,那么缓存系统必须更新整个条目以反映所有在响应中被更新的字段的值 + USE_PROXY: 305, //被请求的资源必须通过指定的代理才能被访问。Location域中将给出指定的代理所在的URI信息,接收者需要重复发送一个单独的请求,通过这个代理才能访问相应资源。只有原始服务器才能建立305响应。注意:RFC 2068中没有明确305响应是为了重定向一个单独的请求,而且只能被原始服务器建立。忽视这些限制可能导致严重的安全后果 + UNUSED: 306, //在最新版的规范中,306状态码已经不再被使用 + TEMPORARY_REDIRECT: 307, //请求的资源现在临时从不同的URI 响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。新的临时性的URI 应当在响应的Location域中返回。除非这是一个HEAD请求,否则响应的实体中应当包含指向新的URI 的超链接及简短说明。因为部分浏览器不能识别307响应,因此需要添加上述必要信息以便用户能够理解并向新的 URI 发出访问请求。如果这不是一个GET或者HEAD请求,那么浏览器禁止自动进行重定向,除非得到用户的确认,因为请求的条件可能因此发生变化 + + BAD_REQUEST: 400, //1.语义有误,当前请求无法被服务器理解。除非进行修改,否则客户端不应该重复提交这个请求 2.请求参数有误 + UNAUTHORIZED: 401, //当前请求需要用户验证。该响应必须包含一个适用于被请求资源的 WWW-Authenticate 信息头用以询问用户信息。客户端可以重复提交一个包含恰当的 Authorization 头信息的请求。如果当前请求已经包含了 Authorization 证书,那么401响应代表着服务器验证已经拒绝了那些证书。如果401响应包含了与前一个响应相同的身份验证询问,且浏览器已经至少尝试了一次验证,那么浏览器应当向用户展示响应中包含的实体信息,因为这个实体信息中可能包含了相关诊断信息。参见RFC 2617 + PAYMENT_REQUIRED: 402, //该状态码是为了将来可能的需求而预留的 + FORBIDDEN: 403, //服务器已经理解请求,但是拒绝执行它。与401响应不同的是,身份验证并不能提供任何帮助,而且这个请求也不应该被重复提交。如果这不是一个HEAD请求,而且服务器希望能够讲清楚为何请求不能被执行,那么就应该在实体内描述拒绝的原因。当然服务器也可以返回一个404响应,假如它不希望让客户端获得任何信息 + NOT_FOUND: 404, //请求失败,请求所希望得到的资源未被在服务器上发现。没有信息能够告诉用户这个状况到底是暂时的还是永久的。假如服务器知道情况的话,应当使用410状态码来告知旧资源因为某些内部的配置机制问题,已经永久的不可用,而且没有任何可以跳转的地址。404这个状态码被广泛应用于当服务器不想揭示到底为何请求被拒绝或者没有其他适合的响应可用的情况下 + METHOD_NOT_ALLOWED: 405, //请求行中指定的请求方法不能被用于请求相应的资源。该响应必须返回一个Allow 头信息用以表示出当前资源能够接受的请求方法的列表。鉴于PUT,DELETE方法会对服务器上的资源进行写操作,因而绝大部分的网页服务器都不支持或者在默认配置下不允许上述请求方法,对于此类请求均会返回405错误 + NO_ACCEPTABLE: 406, //请求的资源的内容特性无法满足请求头中的条件,因而无法生成响应实体。除非这是一个 HEAD 请求,否则该响应就应当返回一个包含可以让用户或者浏览器从中选择最合适的实体特性以及地址列表的实体。实体的格式由Content-Type头中定义的媒体类型决定。浏览器可以根据格式及自身能力自行作出最佳选择。但是,规范中并没有定义任何作出此类自动选择的标准 + PROXY_AUTHENTICATION_REQUIRED: 407, //与401响应类似,只不过客户端必须在代理服务器上进行身份验证。代理服务器必须返回一个Proxy-Authenticate用以进行身份询问。客户端可以返回一个Proxy-Authorization信息头用以验证。参见RFC 2617 + REQUEST_TIMEOUT: 408, //请求超时。客户端没有在服务器预备等待的时间内完成一个请求的发送。客户端可以随时再次提交这一请求而无需进行任何更改 + CONFLICT: 409, //由于和被请求的资源的当前状态之间存在冲突,请求无法完成。这个代码只允许用在这样的情况下才能被使用:用户被认为能够解决冲突,并且会重新提交新的请求。该响应应当包含足够的信息以便用户发现冲突的源头。冲突通常发生于对PUT请求的处理中。例如,在采用版本检查的环境下,某次PUT提交的对特定资源的修改请求所附带的版本信息与之前的某个(第三方)请求向冲突,那么此时服务器就应该返回一个409错误,告知用户请求无法完成。此时,响应实体中很可能会包含两个冲突版本之间的差异比较,以便用户重新提交归并以后的新版本 + GONE: 410, //被请求的资源在服务器上已经不再可用,而且没有任何已知的转发地址。这样的状况应当被认为是永久性的。如果可能,拥有链接编辑功能的客户端应当在获得用户许可后删除所有指向这个地址的引用。如果服务器不知道或者无法确定这个状况是否是永久的,那么就应该使用404状态码。除非额外说明,否则这个响应是可缓存的。410响应的目的主要是帮助网站管理员维护网站,通知用户该资源已经不再可用,并且服务器拥有者希望所有指向这个资源的远端连接也被删除。这类事件在限时、增值服务中很普遍。同样,410响应也被用于通知客户端在当前服务器站点上,原本属于某个个人的资源已经不再可用。当然,是否需要把所有永久不可用的资源标记为'410 Gone',以及是否需要保持此标记多长时间,完全取决于服务器拥有者 + LENGTH_REQUIRED: 411, //服务器拒绝在没有定义Content-Length头的情况下接受请求。在添加了表明请求消息体长度的有效Content-Length头之后,客户端可以再次提交该请求 + PRECONDITION_FAILED: 412, //服务器在验证在请求的头字段中给出先决条件时,没能满足其中的一个或多个。这个状态码允许客户端在获取资源时在请求的元信息(请求头字段数据)中设置先决条件,以此避免该请求方法被应用到其希望的内容以外的资源上 + REQUEST_ENTITY_TOO_LARGE: 413, //服务器拒绝处理当前请求,因为该请求提交的实体数据大小超过了服务器愿意或者能够处理的范围。此种情况下,服务器可以关闭连接以免客户端继续发送此请求。如果这个状况是临时的,服务器应当返回一个 Retry-After 的响应头,以告知客户端可以在多少时间以后重新尝试 + REQUEST_URI_TOO_LONG: 414, //请求的URI长度超过了服务器能够解释的长度,因此服务器拒绝对该请求提供服务。这比较少见,通常的情况包括:本应使用POST方法的表单提交变成了GET方法,导致查询字符串(Query String)过长。重定向URI “黑洞”,例如每次重定向把旧的URI作为新的URI的一部分,导致在若干次重定向后URI超长。客户端正在尝试利用某些服务器中存在的安全漏洞攻击服务器。这类服务器使用固定长度的缓冲读取或操作请求的URI,当GET后的参数超过某个数值后,可能会产生缓冲区溢出,导致任意代码被执行[1]。没有此类漏洞的服务器,应当返回414状态码 + UNSUPPORTED_MEDIA_TYPE: 415, //对于当前请求的方法和所请求的资源,请求中提交的实体并不是服务器中所支持的格式,因此请求被拒绝 + REQUESTED_RANGE_NOT_SATISFIABLE: 416, //如果请求中包含了Range请求头,并且Range中指定的任何数据范围都与当前资源的可用范围不重合,同时请求中又没有定义If-Range请求头,那么服务器就应当返回416状态码。假如Range使用的是字节范围,那么这种情况就是指请求指定的所有数据范围的首字节位置都超过了当前资源的长度。服务器也应当在返回416状态码的同时,包含一个Content-Range实体头,用以指明当前资源的长度。这个响应也被禁止使用multipart/byteranges作为其 Content-Type + EXPECTION_FAILED: 417, //在请求头Expect中指定的预期内容无法被服务器满足,或者这个服务器是一个代理服务器,它有明显的证据证明在当前路由的下一个节点上,Expect的内容无法被满足 + TOO_MANY_CONNECTIONS: 421, //从当前客户端所在的IP地址到服务器的连接数超过了服务器许可的最大范围。通常,这里的IP地址指的是从服务器上看到的客户端地址(比如用户的网关或者代理服务器地址)。在这种情况下,连接数的计算可能涉及到不止一个终端用户 + UNPROCESSABLE_ENTITY: 422, //请求格式正确,但是由于含有语义错误,无法响应 + FAILED_DEPENDENCY: 424, //由于之前的某个请求发生的错误,导致当前请求失败,例如PROPPATCH + UNORDERED_COLLECTION: 425, //在WebDav Advanced Collections 草案中定义,但是未出现在《WebDAV 顺序集协议》(RFC 3658)中 + UPGRADE_REQUIRED: 426, //客户端应当切换到TLS/1.0 + RETRY_WITH: 449, //由微软扩展,代表请求应当在执行完适当的操作后进行重试 + + INTERNAL_SERVER_ERROR: 500, //服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器的程序码出错时出现 + NOT_IMPLEMENTED: 501, //服务器不支持当前请求所需要的某个功能。当服务器无法识别请求的方法,并且无法支持其对任何资源的请求 + BAD_GATEWAY: 502, //作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应 + SERVICE_UNAVAILABLE: 503, //由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。如果能够预计延迟时间,那么响应中可以包含一个 Retry-After 头用以标明这个延迟时间。如果没有给出这个 Retry-After 信息,那么客户端应当以处理500响应的方式处理它。注意:503状态码的存在并不意味着服务器在过载的时候必须使用它。某些服务器只不过是希望拒绝客户端的连接 + GATEWAY_TIMEOUT: 504, //作为网关或者代理工作的服务器尝试执行请求时,未能及时从上游服务器(URI标识出的服务器,例如HTTP、FTP、LDAP)或者辅助服务器(例如DNS)收到响应。注意:某些代理服务器在DNS查询超时时会返回400或者500错误 + HTTP_VERSION_NOT_SUPPORTED: 505, //服务器不支持,或者拒绝支持在请求中使用的HTTP版本。这暗示着服务器不能或不愿使用与客户端相同的版本。响应中应当包含一个描述了为何版本不被支持以及服务器支持哪些协议的实体 + VARIANT_ALSO_NEGOTIATES: 506, //服务器存在内部配置错误:被请求的协商变元资源被配置为在透明内容协商中使用自己,因此在一个协商处理中不是一个合适的重点 + INSUFFICIENT_STORAGE: 507, //服务器无法存储完成请求所必须的内容。这个状况被认为是临时的 + BANDWIDTH_LIMIT_EXCEEDED: 509, //服务器达到带宽限制。这不是一个官方的状态码,但是仍被广泛使用 + NOT_EXTENDED: 510 //获取资源所需要的策略并没有没满足 + +}; \ No newline at end of file diff --git a/src/lib/initialize.ts b/src/lib/initialize.ts new file mode 100644 index 0000000..953d224 --- /dev/null +++ b/src/lib/initialize.ts @@ -0,0 +1,28 @@ +import logger from './logger.js'; + +// 允许无限量的监听器 +process.setMaxListeners(Infinity); +// 输出未捕获异常 +process.on("uncaughtException", (err, origin) => { + logger.error(`An unhandled error occurred: ${origin}`, err); +}); +// 输出未处理的Promise.reject +process.on("unhandledRejection", (_, promise) => { + promise.catch(err => logger.error("An unhandled rejection occurred:", err)); +}); +// 输出系统警告信息 +process.on("warning", warning => logger.warn("System warning: ", warning)); +// 进程退出监听 +process.on("exit", () => { + logger.info("Service exit"); + logger.footer(); +}); +// 进程被kill +process.on("SIGTERM", () => { + logger.warn("received kill signal"); + process.exit(2); +}); +// Ctrl-C进程退出 +process.on("SIGINT", () => { + process.exit(0); +}); \ No newline at end of file diff --git a/src/lib/interfaces/ICompletionMessage.ts b/src/lib/interfaces/ICompletionMessage.ts new file mode 100644 index 0000000..5aad345 --- /dev/null +++ b/src/lib/interfaces/ICompletionMessage.ts @@ -0,0 +1,4 @@ +export default interface ICompletionMessage { + role: 'system' | 'assistant' | 'user' | 'function'; + content: string; +} \ No newline at end of file diff --git a/src/lib/logger.ts b/src/lib/logger.ts new file mode 100644 index 0000000..32cb3a6 --- /dev/null +++ b/src/lib/logger.ts @@ -0,0 +1,184 @@ +import path from 'path'; +import _util from 'util'; + +import 'colors'; +import _ from 'lodash'; +import fs from 'fs-extra'; +import { format as dateFormat } from 'date-fns'; + +import config from './config.ts'; +import util from './util.ts'; + +const isVercelEnv = process.env.VERCEL; + +class LogWriter { + + #buffers = []; + + constructor() { + !isVercelEnv && fs.ensureDirSync(config.system.logDirPath); + !isVercelEnv && this.work(); + } + + push(content) { + const buffer = Buffer.from(content); + this.#buffers.push(buffer); + } + + writeSync(buffer) { + !isVercelEnv && fs.appendFileSync(path.join(config.system.logDirPath, `/${util.getDateString()}.log`), buffer); + } + + async write(buffer) { + !isVercelEnv && await fs.appendFile(path.join(config.system.logDirPath, `/${util.getDateString()}.log`), buffer); + } + + flush() { + if(!this.#buffers.length) return; + !isVercelEnv && fs.appendFileSync(path.join(config.system.logDirPath, `/${util.getDateString()}.log`), Buffer.concat(this.#buffers)); + } + + work() { + if (!this.#buffers.length) return setTimeout(this.work.bind(this), config.system.logWriteInterval); + const buffer = Buffer.concat(this.#buffers); + this.#buffers = []; + this.write(buffer) + .finally(() => setTimeout(this.work.bind(this), config.system.logWriteInterval)) + .catch(err => console.error("Log write error:", err)); + } + +} + +class LogText { + + /** @type {string} 日志级别 */ + level; + /** @type {string} 日志文本 */ + text; + /** @type {string} 日志来源 */ + source; + /** @type {Date} 日志发生时间 */ + time = new Date(); + + constructor(level, ...params) { + this.level = level; + this.text = _util.format.apply(null, params); + this.source = this.#getStackTopCodeInfo(); + } + + #getStackTopCodeInfo() { + const unknownInfo = { name: "unknown", codeLine: 0, codeColumn: 0 }; + const stackArray = new Error().stack.split("\n"); + const text = stackArray[4]; + if (!text) + return unknownInfo; + const match = text.match(/at (.+) \((.+)\)/) || text.match(/at (.+)/); + if (!match || !_.isString(match[2] || match[1])) + return unknownInfo; + const temp = match[2] || match[1]; + const _match = temp.match(/([a-zA-Z0-9_\-\.]+)\:(\d+)\:(\d+)$/); + if (!_match) + return unknownInfo; + const [, scriptPath, codeLine, codeColumn] = _match as any; + return { + name: scriptPath ? scriptPath.replace(/.js$/, "") : "unknown", + path: scriptPath || null, + codeLine: parseInt(codeLine || 0), + codeColumn: parseInt(codeColumn || 0) + }; + } + + toString() { + return `[${dateFormat(this.time, "yyyy-MM-dd HH:mm:ss.SSS")}][${this.level}][${this.source.name}<${this.source.codeLine},${this.source.codeColumn}>] ${this.text}`; + } + +} + +class Logger { + + /** @type {Object} 系统配置 */ + config = {}; + /** @type {Object} 日志级别映射 */ + static Level = { + Success: "success", + Info: "info", + Log: "log", + Debug: "debug", + Warning: "warning", + Error: "error", + Fatal: "fatal" + }; + /** @type {Object} 日志级别文本颜色樱色 */ + static LevelColor = { + [Logger.Level.Success]: "green", + [Logger.Level.Info]: "brightCyan", + [Logger.Level.Debug]: "white", + [Logger.Level.Warning]: "brightYellow", + [Logger.Level.Error]: "brightRed", + [Logger.Level.Fatal]: "red" + }; + #writer; + + constructor() { + this.#writer = new LogWriter(); + } + + header() { + this.#writer.writeSync(Buffer.from(`\n\n===================== LOG START ${dateFormat(new Date(), "yyyy-MM-dd HH:mm:ss.SSS")} =====================\n\n`)); + } + + footer() { + this.#writer.flush(); //将未写入文件的日志缓存写入 + this.#writer.writeSync(Buffer.from(`\n\n===================== LOG END ${dateFormat(new Date(), "yyyy-MM-dd HH:mm:ss.SSS")} =====================\n\n`)); + } + + success(...params) { + const content = new LogText(Logger.Level.Success, ...params).toString(); + console.info(content[Logger.LevelColor[Logger.Level.Success]]); + this.#writer.push(content + "\n"); + } + + info(...params) { + const content = new LogText(Logger.Level.Info, ...params).toString(); + console.info(content[Logger.LevelColor[Logger.Level.Info]]); + this.#writer.push(content + "\n"); + } + + log(...params) { + const content = new LogText(Logger.Level.Log, ...params).toString(); + console.log(content[Logger.LevelColor[Logger.Level.Log]]); + this.#writer.push(content + "\n"); + } + + debug(...params) { + if(!config.system.debug) return; //非调试模式忽略debug + const content = new LogText(Logger.Level.Debug, ...params).toString(); + console.debug(content[Logger.LevelColor[Logger.Level.Debug]]); + this.#writer.push(content + "\n"); + } + + warn(...params) { + const content = new LogText(Logger.Level.Warning, ...params).toString(); + console.warn(content[Logger.LevelColor[Logger.Level.Warning]]); + this.#writer.push(content + "\n"); + } + + error(...params) { + const content = new LogText(Logger.Level.Error, ...params).toString(); + console.error(content[Logger.LevelColor[Logger.Level.Error]]); + this.#writer.push(content); + } + + fatal(...params) { + const content = new LogText(Logger.Level.Fatal, ...params).toString(); + console.error(content[Logger.LevelColor[Logger.Level.Fatal]]); + this.#writer.push(content); + } + + destory() { + this.#writer.destory(); + } + +} + +export default new Logger(); \ No newline at end of file diff --git a/src/lib/request/Request.ts b/src/lib/request/Request.ts new file mode 100644 index 0000000..86ab1ab --- /dev/null +++ b/src/lib/request/Request.ts @@ -0,0 +1,72 @@ +import _ from 'lodash'; + +import APIException from '@/lib/exceptions/APIException.ts'; +import EX from '@/api/consts/exceptions.ts'; +import logger from '@/lib/logger.ts'; +import util from '@/lib/util.ts'; + +export interface RequestOptions { + time?: number; +} + +export default class Request { + + /** 请求方法 */ + method: string; + /** 请求URL */ + url: string; + /** 请求路径 */ + path: string; + /** 请求载荷类型 */ + type: string; + /** 请求headers */ + headers: any; + /** 请求原始查询字符串 */ + search: string; + /** 请求查询参数 */ + query: any; + /** 请求URL参数 */ + params: any; + /** 请求载荷 */ + body: any; + /** 上传的文件 */ + files: any[]; + /** 客户端IP地址 */ + remoteIP: string | null; + /** 请求接受时间戳(毫秒) */ + time: number; + + constructor(ctx, options: RequestOptions = {}) { + const { time } = options; + this.method = ctx.request.method; + this.url = ctx.request.url; + this.path = ctx.request.path; + this.type = ctx.request.type; + this.headers = ctx.request.headers || {}; + this.search = ctx.request.search; + this.query = ctx.query || {}; + this.params = ctx.params || {}; + this.body = ctx.request.body || {}; + this.files = ctx.request.files || {}; + this.remoteIP = this.headers["X-Real-IP"] || this.headers["x-real-ip"] || this.headers["X-Forwarded-For"] || this.headers["x-forwarded-for"] || ctx.ip || null; + this.time = Number(_.defaultTo(time, util.timestamp())); + } + + validate(key: string, fn?: Function, message?: string) { + try { + const value = _.get(this, key); + if (fn) { + if (fn(value) === false) + throw `[Mismatch] -> ${fn}`; + } + else if (_.isUndefined(value)) + throw '[Undefined]'; + } + catch (err) { + logger.warn(`Params ${key} invalid:`, err); + throw new APIException(EX.API_REQUEST_PARAMS_INVALID, message || `Params ${key} invalid`); + } + return this; + } + +} \ No newline at end of file diff --git a/src/lib/response/Body.ts b/src/lib/response/Body.ts new file mode 100644 index 0000000..9cf8574 --- /dev/null +++ b/src/lib/response/Body.ts @@ -0,0 +1,41 @@ +import _ from 'lodash'; + +export interface BodyOptions { + code?: number; + message?: string; + data?: any; + statusCode?: number; +} + +export default class Body { + + /** 状态码 */ + code: number; + /** 状态消息 */ + message: string; + /** 载荷 */ + data: any; + /** HTTP状态码 */ + statusCode: number; + + constructor(options: BodyOptions = {}) { + const { code, message, data, statusCode } = options; + this.code = Number(_.defaultTo(code, 0)); + this.message = _.defaultTo(message, 'OK'); + this.data = _.defaultTo(data, null); + this.statusCode = Number(_.defaultTo(statusCode, 200)); + } + + toObject() { + return { + code: this.code, + message: this.message, + data: this.data + }; + } + + static isInstance(value) { + return value instanceof Body; + } + +} \ No newline at end of file diff --git a/src/lib/response/FailureBody.ts b/src/lib/response/FailureBody.ts new file mode 100644 index 0000000..33d7fb9 --- /dev/null +++ b/src/lib/response/FailureBody.ts @@ -0,0 +1,31 @@ +import _ from 'lodash'; + +import Body from './Body.ts'; +import Exception from '../exceptions/Exception.ts'; +import APIException from '../exceptions/APIException.ts'; +import EX from '../consts/exceptions.ts'; +import HTTP_STATUS_CODES from '../http-status-codes.ts'; + +export default class FailureBody extends Body { + + constructor(error: APIException | Exception | Error, _data?: any) { + let errcode, errmsg, data = _data, httpStatusCode = HTTP_STATUS_CODES.OK;; + if(_.isString(error)) + error = new Exception(EX.SYSTEM_ERROR, error); + else if(error instanceof APIException || error instanceof Exception) + ({ errcode, errmsg, data, httpStatusCode } = error); + else if(_.isError(error)) + ({ errcode, errmsg, data, httpStatusCode } = new Exception(EX.SYSTEM_ERROR, error.message)); + super({ + code: errcode || -1, + message: errmsg || 'Internal error', + data, + statusCode: httpStatusCode + }); + } + + static isInstance(value) { + return value instanceof FailureBody; + } + +} \ No newline at end of file diff --git a/src/lib/response/Response.ts b/src/lib/response/Response.ts new file mode 100644 index 0000000..816397d --- /dev/null +++ b/src/lib/response/Response.ts @@ -0,0 +1,63 @@ +import mime from 'mime'; +import _ from 'lodash'; + +import Body from './Body.ts'; +import util from '../util.ts'; + +export interface ResponseOptions { + statusCode?: number; + type?: string; + headers?: Record; + redirect?: string; + body?: any; + size?: number; + time?: number; +} + +export default class Response { + + /** 响应HTTP状态码 */ + statusCode: number; + /** 响应内容类型 */ + type: string; + /** 响应headers */ + headers: Record; + /** 重定向目标 */ + redirect: string; + /** 响应载荷 */ + body: any; + /** 响应载荷大小 */ + size: number; + /** 响应时间戳 */ + time: number; + + constructor(body: any, options: ResponseOptions = {}) { + const { statusCode, type, headers, redirect, size, time } = options; + this.statusCode = Number(_.defaultTo(statusCode, Body.isInstance(body) ? body.statusCode : undefined)) + this.type = type; + this.headers = headers; + this.redirect = redirect; + this.size = size; + this.time = Number(_.defaultTo(time, util.timestamp())); + this.body = body; + } + + injectTo(ctx) { + this.redirect && ctx.redirect(this.redirect); + this.statusCode && (ctx.status = this.statusCode); + this.type && (ctx.type = mime.getType(this.type) || this.type); + const headers = this.headers || {}; + if(this.size && !headers["Content-Length"] && !headers["content-length"]) + headers["Content-Length"] = this.size; + ctx.set(headers); + if(Body.isInstance(this.body)) + ctx.body = this.body.toObject(); + else + ctx.body = this.body; + } + + static isInstance(value) { + return value instanceof Response; + } + +} \ No newline at end of file diff --git a/src/lib/response/SuccessfulBody.ts b/src/lib/response/SuccessfulBody.ts new file mode 100644 index 0000000..639d0d8 --- /dev/null +++ b/src/lib/response/SuccessfulBody.ts @@ -0,0 +1,19 @@ +import _ from 'lodash'; + +import Body from './Body.ts'; + +export default class SuccessfulBody extends Body { + + constructor(data: any, message?: string) { + super({ + code: 0, + message: _.defaultTo(message, "OK"), + data + }); + } + + static isInstance(value) { + return value instanceof SuccessfulBody; + } + +} \ No newline at end of file diff --git a/src/lib/server.ts b/src/lib/server.ts new file mode 100644 index 0000000..8c0e46a --- /dev/null +++ b/src/lib/server.ts @@ -0,0 +1,173 @@ +import Koa from 'koa'; +import KoaRouter from 'koa-router'; +import koaRange from 'koa-range'; +import koaCors from "koa2-cors"; +import koaBody from 'koa-body'; +import _ from 'lodash'; + +import Exception from './exceptions/Exception.ts'; +import Request from './request/Request.ts'; +import Response from './response/Response.js'; +import FailureBody from './response/FailureBody.ts'; +import EX from './consts/exceptions.ts'; +import logger from './logger.ts'; +import config from './config.ts'; + +class Server { + + app; + router; + + constructor() { + this.app = new Koa(); + this.app.use(koaCors()); + // 范围请求支持 + this.app.use(koaRange); + this.router = new KoaRouter({ prefix: config.service.urlPrefix }); + // 前置处理异常拦截 + this.app.use(async (ctx: any, next: Function) => { + if(ctx.request.type === "application/xml" || ctx.request.type === "application/ssml+xml") + ctx.req.headers["content-type"] = "text/xml"; + try { await next() } + catch (err) { + logger.error(err); + const failureBody = new FailureBody(err); + new Response(failureBody).injectTo(ctx); + } + }); + // 载荷解析器支持 + this.app.use(koaBody(_.clone(config.system.requestBody))); + this.app.on("error", (err: any) => { + // 忽略连接重试、中断、管道、取消错误 + if (["ECONNRESET", "ECONNABORTED", "EPIPE", "ECANCELED"].includes(err.code)) return; + logger.error(err); + }); + logger.success("Server initialized"); + } + + /** + * 附加路由 + * + * @param routes 路由列表 + */ + attachRoutes(routes: any[]) { + routes.forEach((route: any) => { + const prefix = route.prefix || ""; + for (let method in route) { + if(method === "prefix") continue; + if (!_.isObject(route[method])) { + logger.warn(`Router ${prefix} ${method} invalid`); + continue; + } + for (let uri in route[method]) { + this.router[method](`${prefix}${uri}`, async ctx => { + const { request, response } = await this.#requestProcessing(ctx, route[method][uri]); + if(response != null && config.system.requestLog) + logger.info(`<- ${request.method} ${request.url} ${response.time - request.time}ms`); + }); + } + } + logger.info(`Route ${config.service.urlPrefix || ""}${prefix} attached`); + }); + this.app.use(this.router.routes()); + this.app.use((ctx: any) => { + const request = new Request(ctx); + logger.debug(`-> ${ctx.request.method} ${ctx.request.url} request is not supported - ${request.remoteIP || "unknown"}`); + // const failureBody = new FailureBody(new Exception(EX.SYSTEM_NOT_ROUTE_MATCHING, "Request is not supported")); + // const response = new Response(failureBody); + const message = `[请求有误]: 正确请求为 POST -> /v1/chat/completions,当前请求为 ${ctx.request.method} -> ${ctx.request.url} 请纠正`; + logger.warn(message); + const failureBody = new FailureBody(new Error(message)); + const response = new Response(failureBody); + response.injectTo(ctx); + if(config.system.requestLog) + logger.info(`<- ${request.method} ${request.url} ${response.time - request.time}ms`); + }); + } + + /** + * 请求处理 + * + * @param ctx 上下文 + * @param routeFn 路由方法 + */ + #requestProcessing(ctx: any, routeFn: Function): Promise { + return new Promise(resolve => { + const request = new Request(ctx); + try { + if(config.system.requestLog) + logger.info(`-> ${request.method} ${request.url}`); + routeFn(request) + .then(response => { + try { + if(!Response.isInstance(response)) { + const _response = new Response(response); + _response.injectTo(ctx); + return resolve({ request, response: _response }); + } + response.injectTo(ctx); + resolve({ request, response }); + } + catch(err) { + logger.error(err); + const failureBody = new FailureBody(err); + const response = new Response(failureBody); + response.injectTo(ctx); + resolve({ request, response }); + } + }) + .catch(err => { + try { + logger.error(err); + const failureBody = new FailureBody(err); + const response = new Response(failureBody); + response.injectTo(ctx); + resolve({ request, response }); + } + catch(err) { + logger.error(err); + const failureBody = new FailureBody(err); + const response = new Response(failureBody); + response.injectTo(ctx); + resolve({ request, response }); + } + }); + } + catch(err) { + logger.error(err); + const failureBody = new FailureBody(err); + const response = new Response(failureBody); + response.injectTo(ctx); + resolve({ request, response }); + } + }); + } + + /** + * 监听端口 + */ + async listen() { + const host = config.service.host; + const port = config.service.port; + await Promise.all([ + new Promise((resolve, reject) => { + if(host === "0.0.0.0" || host === "localhost" || host === "127.0.0.1") + return resolve(null); + this.app.listen(port, "localhost", err => { + if(err) return reject(err); + resolve(null); + }); + }), + new Promise((resolve, reject) => { + this.app.listen(port, host, err => { + if(err) return reject(err); + resolve(null); + }); + }) + ]); + logger.success(`Server listening on port ${port} (${host})`); + } + +} + +export default new Server(); \ No newline at end of file diff --git a/src/lib/util.ts b/src/lib/util.ts new file mode 100644 index 0000000..0f3fd16 --- /dev/null +++ b/src/lib/util.ts @@ -0,0 +1,307 @@ +import os from "os"; +import path from "path"; +import crypto from "crypto"; +import { Readable, Writable } from "stream"; + +import "colors"; +import mime from "mime"; +import axios from "axios"; +import fs from "fs-extra"; +import { v1 as uuid } from "uuid"; +import { format as dateFormat } from "date-fns"; +import CRC32 from "crc-32"; +import randomstring from "randomstring"; +import _ from "lodash"; +import { CronJob } from "cron"; + +import HTTP_STATUS_CODE from "./http-status-codes.ts"; + +const autoIdMap = new Map(); + +const util = { + is2DArrays(value: any) { + return ( + _.isArray(value) && + (!value[0] || (_.isArray(value[0]) && _.isArray(value[value.length - 1]))) + ); + }, + + uuid: (separator = true) => (separator ? uuid() : uuid().replace(/\-/g, "")), + + autoId: (prefix = "") => { + let index = autoIdMap.get(prefix); + if (index > 999999) index = 0; //超过最大数字则重置为0 + autoIdMap.set(prefix, (index || 0) + 1); + return `${prefix}${index || 1}`; + }, + + ignoreJSONParse(value: string) { + const result = _.attempt(() => JSON.parse(value)); + if (_.isError(result)) return null; + return result; + }, + + generateRandomString(options: any): string { + return randomstring.generate(options); + }, + + getResponseContentType(value: any): string | null { + return value.headers + ? value.headers["content-type"] || value.headers["Content-Type"] + : null; + }, + + mimeToExtension(value: string) { + let extension = mime.getExtension(value); + if (extension == "mpga") return "mp3"; + return extension; + }, + + extractURLExtension(value: string) { + const extname = path.extname(new URL(value).pathname); + return extname.substring(1).toLowerCase(); + }, + + createCronJob(cronPatterns: any, callback?: Function) { + if (!_.isFunction(callback)) + throw new Error("callback must be an Function"); + return new CronJob( + cronPatterns, + () => callback(), + null, + false, + "Asia/Shanghai" + ); + }, + + getDateString(format = "yyyy-MM-dd", date = new Date()) { + return dateFormat(date, format); + }, + + getIPAddressesByIPv4(): string[] { + const interfaces = os.networkInterfaces(); + const addresses = []; + for (let name in interfaces) { + const networks = interfaces[name]; + const results = networks.filter( + (network) => + network.family === "IPv4" && + network.address !== "127.0.0.1" && + !network.internal + ); + if (results[0] && results[0].address) addresses.push(results[0].address); + } + return addresses; + }, + + getMACAddressesByIPv4(): string[] { + const interfaces = os.networkInterfaces(); + const addresses = []; + for (let name in interfaces) { + const networks = interfaces[name]; + const results = networks.filter( + (network) => + network.family === "IPv4" && + network.address !== "127.0.0.1" && + !network.internal + ); + if (results[0] && results[0].mac) addresses.push(results[0].mac); + } + return addresses; + }, + + generateSSEData(event?: string, data?: string, retry?: number) { + return `event: ${event || "message"}\ndata: ${(data || "") + .replace(/\n/g, "\\n") + .replace(/\s/g, "\\s")}\nretry: ${retry || 3000}\n\n`; + }, + + buildDataBASE64(type, ext, buffer) { + return `data:${type}/${ext.replace("jpg", "jpeg")};base64,${buffer.toString( + "base64" + )}`; + }, + + isLinux() { + return os.platform() !== "win32"; + }, + + isIPAddress(value) { + return ( + _.isString(value) && + (/^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$/.test( + value + ) || + /\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*/.test( + value + )) + ); + }, + + isPort(value) { + return _.isNumber(value) && value > 0 && value < 65536; + }, + + isReadStream(value): boolean { + return ( + value && + (value instanceof Readable || "readable" in value || value.readable) + ); + }, + + isWriteStream(value): boolean { + return ( + value && + (value instanceof Writable || "writable" in value || value.writable) + ); + }, + + isHttpStatusCode(value) { + return _.isNumber(value) && Object.values(HTTP_STATUS_CODE).includes(value); + }, + + isURL(value) { + return !_.isUndefined(value) && /^(http|https)/.test(value); + }, + + isSrc(value) { + return !_.isUndefined(value) && /^\/.+\.[0-9a-zA-Z]+(\?.+)?$/.test(value); + }, + + isBASE64(value) { + return !_.isUndefined(value) && /^[a-zA-Z0-9\/\+]+(=?)+$/.test(value); + }, + + isBASE64Data(value) { + return /^data:/.test(value); + }, + + extractBASE64DataFormat(value): string | null { + const match = value.trim().match(/^data:(.+);base64,/); + if (!match) return null; + return match[1]; + }, + + removeBASE64DataHeader(value): string { + return value.replace(/^data:(.+);base64,/, ""); + }, + + isDataString(value): boolean { + return /^(base64|json):/.test(value); + }, + + isStringNumber(value) { + return _.isFinite(Number(value)); + }, + + isUnixTimestamp(value) { + return /^[0-9]{10}$/.test(`${value}`); + }, + + isTimestamp(value) { + return /^[0-9]{13}$/.test(`${value}`); + }, + + isEmail(value) { + return /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/.test( + value + ); + }, + + isAsyncFunction(value) { + return Object.prototype.toString.call(value) === "[object AsyncFunction]"; + }, + + async isAPNG(filePath) { + let head; + const readStream = fs.createReadStream(filePath, { start: 37, end: 40 }); + const readPromise = new Promise((resolve, reject) => { + readStream.once("end", resolve); + readStream.once("error", reject); + }); + readStream.once("data", (data) => (head = data)); + await readPromise; + return head.compare(Buffer.from([0x61, 0x63, 0x54, 0x4c])) === 0; + }, + + unixTimestamp() { + return parseInt(`${Date.now() / 1000}`); + }, + + timestamp() { + return Date.now(); + }, + + urlJoin(...values) { + let url = ""; + for (let i = 0; i < values.length; i++) + url += `${i > 0 ? "/" : ""}${values[i] + .replace(/^\/*/, "") + .replace(/\/*$/, "")}`; + return url; + }, + + millisecondsToHmss(milliseconds) { + if (_.isString(milliseconds)) return milliseconds; + milliseconds = parseInt(milliseconds); + const sec = Math.floor(milliseconds / 1000); + const hours = Math.floor(sec / 3600); + const minutes = Math.floor((sec - hours * 3600) / 60); + const seconds = sec - hours * 3600 - minutes * 60; + const ms = (milliseconds % 60000) - seconds * 1000; + return `${hours > 9 ? hours : "0" + hours}:${ + minutes > 9 ? minutes : "0" + minutes + }:${seconds > 9 ? seconds : "0" + seconds}.${ms}`; + }, + + millisecondsToTimeString(milliseconds) { + if (milliseconds < 1000) return `${milliseconds}ms`; + if (milliseconds < 60000) + return `${parseFloat((milliseconds / 1000).toFixed(2))}s`; + return `${Math.floor(milliseconds / 1000 / 60)}m${Math.floor( + (milliseconds / 1000) % 60 + )}s`; + }, + + rgbToHex(r, g, b): string { + return ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1); + }, + + hexToRgb(hex) { + const value = parseInt(hex.replace(/^#/, ""), 16); + return [(value >> 16) & 255, (value >> 8) & 255, value & 255]; + }, + + md5(value) { + return crypto.createHash("md5").update(value).digest("hex"); + }, + + crc32(value) { + return _.isBuffer(value) ? CRC32.buf(value) : CRC32.str(value); + }, + + arrayParse(value): any[] { + return _.isArray(value) ? value : [value]; + }, + + booleanParse(value) { + return value === "true" || value === true ? true : false; + }, + + encodeBASE64(value) { + return Buffer.from(value).toString("base64"); + }, + + decodeBASE64(value) { + return Buffer.from(value, "base64").toString(); + }, + + async fetchFileBASE64(url: string) { + const result = await axios.get(url, { + responseType: "arraybuffer", + }); + return result.data.toString("base64"); + }, +}; + +export default util; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..b6477c3 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "allowImportingTsExtensions": true, + "allowSyntheticDefaultImports": true, + "noEmit": true, + "paths": { + "@/*": ["src/*"] + }, + "outDir": "./dist" + }, + "include": ["src/**/*", "libs.d.ts"], + "exclude": ["node_modules", "dist"] +} \ No newline at end of file diff --git a/vercel.json b/vercel.json new file mode 100644 index 0000000..74f98bc --- /dev/null +++ b/vercel.json @@ -0,0 +1,27 @@ +{ + "builds": [ + { + "src": "./dist/*.html", + "use": "@vercel/static" + }, + { + "src": "./dist/index.js", + "use": "@vercel/node" + } + ], + "routes": [ + { + "src": "/", + "dest": "/dist/welcome.html" + }, + { + "src": "/(.*)", + "dest": "/dist", + "headers": { + "Access-Control-Allow-Credentials": "true", + "Access-Control-Allow-Methods": "GET,OPTIONS,PATCH,DELETE,POST,PUT", + "Access-Control-Allow-Headers": "X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, X-Api-Version, Content-Type, Authorization" + } + } + ] +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..0b53d68 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,1742 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@esbuild/aix-ppc64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.23.0.tgz#145b74d5e4a5223489cabdc238d8dad902df5259" + integrity sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ== + +"@esbuild/android-arm64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.23.0.tgz#453bbe079fc8d364d4c5545069e8260228559832" + integrity sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ== + +"@esbuild/android-arm@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.23.0.tgz#26c806853aa4a4f7e683e519cd9d68e201ebcf99" + integrity sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g== + +"@esbuild/android-x64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.23.0.tgz#1e51af9a6ac1f7143769f7ee58df5b274ed202e6" + integrity sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ== + +"@esbuild/darwin-arm64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.23.0.tgz#d996187a606c9534173ebd78c58098a44dd7ef9e" + integrity sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow== + +"@esbuild/darwin-x64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.23.0.tgz#30c8f28a7ef4e32fe46501434ebe6b0912e9e86c" + integrity sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ== + +"@esbuild/freebsd-arm64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.0.tgz#30f4fcec8167c08a6e8af9fc14b66152232e7fb4" + integrity sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw== + +"@esbuild/freebsd-x64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.23.0.tgz#1003a6668fe1f5d4439e6813e5b09a92981bc79d" + integrity sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ== + +"@esbuild/linux-arm64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.23.0.tgz#3b9a56abfb1410bb6c9138790f062587df3e6e3a" + integrity sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw== + +"@esbuild/linux-arm@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.23.0.tgz#237a8548e3da2c48cd79ae339a588f03d1889aad" + integrity sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw== + +"@esbuild/linux-ia32@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.23.0.tgz#4269cd19cb2de5de03a7ccfc8855dde3d284a238" + integrity sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA== + +"@esbuild/linux-loong64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.23.0.tgz#82b568f5658a52580827cc891cb69d2cb4f86280" + integrity sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A== + +"@esbuild/linux-mips64el@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.23.0.tgz#9a57386c926262ae9861c929a6023ed9d43f73e5" + integrity sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w== + +"@esbuild/linux-ppc64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.23.0.tgz#f3a79fd636ba0c82285d227eb20ed8e31b4444f6" + integrity sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw== + +"@esbuild/linux-riscv64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.23.0.tgz#f9d2ef8356ce6ce140f76029680558126b74c780" + integrity sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw== + +"@esbuild/linux-s390x@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.23.0.tgz#45390f12e802201f38a0229e216a6aed4351dfe8" + integrity sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg== + +"@esbuild/linux-x64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.23.0.tgz#c8409761996e3f6db29abcf9b05bee8d7d80e910" + integrity sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ== + +"@esbuild/netbsd-x64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.23.0.tgz#ba70db0114380d5f6cfb9003f1d378ce989cd65c" + integrity sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw== + +"@esbuild/openbsd-arm64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.0.tgz#72fc55f0b189f7a882e3cf23f332370d69dfd5db" + integrity sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ== + +"@esbuild/openbsd-x64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.23.0.tgz#b6ae7a0911c18fe30da3db1d6d17a497a550e5d8" + integrity sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg== + +"@esbuild/sunos-x64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.23.0.tgz#58f0d5e55b9b21a086bfafaa29f62a3eb3470ad8" + integrity sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA== + +"@esbuild/win32-arm64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.23.0.tgz#b858b2432edfad62e945d5c7c9e5ddd0f528ca6d" + integrity sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ== + +"@esbuild/win32-ia32@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.23.0.tgz#167ef6ca22a476c6c0c014a58b4f43ae4b80dec7" + integrity sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA== + +"@esbuild/win32-x64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.23.0.tgz#db44a6a08520b5f25bbe409f34a59f2d4bcc7ced" + integrity sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g== + +"@hapi/bourne@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-3.0.0.tgz#f11fdf7dda62fe8e336fa7c6642d9041f30356d7" + integrity sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w== + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + +"@jridgewell/trace-mapping@^0.3.24": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@rollup/rollup-android-arm-eabi@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.19.1.tgz#7746deb85e4a8fb54fbfda8ac5c102692f102476" + integrity sha512-XzqSg714++M+FXhHfXpS1tDnNZNpgxxuGZWlRG/jSj+VEPmZ0yg6jV4E0AL3uyBKxO8mO3xtOsP5mQ+XLfrlww== + +"@rollup/rollup-android-arm64@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.19.1.tgz#93de4d867709d3313794723b5afd91e1e174f906" + integrity sha512-thFUbkHteM20BGShD6P08aungq4irbIZKUNbG70LN8RkO7YztcGPiKTTGZS7Kw+x5h8hOXs0i4OaHwFxlpQN6A== + +"@rollup/rollup-darwin-arm64@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.19.1.tgz#e41e6a81673260ab196e0f59462b9940a6ac03cd" + integrity sha512-8o6eqeFZzVLia2hKPUZk4jdE3zW7LCcZr+MD18tXkgBBid3lssGVAYuox8x6YHoEPDdDa9ixTaStcmx88lio5Q== + +"@rollup/rollup-darwin-x64@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.19.1.tgz#2b0a0aef6e8c5317d494cfc9076d7a16b099bdcb" + integrity sha512-4T42heKsnbjkn7ovYiAdDVRRWZLU9Kmhdt6HafZxFcUdpjlBlxj4wDrt1yFWLk7G4+E+8p2C9tcmSu0KA6auGA== + +"@rollup/rollup-linux-arm-gnueabihf@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.19.1.tgz#e22319deb5367384ef315e66bc6de80d2bf2b3ae" + integrity sha512-MXg1xp+e5GhZ3Vit1gGEyoC+dyQUBy2JgVQ+3hUrD9wZMkUw/ywgkpK7oZgnB6kPpGrxJ41clkPPnsknuD6M2Q== + +"@rollup/rollup-linux-arm-musleabihf@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.19.1.tgz#d5dd68f5d7ae21b345a5c87208c94e5c813f54b8" + integrity sha512-DZNLwIY4ftPSRVkJEaxYkq7u2zel7aah57HESuNkUnz+3bZHxwkCUkrfS2IWC1sxK6F2QNIR0Qr/YXw7nkF3Pw== + +"@rollup/rollup-linux-arm64-gnu@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.19.1.tgz#1703d3a418d33f8f025acaf93f39ca1efcd5b645" + integrity sha512-C7evongnjyxdngSDRRSQv5GvyfISizgtk9RM+z2biV5kY6S/NF/wta7K+DanmktC5DkuaJQgoKGf7KUDmA7RUw== + +"@rollup/rollup-linux-arm64-musl@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.19.1.tgz#3f59c2c6e60f75ce8b1090bd841c555e3bb01f0e" + integrity sha512-89tFWqxfxLLHkAthAcrTs9etAoBFRduNfWdl2xUs/yLV+7XDrJ5yuXMHptNqf1Zw0UCA3cAutkAiAokYCkaPtw== + +"@rollup/rollup-linux-powerpc64le-gnu@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.19.1.tgz#3f99a0921596a6f539121a312df29af52a205f15" + integrity sha512-PromGeV50sq+YfaisG8W3fd+Cl6mnOOiNv2qKKqKCpiiEke2KiKVyDqG/Mb9GWKbYMHj5a01fq/qlUR28PFhCQ== + +"@rollup/rollup-linux-riscv64-gnu@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.19.1.tgz#c08fb3e629d50d2eac31329347cfc559a1cf81d1" + integrity sha512-/1BmHYh+iz0cNCP0oHCuF8CSiNj0JOGf0jRlSo3L/FAyZyG2rGBuKpkZVH9YF+x58r1jgWxvm1aRg3DHrLDt6A== + +"@rollup/rollup-linux-s390x-gnu@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.19.1.tgz#173722cd745779d730d4b24d21386185e0e12de8" + integrity sha512-0cYP5rGkQWRZKy9/HtsWVStLXzCF3cCBTRI+qRL8Z+wkYlqN7zrSYm6FuY5Kd5ysS5aH0q5lVgb/WbG4jqXN1Q== + +"@rollup/rollup-linux-x64-gnu@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.19.1.tgz#0af2b6541ab0f4954d2c4f96bcdc7947420dd28c" + integrity sha512-XUXeI9eM8rMP8aGvii/aOOiMvTs7xlCosq9xCjcqI9+5hBxtjDpD+7Abm1ZhVIFE1J2h2VIg0t2DX/gjespC2Q== + +"@rollup/rollup-linux-x64-musl@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.19.1.tgz#f973f9552744764b221128f7c3629222216ace69" + integrity sha512-V7cBw/cKXMfEVhpSvVZhC+iGifD6U1zJ4tbibjjN+Xi3blSXaj/rJynAkCFFQfoG6VZrAiP7uGVzL440Q6Me2Q== + +"@rollup/rollup-win32-arm64-msvc@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.19.1.tgz#21ac5ed84d914bc31821fec3dd909f7257cfb17b" + integrity sha512-88brja2vldW/76jWATlBqHEoGjJLRnP0WOEKAUbMcXaAZnemNhlAHSyj4jIwMoP2T750LE9lblvD4e2jXleZsA== + +"@rollup/rollup-win32-ia32-msvc@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.19.1.tgz#0cfe740063b35dcd5a62c4e243226631a846ce11" + integrity sha512-LdxxcqRVSXi6k6JUrTah1rHuaupoeuiv38du8Mt4r4IPer3kwlTo+RuvfE8KzZ/tL6BhaPlzJ3835i6CxrFIRQ== + +"@rollup/rollup-win32-x64-msvc@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.19.1.tgz#5f2c40d3f1b53ede80fb4e6964f840c0f8936832" + integrity sha512-2bIrL28PcK3YCqD9anGxDxamxdiJAxA+l7fWIwM5o8UqNy1t3d1NdAweO2XhA0KTDJ5aH1FsuiT5+7VhtHliXg== + +"@types/estree@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + +"@types/formidable@^2.0.4": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/formidable/-/formidable-2.0.6.tgz#811ed3cd8a8a7675e02420b3f861c317e055376a" + integrity sha512-L4HcrA05IgQyNYJj6kItuIkXrInJvsXTPC5B1i64FggWKKqSL+4hgt7asiSNva75AoLQjq29oPxFfU4GAQ6Z2w== + dependencies: + "@types/node" "*" + +"@types/lodash@^4.14.202": + version "4.17.7" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.7.tgz#2f776bcb53adc9e13b2c0dfd493dfcbd7de43612" + integrity sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA== + +"@types/luxon@~3.4.0": + version "3.4.2" + resolved "https://registry.yarnpkg.com/@types/luxon/-/luxon-3.4.2.tgz#e4fc7214a420173cea47739c33cdf10874694db7" + integrity sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA== + +"@types/mime@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.4.tgz#2198ac274de6017b44d941e00261d5bc6a0e0a45" + integrity sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw== + +"@types/node@*": + version "20.14.12" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.12.tgz#129d7c3a822cb49fc7ff661235f19cfefd422b49" + integrity sha512-r7wNXakLeSsGT0H1AU863vS2wa5wBOK4bWMjZz2wj+8nBx+m5PeIn0k8AloSLpRuiwdRQZwarZqHE4FNArPuJQ== + dependencies: + undici-types "~5.26.4" + +accepts@^1.3.5: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-styles@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +asap@^2.0.0: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +axios@^1.6.7: + version "1.7.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.2.tgz#b625db8a7051fbea61c35a3cbb3a1daa7b9c7621" + integrity sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +bundle-require@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/bundle-require/-/bundle-require-5.0.0.tgz#071521bdea6534495cf23e92a83f889f91729e93" + integrity sha512-GuziW3fSSmopcx4KRymQEJVbZUfqlCqcq7dvs6TYwKRZiegK/2buMxQTPs6MGlNv50wms1699qYO54R8XfRX4w== + dependencies: + load-tsconfig "^0.2.3" + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +cac@^6.7.14: + version "6.7.14" + resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" + integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== + +cache-content-type@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-content-type/-/cache-content-type-1.0.1.tgz#035cde2b08ee2129f4a8315ea8f00a00dba1453c" + integrity sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA== + dependencies: + mime-types "^2.1.18" + ylru "^1.2.0" + +call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" + +chokidar@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + 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" + +co-body@^5.1.1: + version "5.2.0" + resolved "https://registry.yarnpkg.com/co-body/-/co-body-5.2.0.tgz#5a0a658c46029131e0e3a306f67647302f71c124" + integrity sha512-sX/LQ7LqUhgyaxzbe7IqwPeTr2yfpfUIQ/dgpKo6ZI4y4lpQA0YxAomWIY+7I7rHWcG02PG+OuPREzMW/5tszQ== + dependencies: + inflation "^2.0.0" + qs "^6.4.0" + raw-body "^2.2.0" + type-is "^1.6.14" + +co-body@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/co-body/-/co-body-6.2.0.tgz#afd776d60e5659f4eee862df83499698eb1aea1b" + integrity sha512-Kbpv2Yd1NdL1V/V4cwLVxraHDV6K8ayohr2rmH0J87Er8+zJjcTa6dAn9QMPC9CRgU8+aNajKbSf1TzDB1yKPA== + dependencies: + "@hapi/bourne" "^3.0.0" + inflation "^2.0.0" + qs "^6.5.2" + raw-body "^2.3.3" + type-is "^1.6.16" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colors@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +consola@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/consola/-/consola-3.2.3.tgz#0741857aa88cfa0d6fd53f1cff0375136e98502f" + integrity sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ== + +content-disposition@~0.5.2: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +cookies@~0.9.0: + version "0.9.1" + resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.9.1.tgz#3ffed6f60bb4fb5f146feeedba50acc418af67e3" + integrity sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw== + dependencies: + depd "~2.0.0" + keygrip "~1.1.0" + +copy-to@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/copy-to/-/copy-to-2.0.1.tgz#2680fbb8068a48d08656b6098092bdafc906f4a5" + integrity sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w== + +crc-32@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" + integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== + +cron@^3.1.6: + version "3.1.7" + resolved "https://registry.yarnpkg.com/cron/-/cron-3.1.7.tgz#3423d618ba625e78458fff8cb67001672d49ba0d" + integrity sha512-tlBg7ARsAMQLzgwqVxy8AZl/qlTc5nibqYwtNGoCrd+cV+ugI+tvZC1oT/8dFH8W455YrywGykx/KMmAqOr7Jw== + dependencies: + "@types/luxon" "~3.4.0" + luxon "~3.4.0" + +cross-spawn@^7.0.0, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +date-fns@^3.3.1: + version "3.6.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-3.6.0.tgz#f20ca4fe94f8b754951b24240676e8618c0206bf" + integrity sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww== + +debug@^4.3.2, debug@^4.3.4, debug@^4.3.5: + version "4.3.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" + integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== + dependencies: + ms "2.1.2" + +deep-equal@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + integrity sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw== + +define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== + +depd@2.0.0, depd@^2.0.0, depd@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + +destroy@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +dezalgo@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.4.tgz#751235260469084c132157dfa857f386d4c33d81" + integrity sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig== + dependencies: + asap "^2.0.0" + wrappy "1" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +encodeurl@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +esbuild@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.23.0.tgz#de06002d48424d9fdb7eb52dbe8e95927f852599" + integrity sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA== + optionalDependencies: + "@esbuild/aix-ppc64" "0.23.0" + "@esbuild/android-arm" "0.23.0" + "@esbuild/android-arm64" "0.23.0" + "@esbuild/android-x64" "0.23.0" + "@esbuild/darwin-arm64" "0.23.0" + "@esbuild/darwin-x64" "0.23.0" + "@esbuild/freebsd-arm64" "0.23.0" + "@esbuild/freebsd-x64" "0.23.0" + "@esbuild/linux-arm" "0.23.0" + "@esbuild/linux-arm64" "0.23.0" + "@esbuild/linux-ia32" "0.23.0" + "@esbuild/linux-loong64" "0.23.0" + "@esbuild/linux-mips64el" "0.23.0" + "@esbuild/linux-ppc64" "0.23.0" + "@esbuild/linux-riscv64" "0.23.0" + "@esbuild/linux-s390x" "0.23.0" + "@esbuild/linux-x64" "0.23.0" + "@esbuild/netbsd-x64" "0.23.0" + "@esbuild/openbsd-arm64" "0.23.0" + "@esbuild/openbsd-x64" "0.23.0" + "@esbuild/sunos-x64" "0.23.0" + "@esbuild/win32-arm64" "0.23.0" + "@esbuild/win32-ia32" "0.23.0" + "@esbuild/win32-x64" "0.23.0" + +escape-html@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +eventsource-parser@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/eventsource-parser/-/eventsource-parser-1.1.2.tgz#ed6154a4e3dbe7cda9278e5e35d2ffc58b309f89" + integrity sha512-v0eOBUbiaFojBu2s2NPBfYUoRR9GjcDNvCXVaqEf5vVfpIAh9f8RCo4vXTP8c63QRKCFwoLpMpTdPwwhEKVgzA== + +execa@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +fast-glob@^3.2.9: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fastq@^1.6.0: + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + dependencies: + reusify "^1.0.4" + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +follow-redirects@^1.15.6: + version "1.15.6" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" + integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== + +foreground-child@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.2.1.tgz#767004ccf3a5b30df39bed90718bab43fe0a59f7" + integrity sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +formidable@^2.0.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/formidable/-/formidable-2.1.2.tgz#fa973a2bec150e4ce7cac15589d7a25fc30ebd89" + integrity sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g== + dependencies: + dezalgo "^1.0.4" + hexoid "^1.0.0" + once "^1.4.0" + qs "^6.11.0" + +fresh@~0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs-extra@^11.2.0: + version "11.2.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" + integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@^10.3.10: + version "10.4.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== + 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" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +hasown@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +hexoid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hexoid/-/hexoid-1.0.0.tgz#ad10c6573fb907de23d9ec63a711267d9dc9bc18" + integrity sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g== + +http-assert@^1.3.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/http-assert/-/http-assert-1.5.0.tgz#c389ccd87ac16ed2dfa6246fd73b926aa00e6b8f" + integrity sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w== + dependencies: + deep-equal "~1.0.1" + http-errors "~1.8.0" + +http-errors@2.0.0, http-errors@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-errors@^1.6.3, http-errors@~1.8.0: + version "1.8.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" + integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.1" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ignore@^5.2.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" + integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + +inflation@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/inflation/-/inflation-2.1.0.tgz#9214db11a47e6f756d111c4f9df96971c60f886c" + integrity sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ== + +inherits@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +jackspeak@^3.1.2: + version "3.4.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +joycon@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" + integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +keygrip@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.1.0.tgz#871b1681d5e159c62a445b0c74b615e0917e7226" + integrity sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ== + dependencies: + tsscmp "1.0.6" + +koa-body@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/koa-body/-/koa-body-5.0.0.tgz#d310372bea09a24ccc450c76ca142ee55395dda6" + integrity sha512-nHwEODrQGiyKBILCWO8QSS40C87cKr2cp3y/Cw8u9Z8w5t0CdSkGm3+y9WK5BIAlPpo9tTw5RtSbxpVyG79vmw== + dependencies: + "@types/formidable" "^2.0.4" + co-body "^5.1.1" + formidable "^2.0.1" + +koa-bodyparser@^4.4.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/koa-bodyparser/-/koa-bodyparser-4.4.1.tgz#a908d848e142cc57d9eece478e932bf00dce3029" + integrity sha512-kBH3IYPMb+iAXnrxIhXnW+gXV8OTzCu8VPDqvcDHW9SQrbkHmqPQtiZwrltNmSq6/lpipHnT7k7PsjlVD7kK0w== + dependencies: + co-body "^6.0.0" + copy-to "^2.0.1" + type-is "^1.6.18" + +koa-compose@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877" + integrity sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw== + +koa-convert@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/koa-convert/-/koa-convert-2.0.0.tgz#86a0c44d81d40551bae22fee6709904573eea4f5" + integrity sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA== + dependencies: + co "^4.6.0" + koa-compose "^4.1.0" + +koa-range@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/koa-range/-/koa-range-0.3.0.tgz#3588e3496473a839a1bd264d2a42b1d85bd7feac" + integrity sha512-Ich3pCz6RhtbajYXRWjIl6O5wtrLs6kE3nkXc9XmaWe+MysJyZO7K4L3oce1Jpg/iMgCbj+5UCiMm/rqVtcDIg== + dependencies: + stream-slice "^0.1.2" + +koa-router@^12.0.1: + version "12.0.1" + resolved "https://registry.yarnpkg.com/koa-router/-/koa-router-12.0.1.tgz#a3c1c331032d442da786f0631d23e74d51b6882e" + integrity sha512-gaDdj3GtzoLoeosacd50kBBTnnh3B9AYxDThQUo4sfUyXdOhY6ku1qyZKW88tQCRgc3Sw6ChXYXWZwwgjOxE0w== + dependencies: + debug "^4.3.4" + http-errors "^2.0.0" + koa-compose "^4.1.0" + methods "^1.1.2" + path-to-regexp "^6.2.1" + +koa2-cors@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/koa2-cors/-/koa2-cors-2.0.6.tgz#9ad23df3a0b9bb84530b46f5944f3fb576086554" + integrity sha512-JRCcSM4lamM+8kvKGDKlesYk2ASrmSTczDtGUnIadqMgnHU4Ct5Gw7Bxt3w3m6d6dy3WN0PU4oMP43HbddDEWg== + +koa@^2.15.0: + version "2.15.3" + resolved "https://registry.yarnpkg.com/koa/-/koa-2.15.3.tgz#062809266ee75ce0c75f6510a005b0e38f8c519a" + integrity sha512-j/8tY9j5t+GVMLeioLaxweJiKUayFhlGqNTzf2ZGwL0ZCQijd2RLHK0SLW5Tsko8YyyqCZC2cojIb0/s62qTAg== + dependencies: + accepts "^1.3.5" + cache-content-type "^1.0.0" + content-disposition "~0.5.2" + content-type "^1.0.4" + cookies "~0.9.0" + debug "^4.3.2" + delegates "^1.0.0" + depd "^2.0.0" + destroy "^1.0.4" + encodeurl "^1.0.2" + escape-html "^1.0.3" + fresh "~0.5.2" + http-assert "^1.3.0" + http-errors "^1.6.3" + is-generator-function "^1.0.7" + koa-compose "^4.1.0" + koa-convert "^2.0.0" + on-finished "^2.3.0" + only "~0.0.2" + parseurl "^1.3.2" + statuses "^1.5.0" + type-is "^1.6.16" + vary "^1.1.2" + +lilconfig@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.2.tgz#e4a7c3cb549e3a606c8dcc32e5ae1005e62c05cb" + integrity sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +load-tsconfig@^0.2.3: + version "0.2.5" + resolved "https://registry.yarnpkg.com/load-tsconfig/-/load-tsconfig-0.2.5.tgz#453b8cd8961bfb912dea77eb6c168fe8cca3d3a1" + integrity sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg== + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== + +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +lru-cache@^10.2.0: + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== + +luxon@~3.4.0: + version "3.4.4" + resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.4.4.tgz#cf20dc27dc532ba41a169c43fdcc0063601577af" + integrity sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +micromatch@^4.0.4: + version "4.0.7" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" + integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@^2.1.18, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@^4.0.1: + version "4.0.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-4.0.4.tgz#9f851b0fc3c289d063b20a7a8055b3014b25664b" + integrity sha512-v8yqInVjhXyqP6+Kw4fV3ZzeMRqEW6FotRsKXjRS5VMTNIuXsdRoAvklpoRgSqXm6o9VNH4/C0mgedko9DdLsQ== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +object-assign@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.13.1: + version "1.13.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" + integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== + +on-finished@^2.3.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +only@~0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4" + integrity sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ== + +package-json-from-dist@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" + integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== + +parseurl@^1.3.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +path-to-regexp@^6.2.1: + version "6.2.2" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.2.2.tgz#324377a83e5049cbecadc5554d6a63a9a4866b36" + integrity sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picocolors@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" + integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pirates@^4.0.1: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +postcss-load-config@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-6.0.1.tgz#6fd7dcd8ae89badcf1b2d644489cbabf83aa8096" + integrity sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g== + dependencies: + lilconfig "^3.1.1" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +qs@^6.11.0, qs@^6.4.0, qs@^6.5.2: + version "6.12.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.12.3.tgz#e43ce03c8521b9c7fd7f1f13e514e5ca37727754" + integrity sha512-AWJm14H1vVaO/iNZ4/hO+HyaTehuy9nRqVdkTqlJt0HWvBiBIEXFmb4C0DGeYo3Xes9rrEW+TxHsaigCbN5ICQ== + dependencies: + side-channel "^1.0.6" + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +randombytes@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.3.tgz#674c99760901c3c4112771a31e521dc349cc09ec" + integrity sha512-lDVjxQQFoCG1jcrP06LNo2lbWp4QTShEXnhActFBwYuHprllQV6VUpwreApsYqCgD+N1mHoqJ/BI/4eV4R2GYg== + +randomstring@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/randomstring/-/randomstring-1.3.0.tgz#1bf9d730066899e70aee3285573f84708278683d" + integrity sha512-gY7aQ4i1BgwZ8I1Op4YseITAyiDiajeZOPQUbIq9TPGPhUm5FX59izIaOpmKbME1nmnEiABf28d9K2VSii6BBg== + dependencies: + randombytes "2.0.3" + +raw-body@^2.2.0, raw-body@^2.3.3: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rollup@^4.19.0: + version "4.19.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.19.1.tgz#21d865cd60d4a325172ce8b082e60caccd97b309" + integrity sha512-K5vziVlg7hTpYfFBI+91zHBEMo6jafYXpkMlqZjg7/zhIG9iHqazBf4xz9AVdjS9BruRn280ROqLI7G3OFRIlw== + dependencies: + "@types/estree" "1.0.5" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.19.1" + "@rollup/rollup-android-arm64" "4.19.1" + "@rollup/rollup-darwin-arm64" "4.19.1" + "@rollup/rollup-darwin-x64" "4.19.1" + "@rollup/rollup-linux-arm-gnueabihf" "4.19.1" + "@rollup/rollup-linux-arm-musleabihf" "4.19.1" + "@rollup/rollup-linux-arm64-gnu" "4.19.1" + "@rollup/rollup-linux-arm64-musl" "4.19.1" + "@rollup/rollup-linux-powerpc64le-gnu" "4.19.1" + "@rollup/rollup-linux-riscv64-gnu" "4.19.1" + "@rollup/rollup-linux-s390x-gnu" "4.19.1" + "@rollup/rollup-linux-x64-gnu" "4.19.1" + "@rollup/rollup-linux-x64-musl" "4.19.1" + "@rollup/rollup-win32-arm64-msvc" "4.19.1" + "@rollup/rollup-win32-ia32-msvc" "4.19.1" + "@rollup/rollup-win32-x64-msvc" "4.19.1" + fsevents "~2.3.2" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-buffer@5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + +signal-exit@^3.0.3: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +source-map@0.8.0-beta.0: + version "0.8.0-beta.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.8.0-beta.0.tgz#d4c1bb42c3f7ee925f005927ba10709e0d1d1f11" + integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== + dependencies: + whatwg-url "^7.0.0" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +"statuses@>= 1.5.0 < 2", statuses@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +stream-slice@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/stream-slice/-/stream-slice-0.1.2.tgz#2dc4f4e1b936fb13f3eb39a2def1932798d07a4b" + integrity sha512-QzQxpoacatkreL6jsxnVb7X5R/pGw9OUv2qWTYWnmLpg4NdN31snPy/f3TdQE1ZUXaThRvj1Zw4/OGg0ZkaLMA== + +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.1.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +sucrase@^3.35.0: + version "3.35.0" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" + integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== + 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" + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA== + dependencies: + punycode "^2.1.0" + +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + +tsscmp@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb" + integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA== + +tsup@^8.0.2: + version "8.2.3" + resolved "https://registry.yarnpkg.com/tsup/-/tsup-8.2.3.tgz#4a1ff2962a4d7c8265fea661b0dd9668de58916d" + integrity sha512-6YNT44oUfXRbZuSMNmN36GzwPPIlD2wBccY7looM2fkTcxkf2NEmwr3OZuDZoySklnrIG4hoEtzy8yUXYOqNcg== + dependencies: + bundle-require "^5.0.0" + cac "^6.7.14" + chokidar "^3.6.0" + consola "^3.2.3" + debug "^4.3.5" + esbuild "^0.23.0" + execa "^5.1.1" + globby "^11.1.0" + joycon "^3.1.1" + picocolors "^1.0.1" + postcss-load-config "^6.0.1" + resolve-from "^5.0.0" + rollup "^4.19.0" + source-map "0.8.0-beta.0" + sucrase "^3.35.0" + tree-kill "^1.2.2" + +type-is@^1.6.14, type-is@^1.6.16, type-is@^1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typescript@^5.3.3: + version "5.5.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" + integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + +unpipe@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +uuid@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== + +vary@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +yaml@^2.3.4: + version "2.5.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.5.0.tgz#c6165a721cf8000e91c36490a41d7be25176cf5d" + integrity sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw== + +ylru@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ylru/-/ylru-1.4.0.tgz#0cf0aa57e9c24f8a2cbde0cc1ca2c9592ac4e0f6" + integrity sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==