commit d96c6c7cafd953ce0806367e0bd660f487d1778a
Author: Alex <8125011+alex-kinokon@users.noreply.github.com>
Date: Thu Aug 3 20:06:58 2023 -0400
Public commit
diff --git a/.env.example b/.env.example
new file mode 100644
index 0000000..6f576e2
--- /dev/null
+++ b/.env.example
@@ -0,0 +1,4 @@
+CROWDIN_PERSONAL_TOKEN="TOKEN"
+NEXT_PUBLIC_NAME="Extension"
+NEXT_PUBLIC_SUPABASE_URL="https://mysupabase.supabase.co"
+NEXT_PUBLIC_SUPABASE_KEY="TOKEN"
diff --git a/.eslintrc.js b/.eslintrc.js
new file mode 100644
index 0000000..6f28f55
--- /dev/null
+++ b/.eslintrc.js
@@ -0,0 +1,11 @@
+const { extendConfig } = require("@aet/eslint-rules")
+
+module.exports = extendConfig({
+ plugins: ["react", "react-hooks"],
+ rules: {
+ "@typescript-eslint/no-misused-promises": ["error", { checksVoidReturn: false }],
+ "@typescript-eslint/no-unsafe-argument": "off",
+ "@typescript-eslint/no-unsafe-assignment": "off",
+ "@typescript-eslint/no-unsafe-member-access": "off",
+ },
+})
diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml
new file mode 100644
index 0000000..bfa5d11
--- /dev/null
+++ b/.github/workflows/builds.yml
@@ -0,0 +1,47 @@
+name: Nightly Build
+
+on:
+ workflow_dispatch
+ # schedule:
+ # - cron: "0 0 * * *"
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+
+ - name: Use Node.js 14.x
+ uses: actions/setup-node@v2
+ with:
+ node-version: "14.x"
+ cache: "pnpm"
+
+ - name: Install dependencies
+ run: pnpm install
+
+ - name: Build
+ run: pnpm run build
+
+ - name: Create Release
+ id: create_release
+ uses: actions/create-release@v1
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ with:
+ tag_name: ${{ strftime('%Y-%m-%d-%H-%M-%S', localtime()) }}
+ release_name: Nightly Build ${{ github.sha }}
+ body: Nightly build
+ draft: false
+ prerelease: true
+
+ - name: Upload Release Asset
+ id: upload-release-asset
+ uses: actions/upload-release-asset@v1
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ with:
+ upload_url: ${{ steps.create_release.outputs.upload_url }}
+ asset_path: ./dist
+ asset_name: Nightly Build ${{ github.sha }}.zip
+ asset_content_type: application/zip
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..335bba6
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,149 @@
+src/generated
+eslint-local-rules/index.js
+gecko.zip
+repl.ts
+.jest
+/drafts
+/.1*.**.*
+src/context/temp
+shims
+*.generated
+*.generated.*
+*.module.css.d.ts
+dist/*.html
+dist/app
+dist/vendor
+dist/_locales/*
+!dist/_locales/en_US
+dist/assets/licenses.json
+src/bundle-analyzer
+
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+lerna-debug.log*
+.pnpm-debug.log*
+
+# Diagnostic reports (https://nodejs.org/api/report.html)
+report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
+
+# Runtime data
+pids
+*.pid
+*.seed
+*.pid.lock
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+*.lcov
+
+# nyc test coverage
+.nyc_output
+
+# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# Bower dependency directory (https://bower.io/)
+bower_components
+
+# node-waf configuration
+.lock-wscript
+
+# Compiled binary addons (https://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directories
+node_modules/
+jspm_packages/
+
+# Snowpack dependency directory (https://snowpack.dev/)
+web_modules/
+
+# TypeScript cache
+*.tsbuildinfo
+
+# Optional npm cache directory
+.npm
+
+# Optional eslint cache
+.eslintcache
+
+# Optional stylelint cache
+.stylelintcache
+
+# Microbundle cache
+.rpt2_cache/
+.rts2_cache_cjs/
+.rts2_cache_es/
+.rts2_cache_umd/
+
+# Optional REPL history
+.node_repl_history
+
+# Output of 'npm pack'
+*.tgz
+
+# Yarn Integrity file
+.yarn-integrity
+
+# dotenv environment variable files
+.env
+.env.development.local
+.env.test.local
+.env.production.local
+.env.local
+
+# parcel-bundler cache (https://parceljs.org/)
+.cache
+.parcel-cache
+
+# Next.js build output
+.next
+out
+
+# Nuxt.js build / generate output
+.nuxt
+
+# Gatsby files
+.cache/
+# Comment in the public line in if your project uses Gatsby and not Next.js
+# https://nextjs.org/blog/next-9-1#public-directory-support
+# public
+
+# vuepress build output
+.vuepress/dist
+
+# vuepress v2.x temp and cache directory
+.temp
+.cache
+
+# Docusaurus cache and generated files
+.docusaurus
+
+# Serverless directories
+.serverless/
+
+# FuseBox cache
+.fusebox/
+
+# DynamoDB Local files
+.dynamodb/
+
+# TernJS port file
+.tern-port
+
+# Stores VSCode versions used for testing VSCode extensions
+.vscode-test
+
+# yarn v2
+.yarn/cache
+.yarn/unplugged
+.yarn/build-state.yml
+.yarn/install-state.gz
+.pnp.*
diff --git a/.npmrc b/.npmrc
new file mode 100644
index 0000000..0191fc3
--- /dev/null
+++ b/.npmrc
@@ -0,0 +1,3 @@
+public-hoist-pattern[] = *eslint*
+public-hoist-pattern[] = *prettier*
+public-hoist-pattern[] = *immutable*
diff --git a/.vscode/commands.json b/.vscode/commands.json
new file mode 100644
index 0000000..f2ae3f6
--- /dev/null
+++ b/.vscode/commands.json
@@ -0,0 +1,3 @@
+{
+ "commands": []
+}
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..91c4806
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,12 @@
+{
+ "editor.formatOnSave": true,
+ "typescript.inlayHints.parameterNames.enabled": "none",
+ "json.schemas": [
+ {
+ "fileMatch": ["dist/manifest.json"],
+ "url": "https://json.schemastore.org/chrome-manifest.json"
+ }
+ ],
+ "typescript.tsdk": "node_modules/typescript/lib",
+ "cSpell.words": ["hookz", "submatch", "submatches"]
+}
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/Makefile b/Makefile
new file mode 100644
index 0000000..bbac0e3
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,58 @@
+# This file is generated by `make Makefile`
+Makefile: scripts/build-makefile.ts
+ @echo "✨ Building Makefile..."
+ @scripts/build-makefile.ts
+
+makefile: Makefile
+
+src/shared/theme/tokens.generated.ts src/shared/theme/tokens.generated.css: src/shared/theme/tokens.tsx \
+ scripts/build-theme.tsx
+ @echo "✨ Building theme..."
+ @scripts/build-theme.tsx -o $(@D)
+
+theme: src/shared/theme/tokens.generated.ts
+
+src/shared/models/enums.generated.ts src/shared/models/models.generated.ts: src/shared/models/models.yml \
+ ./scripts/build-models.ts
+ @echo "✨ Building models..."
+ @./scripts/build-models.ts
+
+models: src/shared/models/enums.generated.ts
+
+src/vendor/webextension-polyfill/api-metadata.generated.json: src/vendor/webextension-polyfill/LICENSE \
+ src/vendor/webextension-polyfill/README.md \
+ src/vendor/webextension-polyfill/api-metadata.json \
+ src/vendor/webextension-polyfill/package.json \
+ src/vendor/webextension-polyfill/scripts/compress.ts \
+ src/vendor/webextension-polyfill/src/browser-polyfill.js
+ @echo "✨ Building WebExtensionPolyfill..."
+ @./src/vendor/webextension-polyfill/scripts/compress.ts
+
+web-extension-polyfill: src/vendor/webextension-polyfill/api-metadata.generated.json
+
+dist/background.html dist/devtools.html dist/options.html dist/playground.html dist/popup.html dist/reference-bundled.html dist/reference.html: scripts/build-htmls.tsx
+ @echo "✨ Building HTML..."
+ @scripts/build-htmls.tsx
+
+html: dist/background.html
+
+dist/_locales/de_DE/messages.json dist/_locales/en_US/messages.json dist/_locales/es_ES/messages.json dist/_locales/fr_CA/messages.json dist/_locales/fr_FR/messages.json dist/_locales/ja_JP/messages.json dist/_locales/ko_KR/messages.json dist/_locales/zh_CN/messages.json dist/_locales/zh_TW/messages.json src/shared/i18n/data.generated.ts: scripts/build-locales.ts
+ @echo "✨ Building locales..."
+ @scripts/build-locales.ts
+
+locales: dist/_locales/de_DE/messages.json
+
+dist/vendor/sass/index.js: package.json \
+ ./scripts/build-sass.ts
+ @echo "✨ Building sass..."
+ @./scripts/build-sass.ts
+
+sass: dist/vendor/sass/index.js
+
+all: makefile \
+ theme \
+ models \
+ web-extension-polyfill \
+ html \
+ locales \
+ sass
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..bf6f0ef
--- /dev/null
+++ b/README.md
@@ -0,0 +1,15 @@
+# stylebot
+
+A userstyle manager extension.
+
+## Screenshot
+
+
+
+## Development
+
+```sh
+pnpm install
+make all
+pnpm run dev
+```
diff --git a/assets/demo.png b/assets/demo.png
new file mode 100644
index 0000000..d4a7d38
Binary files /dev/null and b/assets/demo.png differ
diff --git a/babel.config.js b/babel.config.js
new file mode 100644
index 0000000..f859a4b
--- /dev/null
+++ b/babel.config.js
@@ -0,0 +1,16 @@
+/** @type {import('@babel/core').ConfigFunction} */
+module.exports = api => {
+ if (!api.env("test")) {
+ return {};
+ }
+
+ return {
+ presets: [],
+ plugins: [
+ ["@babel/plugin-transform-typescript", { allowDeclareFields: true }],
+ ["@babel/plugin-proposal-decorators", { version: "legacy" }],
+ "@babel/plugin-transform-modules-commonjs",
+ "babel-plugin-macros",
+ ],
+ };
+};
diff --git a/crowdin.yml b/crowdin.yml
new file mode 100644
index 0000000..0cc584b
--- /dev/null
+++ b/crowdin.yml
@@ -0,0 +1,11 @@
+project_id: "566071"
+api_token_env: CROWDIN_PERSONAL_TOKEN
+base_path: .
+base_url: https://api.crowdin.com
+preserve_hierarchy: true
+files:
+ - source: /src/shared/i18n/resources/en-US/*.json
+ translation: /src/shared/i18n/resources/%locale%/%original_file_name%
+
+ - source: /dist/_locales/en_US/messages.json
+ translation: /dist/_locales/%locale_with_underscore%/%original_file_name%
diff --git a/dist/_locales/en_US/messages.json b/dist/_locales/en_US/messages.json
new file mode 100644
index 0000000..1aefb6d
--- /dev/null
+++ b/dist/_locales/en_US/messages.json
@@ -0,0 +1,11 @@
+{
+ "extName": {
+ "message": "Paletterie"
+ },
+ "description": {
+ "message": "User style manager"
+ },
+ "untitled": {
+ "message": "Untitled"
+ }
+}
diff --git a/dist/assets/fonts/inter/Inter-Black.woff b/dist/assets/fonts/inter/Inter-Black.woff
new file mode 100644
index 0000000..a18593a
Binary files /dev/null and b/dist/assets/fonts/inter/Inter-Black.woff differ
diff --git a/dist/assets/fonts/inter/Inter-Black.woff2 b/dist/assets/fonts/inter/Inter-Black.woff2
new file mode 100644
index 0000000..68f64c9
Binary files /dev/null and b/dist/assets/fonts/inter/Inter-Black.woff2 differ
diff --git a/dist/assets/fonts/inter/Inter-BlackItalic.woff b/dist/assets/fonts/inter/Inter-BlackItalic.woff
new file mode 100644
index 0000000..b6b0194
Binary files /dev/null and b/dist/assets/fonts/inter/Inter-BlackItalic.woff differ
diff --git a/dist/assets/fonts/inter/Inter-BlackItalic.woff2 b/dist/assets/fonts/inter/Inter-BlackItalic.woff2
new file mode 100644
index 0000000..1c9c7ca
Binary files /dev/null and b/dist/assets/fonts/inter/Inter-BlackItalic.woff2 differ
diff --git a/dist/assets/fonts/inter/Inter-Bold.woff b/dist/assets/fonts/inter/Inter-Bold.woff
new file mode 100644
index 0000000..eaf3d4b
Binary files /dev/null and b/dist/assets/fonts/inter/Inter-Bold.woff differ
diff --git a/dist/assets/fonts/inter/Inter-Bold.woff2 b/dist/assets/fonts/inter/Inter-Bold.woff2
new file mode 100644
index 0000000..2846f29
Binary files /dev/null and b/dist/assets/fonts/inter/Inter-Bold.woff2 differ
diff --git a/dist/assets/fonts/inter/Inter-BoldItalic.woff b/dist/assets/fonts/inter/Inter-BoldItalic.woff
new file mode 100644
index 0000000..3275076
Binary files /dev/null and b/dist/assets/fonts/inter/Inter-BoldItalic.woff differ
diff --git a/dist/assets/fonts/inter/Inter-BoldItalic.woff2 b/dist/assets/fonts/inter/Inter-BoldItalic.woff2
new file mode 100644
index 0000000..0b1fe8e
Binary files /dev/null and b/dist/assets/fonts/inter/Inter-BoldItalic.woff2 differ
diff --git a/dist/assets/fonts/inter/Inter-ExtraBold.woff b/dist/assets/fonts/inter/Inter-ExtraBold.woff
new file mode 100644
index 0000000..c2c17ed
Binary files /dev/null and b/dist/assets/fonts/inter/Inter-ExtraBold.woff differ
diff --git a/dist/assets/fonts/inter/Inter-ExtraBold.woff2 b/dist/assets/fonts/inter/Inter-ExtraBold.woff2
new file mode 100644
index 0000000..c24c2bd
Binary files /dev/null and b/dist/assets/fonts/inter/Inter-ExtraBold.woff2 differ
diff --git a/dist/assets/fonts/inter/Inter-ExtraBoldItalic.woff b/dist/assets/fonts/inter/Inter-ExtraBoldItalic.woff
new file mode 100644
index 0000000..c42f705
Binary files /dev/null and b/dist/assets/fonts/inter/Inter-ExtraBoldItalic.woff differ
diff --git a/dist/assets/fonts/inter/Inter-ExtraBoldItalic.woff2 b/dist/assets/fonts/inter/Inter-ExtraBoldItalic.woff2
new file mode 100644
index 0000000..4a81dc7
Binary files /dev/null and b/dist/assets/fonts/inter/Inter-ExtraBoldItalic.woff2 differ
diff --git a/dist/assets/fonts/inter/Inter-ExtraLight.woff b/dist/assets/fonts/inter/Inter-ExtraLight.woff
new file mode 100644
index 0000000..d0de5f3
Binary files /dev/null and b/dist/assets/fonts/inter/Inter-ExtraLight.woff differ
diff --git a/dist/assets/fonts/inter/Inter-ExtraLight.woff2 b/dist/assets/fonts/inter/Inter-ExtraLight.woff2
new file mode 100644
index 0000000..f2ea706
Binary files /dev/null and b/dist/assets/fonts/inter/Inter-ExtraLight.woff2 differ
diff --git a/dist/assets/fonts/inter/Inter-ExtraLightItalic.woff b/dist/assets/fonts/inter/Inter-ExtraLightItalic.woff
new file mode 100644
index 0000000..81f1a28
Binary files /dev/null and b/dist/assets/fonts/inter/Inter-ExtraLightItalic.woff differ
diff --git a/dist/assets/fonts/inter/Inter-ExtraLightItalic.woff2 b/dist/assets/fonts/inter/Inter-ExtraLightItalic.woff2
new file mode 100644
index 0000000..9af717b
Binary files /dev/null and b/dist/assets/fonts/inter/Inter-ExtraLightItalic.woff2 differ
diff --git a/dist/assets/fonts/inter/Inter-Italic.woff b/dist/assets/fonts/inter/Inter-Italic.woff
new file mode 100644
index 0000000..a806b38
Binary files /dev/null and b/dist/assets/fonts/inter/Inter-Italic.woff differ
diff --git a/dist/assets/fonts/inter/Inter-Italic.woff2 b/dist/assets/fonts/inter/Inter-Italic.woff2
new file mode 100644
index 0000000..a619fc5
Binary files /dev/null and b/dist/assets/fonts/inter/Inter-Italic.woff2 differ
diff --git a/dist/assets/fonts/inter/Inter-Light.woff b/dist/assets/fonts/inter/Inter-Light.woff
new file mode 100644
index 0000000..c496464
Binary files /dev/null and b/dist/assets/fonts/inter/Inter-Light.woff differ
diff --git a/dist/assets/fonts/inter/Inter-Light.woff2 b/dist/assets/fonts/inter/Inter-Light.woff2
new file mode 100644
index 0000000..bc4be66
Binary files /dev/null and b/dist/assets/fonts/inter/Inter-Light.woff2 differ
diff --git a/dist/assets/fonts/inter/Inter-LightItalic.woff b/dist/assets/fonts/inter/Inter-LightItalic.woff
new file mode 100644
index 0000000..f84a9de
Binary files /dev/null and b/dist/assets/fonts/inter/Inter-LightItalic.woff differ
diff --git a/dist/assets/fonts/inter/Inter-LightItalic.woff2 b/dist/assets/fonts/inter/Inter-LightItalic.woff2
new file mode 100644
index 0000000..842b2df
Binary files /dev/null and b/dist/assets/fonts/inter/Inter-LightItalic.woff2 differ
diff --git a/dist/assets/fonts/inter/Inter-Medium.woff b/dist/assets/fonts/inter/Inter-Medium.woff
new file mode 100644
index 0000000..d546843
Binary files /dev/null and b/dist/assets/fonts/inter/Inter-Medium.woff differ
diff --git a/dist/assets/fonts/inter/Inter-Medium.woff2 b/dist/assets/fonts/inter/Inter-Medium.woff2
new file mode 100644
index 0000000..f92498a
Binary files /dev/null and b/dist/assets/fonts/inter/Inter-Medium.woff2 differ
diff --git a/dist/assets/fonts/inter/Inter-MediumItalic.woff b/dist/assets/fonts/inter/Inter-MediumItalic.woff
new file mode 100644
index 0000000..459a656
Binary files /dev/null and b/dist/assets/fonts/inter/Inter-MediumItalic.woff differ
diff --git a/dist/assets/fonts/inter/Inter-MediumItalic.woff2 b/dist/assets/fonts/inter/Inter-MediumItalic.woff2
new file mode 100644
index 0000000..0e3019f
Binary files /dev/null and b/dist/assets/fonts/inter/Inter-MediumItalic.woff2 differ
diff --git a/dist/assets/fonts/inter/Inter-Regular.woff b/dist/assets/fonts/inter/Inter-Regular.woff
new file mode 100644
index 0000000..62d3a61
Binary files /dev/null and b/dist/assets/fonts/inter/Inter-Regular.woff differ
diff --git a/dist/assets/fonts/inter/Inter-Regular.woff2 b/dist/assets/fonts/inter/Inter-Regular.woff2
new file mode 100644
index 0000000..6c2b689
Binary files /dev/null and b/dist/assets/fonts/inter/Inter-Regular.woff2 differ
diff --git a/dist/assets/fonts/inter/Inter-SemiBold.woff b/dist/assets/fonts/inter/Inter-SemiBold.woff
new file mode 100644
index 0000000..a815f43
Binary files /dev/null and b/dist/assets/fonts/inter/Inter-SemiBold.woff differ
diff --git a/dist/assets/fonts/inter/Inter-SemiBold.woff2 b/dist/assets/fonts/inter/Inter-SemiBold.woff2
new file mode 100644
index 0000000..611e90c
Binary files /dev/null and b/dist/assets/fonts/inter/Inter-SemiBold.woff2 differ
diff --git a/dist/assets/fonts/inter/Inter-SemiBoldItalic.woff b/dist/assets/fonts/inter/Inter-SemiBoldItalic.woff
new file mode 100644
index 0000000..909e43a
Binary files /dev/null and b/dist/assets/fonts/inter/Inter-SemiBoldItalic.woff differ
diff --git a/dist/assets/fonts/inter/Inter-SemiBoldItalic.woff2 b/dist/assets/fonts/inter/Inter-SemiBoldItalic.woff2
new file mode 100644
index 0000000..545685b
Binary files /dev/null and b/dist/assets/fonts/inter/Inter-SemiBoldItalic.woff2 differ
diff --git a/dist/assets/fonts/inter/Inter-Thin.woff b/dist/assets/fonts/inter/Inter-Thin.woff
new file mode 100644
index 0000000..62bc58c
Binary files /dev/null and b/dist/assets/fonts/inter/Inter-Thin.woff differ
diff --git a/dist/assets/fonts/inter/Inter-Thin.woff2 b/dist/assets/fonts/inter/Inter-Thin.woff2
new file mode 100644
index 0000000..abbc3a5
Binary files /dev/null and b/dist/assets/fonts/inter/Inter-Thin.woff2 differ
diff --git a/dist/assets/fonts/inter/Inter-ThinItalic.woff b/dist/assets/fonts/inter/Inter-ThinItalic.woff
new file mode 100644
index 0000000..700a7f0
Binary files /dev/null and b/dist/assets/fonts/inter/Inter-ThinItalic.woff differ
diff --git a/dist/assets/fonts/inter/Inter-ThinItalic.woff2 b/dist/assets/fonts/inter/Inter-ThinItalic.woff2
new file mode 100644
index 0000000..ab0b200
Binary files /dev/null and b/dist/assets/fonts/inter/Inter-ThinItalic.woff2 differ
diff --git a/dist/assets/fonts/inter/Inter-italic.var.woff2 b/dist/assets/fonts/inter/Inter-italic.var.woff2
new file mode 100644
index 0000000..b826d5a
Binary files /dev/null and b/dist/assets/fonts/inter/Inter-italic.var.woff2 differ
diff --git a/dist/assets/fonts/inter/Inter-roman.var.woff2 b/dist/assets/fonts/inter/Inter-roman.var.woff2
new file mode 100644
index 0000000..6a256a0
Binary files /dev/null and b/dist/assets/fonts/inter/Inter-roman.var.woff2 differ
diff --git a/dist/assets/fonts/inter/Inter.var.woff2 b/dist/assets/fonts/inter/Inter.var.woff2
new file mode 100644
index 0000000..365eedc
Binary files /dev/null and b/dist/assets/fonts/inter/Inter.var.woff2 differ
diff --git a/dist/assets/fonts/inter/LICENSE.txt b/dist/assets/fonts/inter/LICENSE.txt
new file mode 100644
index 0000000..ff80f8c
--- /dev/null
+++ b/dist/assets/fonts/inter/LICENSE.txt
@@ -0,0 +1,94 @@
+Copyright (c) 2016-2020 The Inter Project Authors.
+"Inter" is trademark of Rasmus Andersson.
+https://github.com/rsms/inter
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION AND CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/dist/assets/fonts/inter/inter.css b/dist/assets/fonts/inter/inter.css
new file mode 100644
index 0000000..1cb9bf2
--- /dev/null
+++ b/dist/assets/fonts/inter/inter.css
@@ -0,0 +1,199 @@
+@font-face {
+ font-family: "Inter";
+ font-style: normal;
+ font-weight: 100;
+ font-display: swap;
+ src: url("Inter-Thin.woff2?v=3.19") format("woff2"),
+ url("Inter-Thin.woff?v=3.19") format("woff");
+}
+@font-face {
+ font-family: "Inter";
+ font-style: italic;
+ font-weight: 100;
+ font-display: swap;
+ src: url("Inter-ThinItalic.woff2?v=3.19") format("woff2"),
+ url("Inter-ThinItalic.woff?v=3.19") format("woff");
+}
+
+@font-face {
+ font-family: "Inter";
+ font-style: normal;
+ font-weight: 200;
+ font-display: swap;
+ src: url("Inter-ExtraLight.woff2?v=3.19") format("woff2"),
+ url("Inter-ExtraLight.woff?v=3.19") format("woff");
+}
+@font-face {
+ font-family: "Inter";
+ font-style: italic;
+ font-weight: 200;
+ font-display: swap;
+ src: url("Inter-ExtraLightItalic.woff2?v=3.19") format("woff2"),
+ url("Inter-ExtraLightItalic.woff?v=3.19") format("woff");
+}
+
+@font-face {
+ font-family: "Inter";
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url("Inter-Light.woff2?v=3.19") format("woff2"),
+ url("Inter-Light.woff?v=3.19") format("woff");
+}
+@font-face {
+ font-family: "Inter";
+ font-style: italic;
+ font-weight: 300;
+ font-display: swap;
+ src: url("Inter-LightItalic.woff2?v=3.19") format("woff2"),
+ url("Inter-LightItalic.woff?v=3.19") format("woff");
+}
+
+@font-face {
+ font-family: "Inter";
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url("Inter-Regular.woff2?v=3.19") format("woff2"),
+ url("Inter-Regular.woff?v=3.19") format("woff");
+}
+@font-face {
+ font-family: "Inter";
+ font-style: italic;
+ font-weight: 400;
+ font-display: swap;
+ src: url("Inter-Italic.woff2?v=3.19") format("woff2"),
+ url("Inter-Italic.woff?v=3.19") format("woff");
+}
+
+@font-face {
+ font-family: "Inter";
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url("Inter-Medium.woff2?v=3.19") format("woff2"),
+ url("Inter-Medium.woff?v=3.19") format("woff");
+}
+@font-face {
+ font-family: "Inter";
+ font-style: italic;
+ font-weight: 500;
+ font-display: swap;
+ src: url("Inter-MediumItalic.woff2?v=3.19") format("woff2"),
+ url("Inter-MediumItalic.woff?v=3.19") format("woff");
+}
+
+@font-face {
+ font-family: "Inter";
+ font-style: normal;
+ font-weight: 600;
+ font-display: swap;
+ src: url("Inter-SemiBold.woff2?v=3.19") format("woff2"),
+ url("Inter-SemiBold.woff?v=3.19") format("woff");
+}
+@font-face {
+ font-family: "Inter";
+ font-style: italic;
+ font-weight: 600;
+ font-display: swap;
+ src: url("Inter-SemiBoldItalic.woff2?v=3.19") format("woff2"),
+ url("Inter-SemiBoldItalic.woff?v=3.19") format("woff");
+}
+
+@font-face {
+ font-family: "Inter";
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url("Inter-Bold.woff2?v=3.19") format("woff2"),
+ url("Inter-Bold.woff?v=3.19") format("woff");
+}
+@font-face {
+ font-family: "Inter";
+ font-style: italic;
+ font-weight: 700;
+ font-display: swap;
+ src: url("Inter-BoldItalic.woff2?v=3.19") format("woff2"),
+ url("Inter-BoldItalic.woff?v=3.19") format("woff");
+}
+
+@font-face {
+ font-family: "Inter";
+ font-style: normal;
+ font-weight: 800;
+ font-display: swap;
+ src: url("Inter-ExtraBold.woff2?v=3.19") format("woff2"),
+ url("Inter-ExtraBold.woff?v=3.19") format("woff");
+}
+@font-face {
+ font-family: "Inter";
+ font-style: italic;
+ font-weight: 800;
+ font-display: swap;
+ src: url("Inter-ExtraBoldItalic.woff2?v=3.19") format("woff2"),
+ url("Inter-ExtraBoldItalic.woff?v=3.19") format("woff");
+}
+
+@font-face {
+ font-family: "Inter";
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url("Inter-Black.woff2?v=3.19") format("woff2"),
+ url("Inter-Black.woff?v=3.19") format("woff");
+}
+@font-face {
+ font-family: "Inter";
+ font-style: italic;
+ font-weight: 900;
+ font-display: swap;
+ src: url("Inter-BlackItalic.woff2?v=3.19") format("woff2"),
+ url("Inter-BlackItalic.woff?v=3.19") format("woff");
+}
+
+/* -------------------------------------------------------
+Variable font.
+Usage:
+
+ html { font-family: 'Inter', sans-serif; }
+ @supports (font-variation-settings: normal) {
+ html { font-family: 'Inter var', sans-serif; }
+ }
+*/
+@font-face {
+ font-family: "Inter var";
+ font-weight: 100 900;
+ font-display: swap;
+ font-style: normal;
+ font-named-instance: "Regular";
+ src: url("Inter-roman.var.woff2?v=3.19") format("woff2");
+}
+@font-face {
+ font-family: "Inter var";
+ font-weight: 100 900;
+ font-display: swap;
+ font-style: italic;
+ font-named-instance: "Italic";
+ src: url("Inter-italic.var.woff2?v=3.19") format("woff2");
+}
+
+/* --------------------------------------------------------------------------
+[EXPERIMENTAL] Multi-axis, single variable font.
+
+Slant axis is not yet widely supported (as of February 2019) and thus this
+multi-axis single variable font is opt-in rather than the default.
+
+When using this, you will probably need to set font-variation-settings
+explicitly, e.g.
+
+ * { font-variation-settings: "slnt" 0deg }
+ .italic { font-variation-settings: "slnt" 10deg }
+
+*/
+@font-face {
+ font-family: "Inter var experimental";
+ font-weight: 100 900;
+ font-display: swap;
+ font-style: oblique 0deg 10deg;
+ src: url("Inter.var.woff2?v=3.19") format("woff2");
+}
diff --git a/dist/assets/images/128.png b/dist/assets/images/128.png
new file mode 100755
index 0000000..4cd5d4b
Binary files /dev/null and b/dist/assets/images/128.png differ
diff --git a/dist/assets/images/128w.png b/dist/assets/images/128w.png
new file mode 100755
index 0000000..f4a0aa2
Binary files /dev/null and b/dist/assets/images/128w.png differ
diff --git a/dist/assets/images/16.png b/dist/assets/images/16.png
new file mode 100755
index 0000000..ecf2509
Binary files /dev/null and b/dist/assets/images/16.png differ
diff --git a/dist/assets/images/16w.png b/dist/assets/images/16w.png
new file mode 100755
index 0000000..327d24b
Binary files /dev/null and b/dist/assets/images/16w.png differ
diff --git a/dist/assets/images/19.png b/dist/assets/images/19.png
new file mode 100755
index 0000000..2a1dc4a
Binary files /dev/null and b/dist/assets/images/19.png differ
diff --git a/dist/assets/images/19w.png b/dist/assets/images/19w.png
new file mode 100755
index 0000000..4109ebc
Binary files /dev/null and b/dist/assets/images/19w.png differ
diff --git a/dist/assets/images/256.png b/dist/assets/images/256.png
new file mode 100755
index 0000000..aa8a38a
Binary files /dev/null and b/dist/assets/images/256.png differ
diff --git a/dist/assets/images/256w.png b/dist/assets/images/256w.png
new file mode 100755
index 0000000..357e77b
Binary files /dev/null and b/dist/assets/images/256w.png differ
diff --git a/dist/assets/images/32.png b/dist/assets/images/32.png
new file mode 100755
index 0000000..e997480
Binary files /dev/null and b/dist/assets/images/32.png differ
diff --git a/dist/assets/images/32w.png b/dist/assets/images/32w.png
new file mode 100755
index 0000000..1d41a92
Binary files /dev/null and b/dist/assets/images/32w.png differ
diff --git a/dist/assets/images/38.png b/dist/assets/images/38.png
new file mode 100755
index 0000000..b912910
Binary files /dev/null and b/dist/assets/images/38.png differ
diff --git a/dist/assets/images/38w.png b/dist/assets/images/38w.png
new file mode 100755
index 0000000..8c15172
Binary files /dev/null and b/dist/assets/images/38w.png differ
diff --git a/dist/assets/images/48.png b/dist/assets/images/48.png
new file mode 100755
index 0000000..f932386
Binary files /dev/null and b/dist/assets/images/48.png differ
diff --git a/dist/assets/images/48w.png b/dist/assets/images/48w.png
new file mode 100755
index 0000000..10bd645
Binary files /dev/null and b/dist/assets/images/48w.png differ
diff --git a/dist/assets/images/64.png b/dist/assets/images/64.png
new file mode 100755
index 0000000..e984ebe
Binary files /dev/null and b/dist/assets/images/64.png differ
diff --git a/dist/assets/images/64w.png b/dist/assets/images/64w.png
new file mode 100755
index 0000000..d92b72d
Binary files /dev/null and b/dist/assets/images/64w.png differ
diff --git a/dist/manifest.json b/dist/manifest.json
new file mode 100644
index 0000000..dcb5200
--- /dev/null
+++ b/dist/manifest.json
@@ -0,0 +1,56 @@
+{
+ "name": "__MSG_extName__",
+ "version": "19.11.6",
+ "description": "__MSG_description__",
+ "manifest_version": 2,
+ "default_locale": "en_US",
+ "icons": {
+ "64": "assets/images/64.png",
+ "128": "assets/images/128.png",
+ "256": "assets/images/256.png"
+ },
+ "permissions": [
+ "tabs",
+ "downloads",
+ "webNavigation",
+ "storage",
+ "http://*/",
+ "https://*/",
+ "chrome://favicon/"
+ ],
+ "content_security_policy": "script-src 'unsafe-inline' 'self' http://localhost:8097/; object-src 'self'",
+ "minimum_chrome_version": "90.0",
+ "background": {
+ "page": "background.html",
+ "persistent": true
+ },
+ "devtools_page": "devtools.html",
+ "content_scripts": [
+ {
+ "matches": [""],
+ "run_at": "document_start",
+ "all_frames": true,
+ "js": ["app/context/index.js"]
+ },
+ {
+ "matches": ["http://userstyles.org/*", "https://userstyles.org/*"],
+ "run_at": "document_end",
+ "all_frames": false,
+ "js": ["app/install/index.js"]
+ }
+ ],
+ "options_ui": {
+ "page": "options.html",
+ "open_in_tab": true
+ },
+ "browser_action": {
+ "default_icon": {
+ "16": "assets/images/16w.png",
+ "19": "assets/images/19w.png",
+ "32": "assets/images/32w.png",
+ "38": "assets/images/38w.png"
+ },
+ "default_title": "__MSG_extName__",
+ "default_popup": "popup.html"
+ }
+}
diff --git a/eslint-local-rules/no-deep-relative-import.ts b/eslint-local-rules/no-deep-relative-import.ts
new file mode 100644
index 0000000..564f53b
--- /dev/null
+++ b/eslint-local-rules/no-deep-relative-import.ts
@@ -0,0 +1,62 @@
+import type { Rule } from "eslint"
+
+interface RuleOptions {
+ /**
+ * The maximum number of times a relative path import can go to the parent directory.
+ */
+ maxDepth?: number
+}
+
+const rule: Rule.RuleModule = {
+ meta: {
+ type: "suggestion",
+ docs: {
+ description:
+ "Bans relative path imports that go to the parent directory too many times",
+ category: "Best Practices",
+ recommended: true,
+ },
+ fixable: "code",
+ schema: [
+ {
+ type: "object",
+ properties: {
+ maxDepth: {
+ type: "integer",
+ minimum: 1,
+ },
+ },
+ additionalProperties: false,
+ },
+ ],
+ },
+ create(context) {
+ const { maxDepth = 3 } = (context.options[0] || {}) as RuleOptions
+ const errorMessage = `Relative path imports cannot go to the parent directory more than ${maxDepth} levels`
+
+ return {
+ ImportDeclaration(node) {
+ const { source } = node
+ if (
+ source.type === "Literal" &&
+ typeof source.value === "string" &&
+ source.value.startsWith("..")
+ ) {
+ const depth = source.value.match(/\.\.\//g)?.length ?? 0
+ if (depth > maxDepth) {
+ context.report({
+ node: source,
+ message: errorMessage,
+ fix(fixer) {
+ const newValue = (source.value as string)!.replace(/\.\.\//g, "")
+ return fixer.replaceText(source, `'${newValue}'`)
+ },
+ })
+ }
+ }
+ },
+ }
+ },
+}
+
+export default rule
diff --git a/jest.config.ts b/jest.config.ts
new file mode 100644
index 0000000..94341ad
--- /dev/null
+++ b/jest.config.ts
@@ -0,0 +1,212 @@
+import type { Config } from "@jest/types";
+/*
+ * For a detailed explanation regarding each configuration property and type check, visit:
+ * https://jestjs.io/docs/configuration
+ */
+
+const config: Partial & {
+ [key: string]: any;
+} = {
+ // All imported modules in your tests should be mocked automatically
+ // automock: false,
+
+ // Stop running tests after `n` failures
+ // bail: 0,
+
+ // The directory where Jest should store its cached dependency information
+ // cacheDirectory: "/private/var/folders/cz/tgksgqzx1vsg96sc_zk1sql00000gn/T/jest_dx",
+
+ // Automatically clear mock calls, instances, contexts and results before every test
+ clearMocks: true,
+
+ // Indicates whether the coverage information should be collected while executing the test
+ collectCoverage: true,
+
+ // An array of glob patterns indicating a set of files for which coverage information should be collected
+ // collectCoverageFrom: undefined,
+
+ // The directory where Jest should output its coverage files
+ coverageDirectory: ".jest/coverage",
+
+ // An array of regexp pattern strings used to skip coverage collection
+ // coveragePathIgnorePatterns: [
+ // "/node_modules/"
+ // ],
+
+ // Indicates which provider should be used to instrument code for coverage
+ coverageProvider: "v8",
+
+ // A list of reporter names that Jest uses when writing coverage reports
+ // coverageReporters: [
+ // "json",
+ // "text",
+ // "lcov",
+ // "clover"
+ // ],
+
+ // An object that configures minimum threshold enforcement for coverage results
+ // coverageThreshold: undefined,
+
+ // A path to a custom dependency extractor
+ // dependencyExtractor: undefined,
+
+ // Make calling deprecated APIs throw helpful error messages
+ // errorOnDeprecated: false,
+
+ // The default configuration for fake timers
+ // fakeTimers: {
+ // "enableGlobally": false
+ // },
+
+ // Force coverage collection from ignored files using an array of glob patterns
+ // forceCoverageMatch: [],
+
+ // A path to a module which exports an async function that is triggered once before all test suites
+ // globalSetup: undefined,
+
+ // A path to a module which exports an async function that is triggered once after all test suites
+ // globalTeardown: undefined,
+
+ // A set of global variables that need to be available in all test environments
+ // globals: {},
+
+ // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers.
+ // maxWorkers: "50%",
+
+ // An array of directory names to be searched recursively up from the requiring module's location
+ // moduleDirectories: [
+ // "node_modules"
+ // ],
+
+ // An array of file extensions your modules use
+ // moduleFileExtensions: [
+ // "js",
+ // "mjs",
+ // "cjs",
+ // "jsx",
+ // "ts",
+ // "tsx",
+ // "json",
+ // "node"
+ // ],
+
+ // A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module
+ moduleNameMapper: {
+ "^~/(.*)$": "/src/$1",
+ },
+
+ // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader
+ // modulePathIgnorePatterns: [],
+
+ // Activates notifications for test results
+ // notify: false,
+
+ // An enum that specifies notification mode. Requires { notify: true }
+ // notifyMode: "failure-change",
+
+ // A preset that is used as a base for Jest's configuration
+ // preset: undefined,
+
+ // Run tests from one or more projects
+ // projects: undefined,
+
+ // Use this configuration option to add custom reporters to Jest
+ reporters: [
+ "default",
+ [
+ "jest-html-reporters",
+ {
+ publicPath: ".jest/reports",
+ filename: "index.html",
+ darkTheme: true,
+ },
+ ],
+ ],
+
+ // Automatically reset mock state before every test
+ // resetMocks: false,
+
+ // Reset the module registry before running each individual test
+ // resetModules: false,
+
+ // A path to a custom resolver
+ // resolver: undefined,
+
+ // Automatically restore mock state and implementation before every test
+ // restoreMocks: false,
+
+ // The root directory that Jest should scan for tests and modules within
+ // rootDir: undefined,
+
+ // A list of paths to directories that Jest should use to search for files in
+ // roots: [
+ // ""
+ // ],
+
+ // Allows you to use a custom runner instead of Jest's default test runner
+ // runner: "jest-runner",
+
+ // The paths to modules that run some code to configure or set up the testing environment before each test
+ // setupFiles: [],
+
+ // A list of paths to modules that run some code to configure or set up the testing framework before each test
+ setupFilesAfterEnv: ["./src/setupTest.ts"],
+
+ // The number of seconds after which a test is considered as slow and reported as such in the results.
+ // slowTestThreshold: 5,
+
+ // A list of paths to snapshot serializer modules Jest should use for snapshot testing
+ // snapshotSerializers: [],
+
+ // The test environment that will be used for testing
+ testEnvironment: "node",
+
+ // Options that will be passed to the testEnvironment
+ // testEnvironmentOptions: {},
+
+ // Adds a location field to test results
+ // testLocationInResults: false,
+
+ // The glob patterns Jest uses to detect test files
+ // testMatch: [
+ // "**/__tests__/**/*.[jt]s?(x)",
+ // "**/?(*.)+(spec|test).[tj]s?(x)"
+ // ],
+
+ // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped
+ // testPathIgnorePatterns: [
+ // "/node_modules/"
+ // ],
+
+ // The regexp pattern or array of patterns that Jest uses to detect test files
+ // testRegex: [],
+
+ // This option allows the use of a custom results processor
+ // testResultsProcessor: undefined,
+
+ // This option allows use of a custom test runner
+ // testRunner: "jest-circus/runner",
+
+ // A map from regular expressions to paths to transformers
+ // transform: undefined,
+
+ // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation
+ // transformIgnorePatterns: [
+ // "/node_modules/",
+ // "\\.pnp\\.[^\\/]+$"
+ // ],
+
+ // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them
+ // unmockedModulePathPatterns: undefined,
+
+ // Indicates whether each individual test should be reported during the run
+ // verbose: undefined,
+
+ // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode
+ // watchPathIgnorePatterns: [],
+
+ // Whether to use watchman for file crawling
+ // watchman: true,
+};
+
+export default config;
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..8560ad8
--- /dev/null
+++ b/package.json
@@ -0,0 +1,164 @@
+{
+ "name": "extension",
+ "version": "0.1.0",
+ "private": true,
+ "license": "GPL-3.0",
+ "scripts": {
+ "dev": "NODE_ENV=development yarn build apps -w",
+ "build:app": "NODE_ENV=production yarn build apps",
+ "build:gecko": "build-gecko ./dist -name test -o ./gecko.zip",
+ "build": "./scripts/build.sh",
+ "watch": "npm run dev",
+ "codegen": "./scripts/build-gql.ts",
+ "preinstall": "node ./scripts/build-shims.js",
+ "typecheck": "tsc --noEmit --skipLibCheck"
+ },
+ "resolutions": {
+ "cross-fetch": "./shims/cross-fetch",
+ "is-number": "./shims/is-number"
+ },
+ "devDependencies": {
+ "@aet/eslint-rules": "0.0.1-beta.23",
+ "@aet/gql-tools": "0.0.1-beta.3",
+ "@aet/hooks": "npm:@proteria/hooks@^0.0.2",
+ "@aet/icons": "0.0.1-beta.5",
+ "@apollo/client": "^3.7.17",
+ "@babel/core": "^7.22.9",
+ "@babel/template": "^7.22.5",
+ "@babel/types": "^7.22.5",
+ "@csstools/postcss-sass": "^5.0.1",
+ "@emotion/babel-plugin": "^11.11.0",
+ "@emotion/css": "^11.11.2",
+ "@emotion/hash": "^0.9.1",
+ "@emotion/memoize": "^0.8.1",
+ "@emotion/react": "^11.11.1",
+ "@emotion/serialize": "^1.1.2",
+ "@emotion/styled": "^11.11.0",
+ "@graphql-codegen/add": "^5.0.0",
+ "@graphql-codegen/plugin-helpers": "^5.0.1",
+ "@graphql-codegen/typescript": "^4.0.1",
+ "@graphql-codegen/typescript-operations": "^4.0.1",
+ "@graphql-tools/code-file-loader": "^8.0.2",
+ "@graphql-tools/graphql-file-loader": "^8.0.0",
+ "@headlessui/react": "^1.7.16",
+ "@monaco-editor/react": "^4.5.1",
+ "@primer/primitives": "^7.11.14",
+ "@react-hookz/web": "^23.1.0",
+ "@szhsin/react-menu": "4.0.2",
+ "@types/babel-plugin-macros": "^3.1.0",
+ "@types/babel__core": "^7.20.1",
+ "@types/babel__template": "^7.4.1",
+ "@types/chrome": "^0.0.242",
+ "@types/convert-source-map": "^2.0.0",
+ "@types/debug": "^4.1.8",
+ "@types/dedent": "^0.7.0",
+ "@types/element-resize-detector": "^1.1.3",
+ "@types/glob-to-regexp": "^0.4.1",
+ "@types/js-yaml": "^4.0.5",
+ "@types/lodash": "^4.14.196",
+ "@types/lodash-es": "^4.17.8",
+ "@types/node": "^20.4.5",
+ "@types/pouchdb-browser": "^6.1.3",
+ "@types/prettier": "^2.7.3",
+ "@types/react": "^18.2.18",
+ "@types/react-dom": "^18.2.7",
+ "@types/react-helmet": "^6.1.6",
+ "@types/react-window": "^1.8.5",
+ "@types/stylis": "^4.2.0",
+ "@types/ua-parser-js": "^0.7.36",
+ "@types/w3c-css-typed-object-model-level-1": "20180410.0.5",
+ "@types/webextension-polyfill": "^0.10.1",
+ "@vscode/codicons": "^0.0.33",
+ "async-mutex": "^0.4.0",
+ "babel-plugin-macros": "3.1.0",
+ "babel-plugin-transform-minify-gql-template-literals": "1.1.1",
+ "browserslist": "^4.21.10",
+ "comlink": "^4.4.1",
+ "commander": "^11.0.0",
+ "debug": "^4.3.4",
+ "dedent": "1.5.1",
+ "dotenv": "^16.3.1",
+ "esbin": "0.0.1-beta.2",
+ "esbuild": "0.18.17",
+ "esbuild-plugin-sass": "^1.0.1",
+ "eslint": "8.46.0",
+ "eslint-plugin-unicorn": "^48.0.1",
+ "fast-glob": "^3.3.1",
+ "fuse.js": "^6.6.2",
+ "glob-to-regexp": "^0.4.1",
+ "graphiql": "^3.0.5",
+ "graphql": "^16.7.1",
+ "graphql-type-json": "^0.3.2",
+ "hooks.macro": "^1.1.2",
+ "i18next": "^23.4.1",
+ "i18next-http-backend": "2.2.1",
+ "i18next-icu": "^2.3.0",
+ "idb-keyval": "^6.2.1",
+ "immer": "^10.0.2",
+ "intl-messageformat": "^10.5.0",
+ "js-yaml": "^4.1.0",
+ "lodash": "^4.17.21",
+ "lodash-es": "^4.17.21",
+ "lodash.noop": "^3.0.1",
+ "lru-cache": "^10.0.0",
+ "memoize-one": "6.0.0",
+ "monaco-editor": "^0.40.0",
+ "nanoid": "^4.0.2",
+ "normalize.css": "^8.0.1",
+ "postcss": "^8.4.27",
+ "postcss-modules": "^6.0.0",
+ "pouchdb-browser": "^8.0.1",
+ "prettier": "^3.0.0",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "react-helmet": "^6.1.0",
+ "react-hot-toast": "^2.4.1",
+ "react-i18next": "^13.0.3",
+ "react-window": "^1.8.9",
+ "reflect-metadata": "0.1.13",
+ "sass": "^1.64.2",
+ "scheduler": "^0.23.0",
+ "src": "npm:lodash.noop@3.0.1",
+ "superjson": "^1.13.1",
+ "tiny-invariant": "^1.3.1",
+ "ts-node": "^10.9.1",
+ "tsconfig-paths": "^4.2.0",
+ "tslib": "^2.6.1",
+ "tua-body-scroll-lock": "^1.4.0",
+ "typed-emitter": "^2.1.0",
+ "typescript": "5.2.0-beta",
+ "typescript-plugin-css-modules": "^5.0.1",
+ "ua-parser-js": "^1.0.35",
+ "use-context-selector": "^1.4.1",
+ "webextension-polyfill": "^0.10.0",
+ "zod": "^3.21.4"
+ },
+ "prettier": {
+ "arrowParens": "avoid",
+ "tabWidth": 2,
+ "printWidth": 90,
+ "semi": false,
+ "singleQuote": false,
+ "trailingComma": "all"
+ },
+ "imports": {
+ "#src/*": "./src/*"
+ },
+ "eslintIgnore": [
+ "dist"
+ ],
+ "pnpm": {
+ "patchedDependencies": {
+ "@apollo/client@3.7.17": "patches/@apollo__client@3.7.17.patch",
+ "@headlessui/react@1.7.16": "patches/@headlessui__react@1.7.16.patch",
+ "i18next-http-backend@2.2.1": "patches/i18next-http-backend@2.2.1.patch",
+ "monaco-editor@0.40.0": "patches/monaco-editor@0.40.0.patch",
+ "@aet/gql-tools@0.0.1-beta.3": "patches/@aet__gql-tools@0.0.1-beta.3.patch"
+ },
+ "overrides": {
+ "cross-fetch": "./shims/cross-fetch",
+ "node-gyp": "./node_modules/lodash.noop",
+ "@graphql-tools/relay-operation-optimizer": "./node_modules/lodash.noop"
+ }
+ }
+}
diff --git a/patches/@aet__gql-tools@0.0.1-beta.3.patch b/patches/@aet__gql-tools@0.0.1-beta.3.patch
new file mode 100644
index 0000000..15782dc
--- /dev/null
+++ b/patches/@aet__gql-tools@0.0.1-beta.3.patch
@@ -0,0 +1,21 @@
+diff --git a/type-graphql.mjs b/type-graphql.mjs
+index 1723cb707fb365a7e68d073093f75960e405a463..4a36c76eeced8c2009c5480a154c150006361e7d 100644
+--- a/type-graphql.mjs
++++ b/type-graphql.mjs
+@@ -3,7 +3,6 @@ import { GraphQLError, GraphQLScalarType, GraphQLFloat, GraphQLBoolean, GraphQLS
+ export { GraphQLFloat as Float, GraphQLID as ID, GraphQLInt as Int } from 'graphql';
+ import { GraphQLBigInt, GraphQLDateTimeISO } from 'graphql-scalars';
+ export { GraphQLBigInt, GraphQLDateTimeISO as GraphQLISODateTime, GraphQLTimestamp } from 'graphql-scalars';
+-import { PubSub as PubSub$1, withFilter } from 'graphql-subscriptions';
+
+ class ArgumentValidationError extends GraphQLError {
+ constructor(validationErrors) {
+@@ -903,7 +902,7 @@ class BuildContext {
+ disableInferringDefaultValues;
+ #pubSub;
+ get pubSub() {
+- return this.#pubSub ?? (this.#pubSub = new PubSub$1());
++ return this.#pubSub;
+ }
+ /**
+ * Set static fields with current building context data
\ No newline at end of file
diff --git a/patches/@apollo__client@3.7.17.patch b/patches/@apollo__client@3.7.17.patch
new file mode 100644
index 0000000..a17184a
--- /dev/null
+++ b/patches/@apollo__client@3.7.17.patch
@@ -0,0 +1,13 @@
+diff --git a/react/context/ApolloProvider.d.ts b/react/context/ApolloProvider.d.ts
+index 3d12c9e1e8bf6b33f603cdb2504142edc818eff7..ccc569dc90b7f0fa40b5347dd33c025894539ba1 100644
+--- a/react/context/ApolloProvider.d.ts
++++ b/react/context/ApolloProvider.d.ts
+@@ -2,7 +2,7 @@ import * as React from 'react';
+ import { ApolloClient } from '../../core';
+ export interface ApolloProviderProps {
+ client: ApolloClient;
+- children: React.ReactNode | React.ReactNode[] | null;
++ children?: React.ReactNode | React.ReactNode[] | null;
+ }
+ export declare const ApolloProvider: React.FC>;
+ //# sourceMappingURL=ApolloProvider.d.ts.map
\ No newline at end of file
diff --git a/patches/@headlessui__react@1.7.16.patch b/patches/@headlessui__react@1.7.16.patch
new file mode 100644
index 0000000..9775e04
--- /dev/null
+++ b/patches/@headlessui__react@1.7.16.patch
@@ -0,0 +1,13 @@
+diff --git a/dist/components/popover/popover.d.ts b/dist/components/popover/popover.d.ts
+index 3c7ee4ecbd5ac4411fbcc19f777876331bb0d640..080665fd90eaeb1370c7ec1e1f3281b6e2301bb3 100644
+--- a/dist/components/popover/popover.d.ts
++++ b/dist/components/popover/popover.d.ts
+@@ -3,7 +3,7 @@ import { Props } from '../../types.js';
+ import { PropsForFeatures, HasDisplayName, RefProp } from '../../utils/render.js';
+ type MouseEvent = Parameters>[0];
+ declare let DEFAULT_POPOVER_TAG: "div";
+-interface PopoverRenderPropArg {
++export interface PopoverRenderPropArg {
+ open: boolean;
+ close(focusableElement?: HTMLElement | MutableRefObject | MouseEvent): void;
+ }
\ No newline at end of file
diff --git a/patches/i18next-http-backend@2.2.1.patch b/patches/i18next-http-backend@2.2.1.patch
new file mode 100644
index 0000000..b38e3c1
--- /dev/null
+++ b/patches/i18next-http-backend@2.2.1.patch
@@ -0,0 +1,22 @@
+diff --git a/esm/getFetch.cjs b/esm/getFetch.cjs
+deleted file mode 100644
+index 9e99af3cae1cb4e1ebb543c510132741bc7036e5..0000000000000000000000000000000000000000
+diff --git a/esm/getFetch.js b/esm/getFetch.js
+new file mode 100644
+index 0000000000000000000000000000000000000000..7b36684e2e54181eb45f5d2b718f3da5a925ea40
+--- /dev/null
++++ b/esm/getFetch.js
+@@ -0,0 +1 @@
++export default globalThis.fetch;
+diff --git a/esm/request.js b/esm/request.js
+index b6a6e8976beab48feaa9eedcd44fc2945f27952d..02ccb089b571bb8627a297abaa131c6657861481 100644
+--- a/esm/request.js
++++ b/esm/request.js
+@@ -1,6 +1,6 @@
+ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
+ import { defaults, hasXMLHttpRequest } from './utils.js';
+-import * as fetchNode from './getFetch.cjs';
++import * as fetchNode from './getFetch.js';
+ var fetchApi;
+ if (typeof fetch === 'function') {
+ if (typeof global !== 'undefined' && global.fetch) {
\ No newline at end of file
diff --git a/patches/monaco-editor@0.40.0.patch b/patches/monaco-editor@0.40.0.patch
new file mode 100644
index 0000000..be76fb6
--- /dev/null
+++ b/patches/monaco-editor@0.40.0.patch
@@ -0,0 +1,70 @@
+diff --git a/esm/vs/language/css/css.worker.js b/esm/vs/language/css/css.worker.js
+index 4ba8b6ca8fda98d7f6c23a4e7f46549991b0085a..828be81d67eee01891ca1a8a47378d4877e22243 100644
+--- a/esm/vs/language/css/css.worker.js
++++ b/esm/vs/language/css/css.worker.js
+@@ -17983,6 +17983,9 @@ var cssData = {
+ {
+ "name": "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif"
+ },
++ {
++ "name": "system-ui, sans-serif"
++ },
+ {
+ "name": "Arial, Helvetica, sans-serif"
+ },
+@@ -30198,6 +30201,55 @@ var cssData = {
+ "identifier"
+ ]
+ },
++ {
++ "name": "-webkit-font-smoothing",
++ "browsers": [
++ "S4",
++ "C5"
++ ],
++ "values": [
++ {
++ "name": "auto",
++ "description": "Let the browser decide (Uses subpixel anti-aliasing when available; this is the default)"
++ },
++ {
++ "name": "none",
++ "description": "Turn font smoothing off; display text with jagged sharp edges."
++ },
++ {
++ "name": "antialiased",
++ "description": "Smooth the font on the level of the pixel, as opposed to the subpixel. Switching from subpixel rendering to antialiasing for light text on dark backgrounds makes it look lighter."
++ },
++ {
++ "name": "subpixel-antialiased",
++ "description": "On most non-retina displays, this will give the sharpest text."
++ }
++ ],
++ "description": "Controls the application of anti-aliasing when fonts are rendered.",
++ "restrictions": [
++ "identifier"
++ ]
++ },
++ {
++ "name": "-moz-osx-font-smoothing",
++ "browsers": [
++ "F25"
++ ],
++ "values": [
++ {
++ "name": "auto",
++ "description": "Allow the browser to select an optimization for font smoothing, typically grayscale."
++ },
++ {
++ "name": "grayscale",
++ "description": "Render text with grayscale antialiasing, as opposed to the subpixel. Switching from subpixel rendering to antialiasing for light text on dark backgrounds makes it look lighter."
++ }
++ ],
++ "description": "Controls the application of anti-aliasing when fonts are rendered.",
++ "restrictions": [
++ "identifier"
++ ]
++ },
+ {
+ "name": "-webkit-font-feature-settings",
+ "browsers": [
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
new file mode 100644
index 0000000..172ed81
--- /dev/null
+++ b/pnpm-lock.yaml
@@ -0,0 +1,7325 @@
+lockfileVersion: '6.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+overrides:
+ cross-fetch: ./shims/cross-fetch
+ node-gyp: ./node_modules/lodash.noop
+ '@graphql-tools/relay-operation-optimizer': ./node_modules/lodash.noop
+
+patchedDependencies:
+ '@aet/gql-tools@0.0.1-beta.3':
+ hash: 47vkx3rn6phx3mk5fuqtmfzx34
+ path: patches/@aet__gql-tools@0.0.1-beta.3.patch
+ '@apollo/client@3.7.17':
+ hash: t7vxnytrj25ktypmqrdayqgr3y
+ path: patches/@apollo__client@3.7.17.patch
+ '@headlessui/react@1.7.16':
+ hash: nwe5csvy6f3sk73c47zwlim4za
+ path: patches/@headlessui__react@1.7.16.patch
+ i18next-http-backend@2.2.1:
+ hash: oxpqp5jjldpyo63xee6uzmu3na
+ path: patches/i18next-http-backend@2.2.1.patch
+ monaco-editor@0.40.0:
+ hash: ku3o7hkzj5ntzax27c7xlqnuoa
+ path: patches/monaco-editor@0.40.0.patch
+
+devDependencies:
+ '@aet/eslint-rules':
+ specifier: 0.0.1-beta.23
+ version: 0.0.1-beta.23(eslint-plugin-import@2.28.0)(eslint@8.46.0)(typescript@5.2.0-beta)
+ '@aet/gql-tools':
+ specifier: 0.0.1-beta.3
+ version: 0.0.1-beta.3(patch_hash=47vkx3rn6phx3mk5fuqtmfzx34)(graphql@16.7.1)(lodash@4.17.21)
+ '@aet/hooks':
+ specifier: npm:@proteria/hooks@^0.0.2
+ version: /@proteria/hooks@0.0.2(react-dom@18.2.0)(react@18.2.0)
+ '@aet/icons':
+ specifier: 0.0.1-beta.5
+ version: 0.0.1-beta.5
+ '@apollo/client':
+ specifier: ^3.7.17
+ version: 3.7.17(patch_hash=t7vxnytrj25ktypmqrdayqgr3y)(graphql@16.7.1)(react-dom@18.2.0)(react@18.2.0)
+ '@babel/core':
+ specifier: ^7.22.9
+ version: 7.22.9
+ '@babel/template':
+ specifier: ^7.22.5
+ version: 7.22.5
+ '@babel/types':
+ specifier: ^7.22.5
+ version: 7.22.5
+ '@csstools/postcss-sass':
+ specifier: ^5.0.1
+ version: 5.0.1(postcss@8.4.27)
+ '@emotion/babel-plugin':
+ specifier: ^11.11.0
+ version: 11.11.0
+ '@emotion/css':
+ specifier: ^11.11.2
+ version: 11.11.2
+ '@emotion/hash':
+ specifier: ^0.9.1
+ version: 0.9.1
+ '@emotion/memoize':
+ specifier: ^0.8.1
+ version: 0.8.1
+ '@emotion/react':
+ specifier: ^11.11.1
+ version: 11.11.1(@types/react@18.2.18)(react@18.2.0)
+ '@emotion/serialize':
+ specifier: ^1.1.2
+ version: 1.1.2
+ '@emotion/styled':
+ specifier: ^11.11.0
+ version: 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.18)(react@18.2.0)
+ '@graphql-codegen/add':
+ specifier: ^5.0.0
+ version: 5.0.0(graphql@16.7.1)
+ '@graphql-codegen/plugin-helpers':
+ specifier: ^5.0.1
+ version: 5.0.1(graphql@16.7.1)
+ '@graphql-codegen/typescript':
+ specifier: ^4.0.1
+ version: 4.0.1(graphql@16.7.1)
+ '@graphql-codegen/typescript-operations':
+ specifier: ^4.0.1
+ version: 4.0.1(graphql@16.7.1)
+ '@graphql-tools/code-file-loader':
+ specifier: ^8.0.2
+ version: 8.0.2(graphql@16.7.1)
+ '@graphql-tools/graphql-file-loader':
+ specifier: ^8.0.0
+ version: 8.0.0(graphql@16.7.1)
+ '@headlessui/react':
+ specifier: ^1.7.16
+ version: 1.7.16(patch_hash=nwe5csvy6f3sk73c47zwlim4za)(react-dom@18.2.0)(react@18.2.0)
+ '@monaco-editor/react':
+ specifier: ^4.5.1
+ version: 4.5.1(monaco-editor@0.40.0)(react-dom@18.2.0)(react@18.2.0)
+ '@primer/primitives':
+ specifier: ^7.11.14
+ version: 7.11.14
+ '@react-hookz/web':
+ specifier: ^23.1.0
+ version: 23.1.0(react-dom@18.2.0)(react@18.2.0)
+ '@szhsin/react-menu':
+ specifier: 4.0.2
+ version: 4.0.2(react-dom@18.2.0)(react@18.2.0)
+ '@types/babel-plugin-macros':
+ specifier: ^3.1.0
+ version: 3.1.0
+ '@types/babel__core':
+ specifier: ^7.20.1
+ version: 7.20.1
+ '@types/babel__template':
+ specifier: ^7.4.1
+ version: 7.4.1
+ '@types/chrome':
+ specifier: ^0.0.242
+ version: 0.0.242
+ '@types/convert-source-map':
+ specifier: ^2.0.0
+ version: 2.0.0
+ '@types/debug':
+ specifier: ^4.1.8
+ version: 4.1.8
+ '@types/dedent':
+ specifier: ^0.7.0
+ version: 0.7.0
+ '@types/element-resize-detector':
+ specifier: ^1.1.3
+ version: 1.1.3
+ '@types/glob-to-regexp':
+ specifier: ^0.4.1
+ version: 0.4.1
+ '@types/js-yaml':
+ specifier: ^4.0.5
+ version: 4.0.5
+ '@types/lodash':
+ specifier: ^4.14.196
+ version: 4.14.196
+ '@types/lodash-es':
+ specifier: ^4.17.8
+ version: 4.17.8
+ '@types/node':
+ specifier: ^20.4.5
+ version: 20.4.5
+ '@types/pouchdb-browser':
+ specifier: ^6.1.3
+ version: 6.1.3
+ '@types/prettier':
+ specifier: ^2.7.3
+ version: 2.7.3
+ '@types/react':
+ specifier: ^18.2.18
+ version: 18.2.18
+ '@types/react-dom':
+ specifier: ^18.2.7
+ version: 18.2.7
+ '@types/react-helmet':
+ specifier: ^6.1.6
+ version: 6.1.6
+ '@types/react-window':
+ specifier: ^1.8.5
+ version: 1.8.5
+ '@types/stylis':
+ specifier: ^4.2.0
+ version: 4.2.0
+ '@types/ua-parser-js':
+ specifier: ^0.7.36
+ version: 0.7.36
+ '@types/w3c-css-typed-object-model-level-1':
+ specifier: 20180410.0.5
+ version: 20180410.0.5
+ '@types/webextension-polyfill':
+ specifier: ^0.10.1
+ version: 0.10.1
+ '@vscode/codicons':
+ specifier: ^0.0.33
+ version: 0.0.33
+ async-mutex:
+ specifier: ^0.4.0
+ version: 0.4.0
+ babel-plugin-macros:
+ specifier: 3.1.0
+ version: 3.1.0
+ babel-plugin-transform-minify-gql-template-literals:
+ specifier: 1.1.1
+ version: 1.1.1
+ browserslist:
+ specifier: ^4.21.10
+ version: 4.21.10
+ comlink:
+ specifier: ^4.4.1
+ version: 4.4.1
+ commander:
+ specifier: ^11.0.0
+ version: 11.0.0
+ debug:
+ specifier: ^4.3.4
+ version: 4.3.4
+ dedent:
+ specifier: 1.5.1
+ version: 1.5.1(babel-plugin-macros@3.1.0)
+ dotenv:
+ specifier: ^16.3.1
+ version: 16.3.1
+ esbin:
+ specifier: 0.0.1-beta.2
+ version: 0.0.1-beta.2(esbuild@0.18.17)
+ esbuild:
+ specifier: 0.18.17
+ version: 0.18.17
+ esbuild-plugin-sass:
+ specifier: ^1.0.1
+ version: 1.0.1(esbuild@0.18.17)
+ eslint:
+ specifier: 8.46.0
+ version: 8.46.0
+ eslint-plugin-unicorn:
+ specifier: ^48.0.1
+ version: 48.0.1(eslint@8.46.0)
+ fast-glob:
+ specifier: ^3.3.1
+ version: 3.3.1
+ fuse.js:
+ specifier: ^6.6.2
+ version: 6.6.2
+ glob-to-regexp:
+ specifier: ^0.4.1
+ version: 0.4.1
+ graphiql:
+ specifier: ^3.0.5
+ version: 3.0.5(@codemirror/language@6.0.0)(@types/node@20.4.5)(@types/react-dom@18.2.7)(@types/react@18.2.18)(graphql@16.7.1)(react-dom@18.2.0)(react@18.2.0)
+ graphql:
+ specifier: ^16.7.1
+ version: 16.7.1
+ graphql-type-json:
+ specifier: ^0.3.2
+ version: 0.3.2(graphql@16.7.1)
+ hooks.macro:
+ specifier: ^1.1.2
+ version: 1.1.2(react@18.2.0)
+ i18next:
+ specifier: ^23.4.1
+ version: 23.4.1
+ i18next-http-backend:
+ specifier: 2.2.1
+ version: 2.2.1(patch_hash=oxpqp5jjldpyo63xee6uzmu3na)
+ i18next-icu:
+ specifier: ^2.3.0
+ version: 2.3.0(intl-messageformat@10.5.0)
+ idb-keyval:
+ specifier: ^6.2.1
+ version: 6.2.1
+ immer:
+ specifier: ^10.0.2
+ version: 10.0.2
+ intl-messageformat:
+ specifier: ^10.5.0
+ version: 10.5.0
+ js-yaml:
+ specifier: ^4.1.0
+ version: 4.1.0
+ lodash:
+ specifier: ^4.17.21
+ version: 4.17.21
+ lodash-es:
+ specifier: ^4.17.21
+ version: 4.17.21
+ lodash.noop:
+ specifier: ^3.0.1
+ version: 3.0.1
+ lru-cache:
+ specifier: ^10.0.0
+ version: 10.0.0
+ memoize-one:
+ specifier: 6.0.0
+ version: 6.0.0
+ monaco-editor:
+ specifier: ^0.40.0
+ version: 0.40.0(patch_hash=ku3o7hkzj5ntzax27c7xlqnuoa)
+ nanoid:
+ specifier: ^4.0.2
+ version: 4.0.2
+ normalize.css:
+ specifier: ^8.0.1
+ version: 8.0.1
+ postcss:
+ specifier: ^8.4.27
+ version: 8.4.27
+ postcss-modules:
+ specifier: ^6.0.0
+ version: 6.0.0(postcss@8.4.27)
+ pouchdb-browser:
+ specifier: ^8.0.1
+ version: 8.0.1
+ prettier:
+ specifier: ^3.0.0
+ version: 3.0.0
+ react:
+ specifier: ^18.2.0
+ version: 18.2.0
+ react-dom:
+ specifier: ^18.2.0
+ version: 18.2.0(react@18.2.0)
+ react-helmet:
+ specifier: ^6.1.0
+ version: 6.1.0(react@18.2.0)
+ react-hot-toast:
+ specifier: ^2.4.1
+ version: 2.4.1(csstype@3.1.2)(react-dom@18.2.0)(react@18.2.0)
+ react-i18next:
+ specifier: ^13.0.3
+ version: 13.0.3(i18next@23.4.1)(react-dom@18.2.0)(react@18.2.0)
+ react-window:
+ specifier: ^1.8.9
+ version: 1.8.9(react-dom@18.2.0)(react@18.2.0)
+ reflect-metadata:
+ specifier: 0.1.13
+ version: 0.1.13
+ sass:
+ specifier: ^1.64.2
+ version: 1.64.2
+ scheduler:
+ specifier: ^0.23.0
+ version: 0.23.0
+ src:
+ specifier: npm:lodash.noop@3.0.1
+ version: /lodash.noop@3.0.1
+ superjson:
+ specifier: ^1.13.1
+ version: 1.13.1
+ tiny-invariant:
+ specifier: ^1.3.1
+ version: 1.3.1
+ ts-node:
+ specifier: ^10.9.1
+ version: 10.9.1(@types/node@20.4.5)(typescript@5.2.0-beta)
+ tsconfig-paths:
+ specifier: ^4.2.0
+ version: 4.2.0
+ tslib:
+ specifier: ^2.6.1
+ version: 2.6.1
+ tua-body-scroll-lock:
+ specifier: ^1.4.0
+ version: 1.4.0
+ typed-emitter:
+ specifier: ^2.1.0
+ version: 2.1.0
+ typescript:
+ specifier: 5.2.0-beta
+ version: 5.2.0-beta
+ typescript-plugin-css-modules:
+ specifier: ^5.0.1
+ version: 5.0.1(ts-node@10.9.1)(typescript@5.2.0-beta)
+ ua-parser-js:
+ specifier: ^1.0.35
+ version: 1.0.35
+ use-context-selector:
+ specifier: ^1.4.1
+ version: 1.4.1(react-dom@18.2.0)(react@18.2.0)(scheduler@0.23.0)
+ webextension-polyfill:
+ specifier: ^0.10.0
+ version: 0.10.0
+ zod:
+ specifier: ^3.21.4
+ version: 3.21.4
+
+packages:
+
+ /@aashutoshrathi/word-wrap@1.2.6:
+ resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /@adobe/css-tools@4.2.0:
+ resolution: {integrity: sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA==}
+ dev: true
+
+ /@aet/eslint-rules@0.0.1-beta.23(eslint-plugin-import@2.28.0)(eslint@8.46.0)(typescript@5.2.0-beta):
+ resolution: {integrity: sha512-PY9/+U8z7GylKXrw+dV8TqiaKB8aMLUoZg0on598ZzFdodNHZD3fEr2EslT2i/6Mb7ujpaYxWqiDFpTosKG+UA==}
+ peerDependencies:
+ typescript: ^5.1.6
+ dependencies:
+ '@types/eslint': 8.44.1
+ '@typescript-eslint/eslint-plugin': 6.2.1(@typescript-eslint/parser@6.2.1)(eslint@8.46.0)(typescript@5.2.0-beta)
+ '@typescript-eslint/parser': 6.2.1(eslint@8.46.0)(typescript@5.2.0-beta)
+ aria-query: 5.3.0
+ axe-core: 4.7.2
+ axobject-query: 3.2.1
+ damerau-levenshtein: 1.0.8
+ debug: 4.3.4
+ doctrine: 3.0.0
+ emoji-regex: 10.2.1
+ eslint-config-prettier: 8.9.0(eslint@8.46.0)
+ eslint-define-config: 1.22.0
+ eslint-import-resolver-node: 0.3.7
+ eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@6.2.1)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.28.0)(eslint@8.46.0)
+ eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.2.1)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.46.0)
+ estraverse: 5.3.0
+ is-core-module: 2.12.1
+ is-glob: 4.0.3
+ language-tags: 1.0.8
+ lodash: 4.17.21
+ minimatch: 9.0.3
+ prop-types: 15.8.1
+ resolve: 2.0.0-next.4
+ semver: 7.5.4
+ tsconfig-paths: 4.2.0
+ typescript: 5.2.0-beta
+ transitivePeerDependencies:
+ - eslint
+ - eslint-import-resolver-webpack
+ - eslint-plugin-import
+ - supports-color
+ dev: true
+
+ /@aet/gql-tools@0.0.1-beta.3(patch_hash=47vkx3rn6phx3mk5fuqtmfzx34)(graphql@16.7.1)(lodash@4.17.21):
+ resolution: {integrity: sha512-yPGawDafkm+KZzc09BJNV/Qge3eIK+ZqS8MyFt44YupPbIvLwpUjrI31Glbf/RhC5oyB/iXWwJfj8XBptH1euQ==}
+ hasBin: true
+ peerDependencies:
+ graphql: ^15.0.0 || ^16.5.0
+ lodash: ^4.17.21
+ dependencies:
+ '@graphql-codegen/core': 4.0.0(graphql@16.7.1)
+ '@graphql-codegen/plugin-helpers': 5.0.1(graphql@16.7.1)
+ '@graphql-tools/load': 8.0.0(graphql@16.7.1)
+ '@graphql-tools/utils': 10.0.4(graphql@16.7.1)
+ '@prisma/generator-helper': 5.0.0
+ '@prisma/internals': 5.0.0
+ babel-plugin-macros: 3.1.0
+ class-validator: 0.14.0
+ doctrine: 3.0.0
+ graphql: 16.7.1
+ graphql-language-service: 5.1.7(graphql@16.7.1)
+ graphql-query-complexity: 0.12.0(graphql@16.7.1)
+ graphql-scalars: 1.22.2(graphql@16.7.1)
+ graphql-subscriptions: 2.0.0(graphql@16.7.1)
+ lodash: 4.17.21
+ pluralize: 8.0.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: true
+ patched: true
+
+ /@aet/icons@0.0.1-beta.5:
+ resolution: {integrity: sha512-oSccXvjI1p8Y7TotbqsKu+lfZ5jqBtuW3I25D12aaI4wKzP9we3PJIHR53d7q1JkxrSr3JDOIivwzt3K7/nMeA==}
+ dependencies:
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: true
+
+ /@ampproject/remapping@2.2.1:
+ resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.3
+ '@jridgewell/trace-mapping': 0.3.18
+ dev: true
+
+ /@antfu/ni@0.21.4:
+ resolution: {integrity: sha512-O0Uv9LbLDSoEg26fnMDdDRiPwFJnQSoD4WnrflDwKCJm8Cx/0mV4cGxwBLXan5mGIrpK4Dd7vizf4rQm0QCEAA==}
+ hasBin: true
+ dev: true
+
+ /@apollo/client@3.7.17(patch_hash=t7vxnytrj25ktypmqrdayqgr3y)(graphql@16.7.1)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-0EErSHEtKPNl5wgWikHJbKFAzJ/k11O0WO2QyqZSHpdxdAnw7UWHY4YiLbHCFG7lhrD+NTQ3Z/H9Jn4rcikoJA==}
+ peerDependencies:
+ graphql: ^14.0.0 || ^15.0.0 || ^16.0.0
+ graphql-ws: ^5.5.5
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
+ subscriptions-transport-ws: ^0.9.0 || ^0.11.0
+ peerDependenciesMeta:
+ graphql-ws:
+ optional: true
+ react:
+ optional: true
+ react-dom:
+ optional: true
+ subscriptions-transport-ws:
+ optional: true
+ dependencies:
+ '@graphql-typed-document-node/core': 3.2.0(graphql@16.7.1)
+ '@wry/context': 0.7.3
+ '@wry/equality': 0.5.6
+ '@wry/trie': 0.4.3
+ graphql: 16.7.1
+ graphql-tag: 2.12.6(graphql@16.7.1)
+ hoist-non-react-statics: 3.3.2
+ optimism: 0.16.2
+ prop-types: 15.8.1
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ response-iterator: 0.2.6
+ symbol-observable: 4.0.0
+ ts-invariant: 0.10.3
+ tslib: 2.6.1
+ zen-observable-ts: 1.2.5
+ dev: true
+ patched: true
+
+ /@babel/code-frame@7.22.5:
+ resolution: {integrity: sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/highlight': 7.22.5
+ dev: true
+
+ /@babel/compat-data@7.22.9:
+ resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==}
+ engines: {node: '>=6.9.0'}
+ dev: true
+
+ /@babel/core@7.22.9:
+ resolution: {integrity: sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@ampproject/remapping': 2.2.1
+ '@babel/code-frame': 7.22.5
+ '@babel/generator': 7.22.9
+ '@babel/helper-compilation-targets': 7.22.9(@babel/core@7.22.9)
+ '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.9)
+ '@babel/helpers': 7.22.6
+ '@babel/parser': 7.22.7
+ '@babel/template': 7.22.5
+ '@babel/traverse': 7.22.8
+ '@babel/types': 7.22.5
+ convert-source-map: 1.9.0
+ debug: 4.3.4
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@babel/generator@7.22.9:
+ resolution: {integrity: sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.22.5
+ '@jridgewell/gen-mapping': 0.3.3
+ '@jridgewell/trace-mapping': 0.3.18
+ jsesc: 2.5.2
+ dev: true
+
+ /@babel/helper-compilation-targets@7.22.9(@babel/core@7.22.9):
+ resolution: {integrity: sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/compat-data': 7.22.9
+ '@babel/core': 7.22.9
+ '@babel/helper-validator-option': 7.22.5
+ browserslist: 4.21.10
+ lru-cache: 5.1.1
+ semver: 6.3.1
+ dev: true
+
+ /@babel/helper-environment-visitor@7.22.5:
+ resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==}
+ engines: {node: '>=6.9.0'}
+ dev: true
+
+ /@babel/helper-function-name@7.22.5:
+ resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/template': 7.22.5
+ '@babel/types': 7.22.5
+ dev: true
+
+ /@babel/helper-hoist-variables@7.22.5:
+ resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.22.5
+ dev: true
+
+ /@babel/helper-module-imports@7.22.5:
+ resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.22.5
+ dev: true
+
+ /@babel/helper-module-transforms@7.22.9(@babel/core@7.22.9):
+ resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.22.9
+ '@babel/helper-environment-visitor': 7.22.5
+ '@babel/helper-module-imports': 7.22.5
+ '@babel/helper-simple-access': 7.22.5
+ '@babel/helper-split-export-declaration': 7.22.6
+ '@babel/helper-validator-identifier': 7.22.5
+ dev: true
+
+ /@babel/helper-plugin-utils@7.22.5:
+ resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==}
+ engines: {node: '>=6.9.0'}
+ dev: true
+
+ /@babel/helper-simple-access@7.22.5:
+ resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.22.5
+ dev: true
+
+ /@babel/helper-split-export-declaration@7.22.6:
+ resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.22.5
+ dev: true
+
+ /@babel/helper-string-parser@7.22.5:
+ resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==}
+ engines: {node: '>=6.9.0'}
+ dev: true
+
+ /@babel/helper-validator-identifier@7.22.5:
+ resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==}
+ engines: {node: '>=6.9.0'}
+ dev: true
+
+ /@babel/helper-validator-option@7.22.5:
+ resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==}
+ engines: {node: '>=6.9.0'}
+ dev: true
+
+ /@babel/helpers@7.22.6:
+ resolution: {integrity: sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/template': 7.22.5
+ '@babel/traverse': 7.22.8
+ '@babel/types': 7.22.5
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@babel/highlight@7.22.5:
+ resolution: {integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-validator-identifier': 7.22.5
+ chalk: 2.4.2
+ js-tokens: 4.0.0
+ dev: true
+
+ /@babel/parser@7.22.7:
+ resolution: {integrity: sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+ dependencies:
+ '@babel/types': 7.22.5
+ dev: true
+
+ /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.22.9):
+ resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.22.9
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: true
+
+ /@babel/runtime@7.22.6:
+ resolution: {integrity: sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ regenerator-runtime: 0.13.11
+ dev: true
+
+ /@babel/template@7.22.5:
+ resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/code-frame': 7.22.5
+ '@babel/parser': 7.22.7
+ '@babel/types': 7.22.5
+ dev: true
+
+ /@babel/traverse@7.22.8:
+ resolution: {integrity: sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/code-frame': 7.22.5
+ '@babel/generator': 7.22.9
+ '@babel/helper-environment-visitor': 7.22.5
+ '@babel/helper-function-name': 7.22.5
+ '@babel/helper-hoist-variables': 7.22.5
+ '@babel/helper-split-export-declaration': 7.22.6
+ '@babel/parser': 7.22.7
+ '@babel/types': 7.22.5
+ debug: 4.3.4
+ globals: 11.12.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@babel/types@7.22.5:
+ resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-string-parser': 7.22.5
+ '@babel/helper-validator-identifier': 7.22.5
+ to-fast-properties: 2.0.0
+ dev: true
+
+ /@codemirror/language@6.0.0:
+ resolution: {integrity: sha512-rtjk5ifyMzOna1c7PBu7J1VCt0PvA5wy3o8eMVnxMKb7z8KA7JFecvD04dSn14vj/bBaAbqRsGed5OjtofEnLA==}
+ dependencies:
+ '@codemirror/state': 6.2.1
+ '@codemirror/view': 6.15.3
+ '@lezer/common': 1.0.3
+ '@lezer/highlight': 1.1.6
+ '@lezer/lr': 1.3.9
+ style-mod: 4.0.3
+ dev: true
+
+ /@codemirror/state@6.2.1:
+ resolution: {integrity: sha512-RupHSZ8+OjNT38zU9fKH2sv+Dnlr8Eb8sl4NOnnqz95mCFTZUaiRP8Xv5MeeaG0px2b8Bnfe7YGwCV3nsBhbuw==}
+ dev: true
+
+ /@codemirror/view@6.15.3:
+ resolution: {integrity: sha512-chNgR8H7Ipx7AZUt0+Kknk7BCow/ron3mHd1VZdM7hQXiI79+UlWqcxpCiexTxZQ+iSkqndk3HHAclJOcjSuog==}
+ dependencies:
+ '@codemirror/state': 6.2.1
+ style-mod: 4.0.3
+ w3c-keyname: 2.2.8
+ dev: true
+
+ /@cspotcode/source-map-support@0.8.1:
+ resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
+ engines: {node: '>=12'}
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.9
+ dev: true
+
+ /@csstools/postcss-sass@5.0.1(postcss@8.4.27):
+ resolution: {integrity: sha512-GgQAOe6KfABEIHGh9KFqn/7sX2Dmx554PElvyhRFNADo2QV2N/CzlS+QHrrJmVJzaBn829f4JFcOd67mmYb5Eg==}
+ engines: {node: ^12 || ^14 || >=16}
+ peerDependencies:
+ postcss: ^8.4.6
+ dependencies:
+ '@csstools/sass-import-resolve': 1.0.0
+ postcss: 8.4.27
+ sass: 1.64.2
+ source-map: 0.7.4
+ dev: true
+
+ /@csstools/sass-import-resolve@1.0.0:
+ resolution: {integrity: sha512-pH4KCsbtBLLe7eqUrw8brcuFO8IZlN36JjdKlOublibVdAIPHCzEnpBWOVUXK5sCf+DpBi8ZtuWtjF0srybdeA==}
+ engines: {node: '>=4.0.0'}
+ dev: true
+
+ /@emotion/babel-plugin@11.11.0:
+ resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==}
+ dependencies:
+ '@babel/helper-module-imports': 7.22.5
+ '@babel/runtime': 7.22.6
+ '@emotion/hash': 0.9.1
+ '@emotion/memoize': 0.8.1
+ '@emotion/serialize': 1.1.2
+ babel-plugin-macros: 3.1.0
+ convert-source-map: 1.9.0
+ escape-string-regexp: 4.0.0
+ find-root: 1.1.0
+ source-map: 0.5.7
+ stylis: 4.2.0
+ dev: true
+
+ /@emotion/cache@11.11.0:
+ resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==}
+ dependencies:
+ '@emotion/memoize': 0.8.1
+ '@emotion/sheet': 1.2.2
+ '@emotion/utils': 1.2.1
+ '@emotion/weak-memoize': 0.3.1
+ stylis: 4.2.0
+ dev: true
+
+ /@emotion/css@11.11.2:
+ resolution: {integrity: sha512-VJxe1ucoMYMS7DkiMdC2T7PWNbrEI0a39YRiyDvK2qq4lXwjRbVP/z4lpG+odCsRzadlR+1ywwrTzhdm5HNdew==}
+ dependencies:
+ '@emotion/babel-plugin': 11.11.0
+ '@emotion/cache': 11.11.0
+ '@emotion/serialize': 1.1.2
+ '@emotion/sheet': 1.2.2
+ '@emotion/utils': 1.2.1
+ dev: true
+
+ /@emotion/hash@0.9.1:
+ resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==}
+ dev: true
+
+ /@emotion/is-prop-valid@0.8.8:
+ resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==}
+ requiresBuild: true
+ dependencies:
+ '@emotion/memoize': 0.7.4
+ dev: true
+ optional: true
+
+ /@emotion/is-prop-valid@1.2.1:
+ resolution: {integrity: sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==}
+ dependencies:
+ '@emotion/memoize': 0.8.1
+ dev: true
+
+ /@emotion/memoize@0.7.4:
+ resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==}
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@emotion/memoize@0.8.1:
+ resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==}
+ dev: true
+
+ /@emotion/react@11.11.1(@types/react@18.2.18)(react@18.2.0):
+ resolution: {integrity: sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==}
+ peerDependencies:
+ '@types/react': '*'
+ react: '>=16.8.0'
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.22.6
+ '@emotion/babel-plugin': 11.11.0
+ '@emotion/cache': 11.11.0
+ '@emotion/serialize': 1.1.2
+ '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0)
+ '@emotion/utils': 1.2.1
+ '@emotion/weak-memoize': 0.3.1
+ '@types/react': 18.2.18
+ hoist-non-react-statics: 3.3.2
+ react: 18.2.0
+ dev: true
+
+ /@emotion/serialize@1.1.2:
+ resolution: {integrity: sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==}
+ dependencies:
+ '@emotion/hash': 0.9.1
+ '@emotion/memoize': 0.8.1
+ '@emotion/unitless': 0.8.1
+ '@emotion/utils': 1.2.1
+ csstype: 3.1.2
+ dev: true
+
+ /@emotion/sheet@1.2.2:
+ resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==}
+ dev: true
+
+ /@emotion/styled@11.11.0(@emotion/react@11.11.1)(@types/react@18.2.18)(react@18.2.0):
+ resolution: {integrity: sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==}
+ peerDependencies:
+ '@emotion/react': ^11.0.0-rc.0
+ '@types/react': '*'
+ react: '>=16.8.0'
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.22.6
+ '@emotion/babel-plugin': 11.11.0
+ '@emotion/is-prop-valid': 1.2.1
+ '@emotion/react': 11.11.1(@types/react@18.2.18)(react@18.2.0)
+ '@emotion/serialize': 1.1.2
+ '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0)
+ '@emotion/utils': 1.2.1
+ '@types/react': 18.2.18
+ react: 18.2.0
+ dev: true
+
+ /@emotion/unitless@0.8.1:
+ resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==}
+ dev: true
+
+ /@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.2.0):
+ resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==}
+ peerDependencies:
+ react: '>=16.8.0'
+ dependencies:
+ react: 18.2.0
+ dev: true
+
+ /@emotion/utils@1.2.1:
+ resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==}
+ dev: true
+
+ /@emotion/weak-memoize@0.3.1:
+ resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==}
+ dev: true
+
+ /@esbuild/android-arm64@0.18.17:
+ resolution: {integrity: sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/android-arm@0.18.17:
+ resolution: {integrity: sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/android-x64@0.18.17:
+ resolution: {integrity: sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/darwin-arm64@0.18.17:
+ resolution: {integrity: sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/darwin-x64@0.18.17:
+ resolution: {integrity: sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/freebsd-arm64@0.18.17:
+ resolution: {integrity: sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [freebsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/freebsd-x64@0.18.17:
+ resolution: {integrity: sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [freebsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-arm64@0.18.17:
+ resolution: {integrity: sha512-c9w3tE7qA3CYWjT+M3BMbwMt+0JYOp3vCMKgVBrCl1nwjAlOMYzEo+gG7QaZ9AtqZFj5MbUc885wuBBmu6aADQ==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-arm@0.18.17:
+ resolution: {integrity: sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-ia32@0.18.17:
+ resolution: {integrity: sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-loong64@0.18.17:
+ resolution: {integrity: sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg==}
+ engines: {node: '>=12'}
+ cpu: [loong64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-mips64el@0.18.17:
+ resolution: {integrity: sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ==}
+ engines: {node: '>=12'}
+ cpu: [mips64el]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-ppc64@0.18.17:
+ resolution: {integrity: sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-riscv64@0.18.17:
+ resolution: {integrity: sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g==}
+ engines: {node: '>=12'}
+ cpu: [riscv64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-s390x@0.18.17:
+ resolution: {integrity: sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg==}
+ engines: {node: '>=12'}
+ cpu: [s390x]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-x64@0.18.17:
+ resolution: {integrity: sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/netbsd-x64@0.18.17:
+ resolution: {integrity: sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [netbsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/openbsd-x64@0.18.17:
+ resolution: {integrity: sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [openbsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/sunos-x64@0.18.17:
+ resolution: {integrity: sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [sunos]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/win32-arm64@0.18.17:
+ resolution: {integrity: sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/win32-ia32@0.18.17:
+ resolution: {integrity: sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/win32-x64@0.18.17:
+ resolution: {integrity: sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@eslint-community/eslint-utils@4.4.0(eslint@8.46.0):
+ resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+ dependencies:
+ eslint: 8.46.0
+ eslint-visitor-keys: 3.4.2
+ dev: true
+
+ /@eslint-community/regexpp@4.6.2:
+ resolution: {integrity: sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==}
+ engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+ dev: true
+
+ /@eslint/eslintrc@2.1.1:
+ resolution: {integrity: sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ ajv: 6.12.6
+ debug: 4.3.4
+ espree: 9.6.1
+ globals: 13.20.0
+ ignore: 5.2.4
+ import-fresh: 3.3.0
+ js-yaml: 4.1.0
+ minimatch: 3.1.2
+ strip-json-comments: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@eslint/js@8.46.0:
+ resolution: {integrity: sha512-a8TLtmPi8xzPkCbp/OGFUo5yhRkHM2Ko9kOWP4znJr0WAhWyThaw3PnwX4vOTWOAMsV2uRt32PPDcEz63esSaA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dev: true
+
+ /@floating-ui/core@1.3.1:
+ resolution: {integrity: sha512-Bu+AMaXNjrpjh41znzHqaz3r2Nr8hHuHZT6V2LBKMhyMl0FgKA62PNYbqnfgmzOhoWZj70Zecisbo4H1rotP5g==}
+ dev: true
+
+ /@floating-ui/dom@1.4.5:
+ resolution: {integrity: sha512-96KnRWkRnuBSSFbj0sFGwwOUd8EkiecINVl0O9wiZlZ64EkpyAOG3Xc2vKKNJmru0Z7RqWNymA+6b8OZqjgyyw==}
+ dependencies:
+ '@floating-ui/core': 1.3.1
+ dev: true
+
+ /@floating-ui/react-dom@2.0.1(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-rZtAmSht4Lry6gdhAJDrCp/6rKN7++JnL1/Anbr/DdeyYXQPxvg/ivrbYvJulbRf4vL8b212suwMM2lxbv+RQA==}
+ peerDependencies:
+ react: '>=16.8.0'
+ react-dom: '>=16.8.0'
+ dependencies:
+ '@floating-ui/dom': 1.4.5
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: true
+
+ /@formatjs/ecma402-abstract@1.17.0:
+ resolution: {integrity: sha512-6ueQTeJZtwKjmh23bdkq/DMqH4l4bmfvtQH98blOSbiXv/OUiyijSW6jU22IT8BNM1ujCaEvJfTtyCYVH38EMQ==}
+ dependencies:
+ '@formatjs/intl-localematcher': 0.4.0
+ tslib: 2.6.1
+ dev: true
+
+ /@formatjs/fast-memoize@2.2.0:
+ resolution: {integrity: sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==}
+ dependencies:
+ tslib: 2.6.1
+ dev: true
+
+ /@formatjs/icu-messageformat-parser@2.6.0:
+ resolution: {integrity: sha512-yT6at0qc0DANw9qM/TU8RZaCtfDXtj4pZM/IC2WnVU80yAcliS3KVDiuUt4jSQAeFL9JS5bc2hARnFmjPdA6qw==}
+ dependencies:
+ '@formatjs/ecma402-abstract': 1.17.0
+ '@formatjs/icu-skeleton-parser': 1.6.0
+ tslib: 2.6.1
+ dev: true
+
+ /@formatjs/icu-skeleton-parser@1.6.0:
+ resolution: {integrity: sha512-eMmxNpoX/J1IPUjPGSZwo0Wh+7CEvdEMddP2Jxg1gQJXfGfht/FdW2D5XDFj3VMbOTUQlDIdZJY7uC6O6gjPoA==}
+ dependencies:
+ '@formatjs/ecma402-abstract': 1.17.0
+ tslib: 2.6.1
+ dev: true
+
+ /@formatjs/intl-localematcher@0.4.0:
+ resolution: {integrity: sha512-bRTd+rKomvfdS4QDlVJ6TA/Jx1F2h/TBVO5LjvhQ7QPPHp19oPNMIum7W2CMEReq/zPxpmCeB31F9+5gl/qtvw==}
+ dependencies:
+ tslib: 2.6.1
+ dev: true
+
+ /@graphiql/react@0.19.3(@codemirror/language@6.0.0)(@types/node@20.4.5)(@types/react-dom@18.2.7)(@types/react@18.2.18)(graphql@16.7.1)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-rpxKcmKPhyGfZo1w9h3+E5FY+LXOn8o5fJxpJd2MbLF8segvvWLtJeXL46Q2IkEFqR4uxf00NUTbCwXjRIVaQQ==}
+ peerDependencies:
+ graphql: ^15.5.0 || ^16.0.0
+ react: ^16.8.0 || ^17 || ^18
+ react-dom: ^16.8.0 || ^17 || ^18
+ dependencies:
+ '@graphiql/toolkit': 0.9.1(@types/node@20.4.5)(graphql@16.7.1)
+ '@headlessui/react': 1.7.16(patch_hash=nwe5csvy6f3sk73c47zwlim4za)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-dialog': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-dropdown-menu': 2.0.5(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-tooltip': 1.0.6(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0)
+ '@types/codemirror': 5.60.8
+ clsx: 1.2.1
+ codemirror: 5.65.14
+ codemirror-graphql: 2.0.9(@codemirror/language@6.0.0)(codemirror@5.65.14)(graphql@16.7.1)
+ copy-to-clipboard: 3.3.3
+ framer-motion: 6.5.1(react-dom@18.2.0)(react@18.2.0)
+ graphql: 16.7.1
+ graphql-language-service: 5.1.7(graphql@16.7.1)
+ markdown-it: 12.3.2
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ set-value: 4.1.0
+ transitivePeerDependencies:
+ - '@codemirror/language'
+ - '@types/node'
+ - '@types/react'
+ - '@types/react-dom'
+ - graphql-ws
+ dev: true
+
+ /@graphiql/toolkit@0.9.1(@types/node@20.4.5)(graphql@16.7.1):
+ resolution: {integrity: sha512-LVt9pdk0830so50ZnU2Znb2rclcoWznG8r8asqAENzV0U1FM1kuY0sdPpc/rBc9MmmNgnB6A+WZzDhq6dbhTHA==}
+ peerDependencies:
+ graphql: ^15.5.0 || ^16.0.0
+ graphql-ws: '>= 4.5.0'
+ peerDependenciesMeta:
+ graphql-ws:
+ optional: true
+ dependencies:
+ '@n1ru4l/push-pull-async-iterable-iterator': 3.2.0
+ graphql: 16.7.1
+ meros: 1.3.0(@types/node@20.4.5)
+ transitivePeerDependencies:
+ - '@types/node'
+ dev: true
+
+ /@graphql-codegen/add@5.0.0(graphql@16.7.1):
+ resolution: {integrity: sha512-ynWDOsK2yxtFHwcJTB9shoSkUd7YXd6ZE57f0nk7W5cu/nAgxZZpEsnTPEpZB/Mjf14YRGe2uJHQ7AfElHjqUQ==}
+ peerDependencies:
+ graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0
+ dependencies:
+ '@graphql-codegen/plugin-helpers': 5.0.1(graphql@16.7.1)
+ graphql: 16.7.1
+ tslib: 2.5.3
+ dev: true
+
+ /@graphql-codegen/core@4.0.0(graphql@16.7.1):
+ resolution: {integrity: sha512-JAGRn49lEtSsZVxeIlFVIRxts2lWObR+OQo7V2LHDJ7ohYYw3ilv7nJ8pf8P4GTg/w6ptcYdSdVVdkI8kUHB/Q==}
+ peerDependencies:
+ graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0
+ dependencies:
+ '@graphql-codegen/plugin-helpers': 5.0.1(graphql@16.7.1)
+ '@graphql-tools/schema': 10.0.0(graphql@16.7.1)
+ '@graphql-tools/utils': 10.0.4(graphql@16.7.1)
+ graphql: 16.7.1
+ tslib: 2.5.3
+ dev: true
+
+ /@graphql-codegen/plugin-helpers@5.0.1(graphql@16.7.1):
+ resolution: {integrity: sha512-6L5sb9D8wptZhnhLLBcheSPU7Tg//DGWgc5tQBWX46KYTOTQHGqDpv50FxAJJOyFVJrveN9otWk9UT9/yfY4ww==}
+ peerDependencies:
+ graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0
+ dependencies:
+ '@graphql-tools/utils': 10.0.4(graphql@16.7.1)
+ change-case-all: 1.0.15
+ common-tags: 1.8.2
+ graphql: 16.7.1
+ import-from: 4.0.0
+ lodash: 4.17.21
+ tslib: 2.5.3
+ dev: true
+
+ /@graphql-codegen/schema-ast@4.0.0(graphql@16.7.1):
+ resolution: {integrity: sha512-WIzkJFa9Gz28FITAPILbt+7A8+yzOyd1NxgwFh7ie+EmO9a5zQK6UQ3U/BviirguXCYnn+AR4dXsoDrSrtRA1g==}
+ peerDependencies:
+ graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0
+ dependencies:
+ '@graphql-codegen/plugin-helpers': 5.0.1(graphql@16.7.1)
+ '@graphql-tools/utils': 10.0.4(graphql@16.7.1)
+ graphql: 16.7.1
+ tslib: 2.5.3
+ dev: true
+
+ /@graphql-codegen/typescript-operations@4.0.1(graphql@16.7.1):
+ resolution: {integrity: sha512-GpUWWdBVUec/Zqo23aFLBMrXYxN2irypHqDcKjN78JclDPdreasAEPcIpMfqf4MClvpmvDLy4ql+djVAwmkjbw==}
+ peerDependencies:
+ graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0
+ dependencies:
+ '@graphql-codegen/plugin-helpers': 5.0.1(graphql@16.7.1)
+ '@graphql-codegen/typescript': 4.0.1(graphql@16.7.1)
+ '@graphql-codegen/visitor-plugin-common': 4.0.1(graphql@16.7.1)
+ auto-bind: 4.0.0
+ graphql: 16.7.1
+ tslib: 2.5.3
+ dev: true
+
+ /@graphql-codegen/typescript@4.0.1(graphql@16.7.1):
+ resolution: {integrity: sha512-3YziQ21dCVdnHb+Us1uDb3pA6eG5Chjv0uTK+bt9dXeMlwYBU8MbtzvQTo4qvzWVC1AxSOKj0rgfNu1xCXqJyA==}
+ peerDependencies:
+ graphql: ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0
+ dependencies:
+ '@graphql-codegen/plugin-helpers': 5.0.1(graphql@16.7.1)
+ '@graphql-codegen/schema-ast': 4.0.0(graphql@16.7.1)
+ '@graphql-codegen/visitor-plugin-common': 4.0.1(graphql@16.7.1)
+ auto-bind: 4.0.0
+ graphql: 16.7.1
+ tslib: 2.5.3
+ dev: true
+
+ /@graphql-codegen/visitor-plugin-common@4.0.1(graphql@16.7.1):
+ resolution: {integrity: sha512-Bi/1z0nHg4QMsAqAJhds+ForyLtk7A3HQOlkrZNm3xEkY7lcBzPtiOTLBtvziwopBsXUxqeSwVjOOFPLS5Yw1Q==}
+ peerDependencies:
+ graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0
+ dependencies:
+ '@graphql-codegen/plugin-helpers': 5.0.1(graphql@16.7.1)
+ '@graphql-tools/optimize': 2.0.0(graphql@16.7.1)
+ '@graphql-tools/relay-operation-optimizer': link:node_modules/lodash.noop
+ '@graphql-tools/utils': 10.0.4(graphql@16.7.1)
+ auto-bind: 4.0.0
+ change-case-all: 1.0.15
+ dependency-graph: 0.11.0
+ graphql: 16.7.1
+ graphql-tag: 2.12.6(graphql@16.7.1)
+ parse-filepath: 1.0.2
+ tslib: 2.5.3
+ dev: true
+
+ /@graphql-tools/code-file-loader@8.0.2(graphql@16.7.1):
+ resolution: {integrity: sha512-AKNpkElUL2cWocYpC4DzNEpo6qJw8Lp+L3bKQ/mIfmbsQxgLz5uve6zHBMhDaFPdlwfIox41N3iUSvi77t9e8A==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+ dependencies:
+ '@graphql-tools/graphql-tag-pluck': 8.0.2(graphql@16.7.1)
+ '@graphql-tools/utils': 10.0.4(graphql@16.7.1)
+ globby: 11.1.0
+ graphql: 16.7.1
+ tslib: 2.6.1
+ unixify: 1.0.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@graphql-tools/graphql-file-loader@8.0.0(graphql@16.7.1):
+ resolution: {integrity: sha512-wRXj9Z1IFL3+zJG1HWEY0S4TXal7+s1vVhbZva96MSp0kbb/3JBF7j0cnJ44Eq0ClccMgGCDFqPFXty4JlpaPg==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+ dependencies:
+ '@graphql-tools/import': 7.0.0(graphql@16.7.1)
+ '@graphql-tools/utils': 10.0.4(graphql@16.7.1)
+ globby: 11.1.0
+ graphql: 16.7.1
+ tslib: 2.6.1
+ unixify: 1.0.0
+ dev: true
+
+ /@graphql-tools/graphql-tag-pluck@8.0.2(graphql@16.7.1):
+ resolution: {integrity: sha512-U6fE4yEHxuk/nqmPixHpw1WhqdS6aYuaV60m1bEmUmGJNbpAhaMBy01JncpvpF15yZR5LZ0UjkHg+A3Lhoc8YQ==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+ dependencies:
+ '@babel/core': 7.22.9
+ '@babel/parser': 7.22.7
+ '@babel/plugin-syntax-import-assertions': 7.22.5(@babel/core@7.22.9)
+ '@babel/traverse': 7.22.8
+ '@babel/types': 7.22.5
+ '@graphql-tools/utils': 10.0.4(graphql@16.7.1)
+ graphql: 16.7.1
+ tslib: 2.6.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@graphql-tools/import@7.0.0(graphql@16.7.1):
+ resolution: {integrity: sha512-NVZiTO8o1GZs6OXzNfjB+5CtQtqsZZpQOq+Uu0w57kdUkT4RlQKlwhT8T81arEsbV55KpzkpFsOZP7J1wdmhBw==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+ dependencies:
+ '@graphql-tools/utils': 10.0.4(graphql@16.7.1)
+ graphql: 16.7.1
+ resolve-from: 5.0.0
+ tslib: 2.6.1
+ dev: true
+
+ /@graphql-tools/load@8.0.0(graphql@16.7.1):
+ resolution: {integrity: sha512-Cy874bQJH0FP2Az7ELPM49iDzOljQmK1PPH6IuxsWzLSTxwTqd8dXA09dcVZrI7/LsN26heTY2R8q2aiiv0GxQ==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+ dependencies:
+ '@graphql-tools/schema': 10.0.0(graphql@16.7.1)
+ '@graphql-tools/utils': 10.0.4(graphql@16.7.1)
+ graphql: 16.7.1
+ p-limit: 3.1.0
+ tslib: 2.6.1
+ dev: true
+
+ /@graphql-tools/merge@9.0.0(graphql@16.7.1):
+ resolution: {integrity: sha512-J7/xqjkGTTwOJmaJQJ2C+VDBDOWJL3lKrHJN4yMaRLAJH3PosB7GiPRaSDZdErs0+F77sH2MKs2haMMkywzx7Q==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+ dependencies:
+ '@graphql-tools/utils': 10.0.4(graphql@16.7.1)
+ graphql: 16.7.1
+ tslib: 2.6.1
+ dev: true
+
+ /@graphql-tools/optimize@2.0.0(graphql@16.7.1):
+ resolution: {integrity: sha512-nhdT+CRGDZ+bk68ic+Jw1OZ99YCDIKYA5AlVAnBHJvMawSx9YQqQAIj4refNc1/LRieGiuWvhbG3jvPVYho0Dg==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+ dependencies:
+ graphql: 16.7.1
+ tslib: 2.6.1
+ dev: true
+
+ /@graphql-tools/schema@10.0.0(graphql@16.7.1):
+ resolution: {integrity: sha512-kf3qOXMFcMs2f/S8Y3A8fm/2w+GaHAkfr3Gnhh2LOug/JgpY/ywgFVxO3jOeSpSEdoYcDKLcXVjMigNbY4AdQg==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+ dependencies:
+ '@graphql-tools/merge': 9.0.0(graphql@16.7.1)
+ '@graphql-tools/utils': 10.0.4(graphql@16.7.1)
+ graphql: 16.7.1
+ tslib: 2.6.1
+ value-or-promise: 1.0.12
+ dev: true
+
+ /@graphql-tools/utils@10.0.4(graphql@16.7.1):
+ resolution: {integrity: sha512-MF+nZgGROSnFgyOYWhrl2PuJMlIBvaCH48vtnlnDQKSeDc2fUfOzUVloBAQvnYmK9JBmHHks4Pxv25Ybg3r45Q==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+ dependencies:
+ '@graphql-typed-document-node/core': 3.2.0(graphql@16.7.1)
+ dset: 3.1.2
+ graphql: 16.7.1
+ tslib: 2.6.1
+ dev: true
+
+ /@graphql-typed-document-node/core@3.2.0(graphql@16.7.1):
+ resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==}
+ peerDependencies:
+ graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+ dependencies:
+ graphql: 16.7.1
+ dev: true
+
+ /@headlessui/react@1.7.16(patch_hash=nwe5csvy6f3sk73c47zwlim4za)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-2MphIAZdSUacZBT6EXk8AJkj+EuvaaJbtCyHTJrPsz8inhzCl7qeNPI1uk1AUvCgWylVtdN8cVVmnhUDPxPy3g==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ react: ^16 || ^17 || ^18
+ react-dom: ^16 || ^17 || ^18
+ dependencies:
+ client-only: 0.0.1
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: true
+ patched: true
+
+ /@humanwhocodes/config-array@0.11.10:
+ resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==}
+ engines: {node: '>=10.10.0'}
+ dependencies:
+ '@humanwhocodes/object-schema': 1.2.1
+ debug: 4.3.4
+ minimatch: 3.1.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@humanwhocodes/module-importer@1.0.1:
+ resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
+ engines: {node: '>=12.22'}
+ dev: true
+
+ /@humanwhocodes/object-schema@1.2.1:
+ resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==}
+ dev: true
+
+ /@jridgewell/gen-mapping@0.3.3:
+ resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ '@jridgewell/set-array': 1.1.2
+ '@jridgewell/sourcemap-codec': 1.4.15
+ '@jridgewell/trace-mapping': 0.3.18
+ dev: true
+
+ /@jridgewell/resolve-uri@3.1.0:
+ resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==}
+ engines: {node: '>=6.0.0'}
+ dev: true
+
+ /@jridgewell/resolve-uri@3.1.1:
+ resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==}
+ engines: {node: '>=6.0.0'}
+ dev: true
+
+ /@jridgewell/set-array@1.1.2:
+ resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==}
+ engines: {node: '>=6.0.0'}
+ dev: true
+
+ /@jridgewell/sourcemap-codec@1.4.14:
+ resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==}
+ dev: true
+
+ /@jridgewell/sourcemap-codec@1.4.15:
+ resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
+ dev: true
+
+ /@jridgewell/trace-mapping@0.3.18:
+ resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==}
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.0
+ '@jridgewell/sourcemap-codec': 1.4.14
+ dev: true
+
+ /@jridgewell/trace-mapping@0.3.9:
+ resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.1
+ '@jridgewell/sourcemap-codec': 1.4.15
+ dev: true
+
+ /@lezer/common@1.0.3:
+ resolution: {integrity: sha512-JH4wAXCgUOcCGNekQPLhVeUtIqjH0yPBs7vvUdSjyQama9618IOKFJwkv2kcqdhF0my8hQEgCTEJU0GIgnahvA==}
+ dev: true
+
+ /@lezer/highlight@1.1.6:
+ resolution: {integrity: sha512-cmSJYa2us+r3SePpRCjN5ymCqCPv+zyXmDl0ciWtVaNiORT/MxM7ZgOMQZADD0o51qOaOg24qc/zBViOIwAjJg==}
+ dependencies:
+ '@lezer/common': 1.0.3
+ dev: true
+
+ /@lezer/lr@1.3.9:
+ resolution: {integrity: sha512-XPz6dzuTHlnsbA5M2DZgjflNQ+9Hi5Swhic0RULdp3oOs3rh6bqGZolosVqN/fQIT8uNiepzINJDnS39oweTHQ==}
+ dependencies:
+ '@lezer/common': 1.0.3
+ dev: true
+
+ /@monaco-editor/loader@1.3.3(monaco-editor@0.40.0):
+ resolution: {integrity: sha512-6KKF4CTzcJiS8BJwtxtfyYt9shBiEv32ateQ9T4UVogwn4HM/uPo9iJd2Dmbkpz8CM6Y0PDUpjnZzCwC+eYo2Q==}
+ peerDependencies:
+ monaco-editor: '>= 0.21.0 < 1'
+ dependencies:
+ monaco-editor: 0.40.0(patch_hash=ku3o7hkzj5ntzax27c7xlqnuoa)
+ state-local: 1.0.7
+ dev: true
+
+ /@monaco-editor/react@4.5.1(monaco-editor@0.40.0)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-NNDFdP+2HojtNhCkRfE6/D6ro6pBNihaOzMbGK84lNWzRu+CfBjwzGt4jmnqimLuqp5yE5viHS2vi+QOAnD5FQ==}
+ peerDependencies:
+ monaco-editor: '>= 0.25.0 < 1'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
+ dependencies:
+ '@monaco-editor/loader': 1.3.3(monaco-editor@0.40.0)
+ monaco-editor: 0.40.0(patch_hash=ku3o7hkzj5ntzax27c7xlqnuoa)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: true
+
+ /@motionone/animation@10.15.1:
+ resolution: {integrity: sha512-mZcJxLjHor+bhcPuIFErMDNyrdb2vJur8lSfMCsuCB4UyV8ILZLvK+t+pg56erv8ud9xQGK/1OGPt10agPrCyQ==}
+ dependencies:
+ '@motionone/easing': 10.15.1
+ '@motionone/types': 10.15.1
+ '@motionone/utils': 10.15.1
+ tslib: 2.6.1
+ dev: true
+
+ /@motionone/dom@10.12.0:
+ resolution: {integrity: sha512-UdPTtLMAktHiqV0atOczNYyDd/d8Cf5fFsd1tua03PqTwwCe/6lwhLSQ8a7TbnQ5SN0gm44N1slBfj+ORIhrqw==}
+ dependencies:
+ '@motionone/animation': 10.15.1
+ '@motionone/generators': 10.15.1
+ '@motionone/types': 10.15.1
+ '@motionone/utils': 10.15.1
+ hey-listen: 1.0.8
+ tslib: 2.6.1
+ dev: true
+
+ /@motionone/easing@10.15.1:
+ resolution: {integrity: sha512-6hIHBSV+ZVehf9dcKZLT7p5PEKHGhDwky2k8RKkmOvUoYP3S+dXsKupyZpqx5apjd9f+php4vXk4LuS+ADsrWw==}
+ dependencies:
+ '@motionone/utils': 10.15.1
+ tslib: 2.6.1
+ dev: true
+
+ /@motionone/generators@10.15.1:
+ resolution: {integrity: sha512-67HLsvHJbw6cIbLA/o+gsm7h+6D4Sn7AUrB/GPxvujse1cGZ38F5H7DzoH7PhX+sjvtDnt2IhFYF2Zp1QTMKWQ==}
+ dependencies:
+ '@motionone/types': 10.15.1
+ '@motionone/utils': 10.15.1
+ tslib: 2.6.1
+ dev: true
+
+ /@motionone/types@10.15.1:
+ resolution: {integrity: sha512-iIUd/EgUsRZGrvW0jqdst8st7zKTzS9EsKkP+6c6n4MPZoQHwiHuVtTQLD6Kp0bsBLhNzKIBlHXponn/SDT4hA==}
+ dev: true
+
+ /@motionone/utils@10.15.1:
+ resolution: {integrity: sha512-p0YncgU+iklvYr/Dq4NobTRdAPv9PveRDUXabPEeOjBLSO/1FNB2phNTZxOxpi1/GZwYpAoECEa0Wam+nsmhSw==}
+ dependencies:
+ '@motionone/types': 10.15.1
+ hey-listen: 1.0.8
+ tslib: 2.6.1
+ dev: true
+
+ /@n1ru4l/push-pull-async-iterable-iterator@3.2.0:
+ resolution: {integrity: sha512-3fkKj25kEjsfObL6IlKPAlHYPq/oYwUkkQ03zsTTiDjD7vg/RxjdiLeCydqtxHZP0JgsXL3D/X5oAkMGzuUp/Q==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /@nodelib/fs.scandir@2.1.5:
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+ engines: {node: '>= 8'}
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ run-parallel: 1.2.0
+ dev: true
+
+ /@nodelib/fs.stat@2.0.5:
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+ engines: {node: '>= 8'}
+ dev: true
+
+ /@nodelib/fs.walk@1.2.8:
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+ engines: {node: '>= 8'}
+ dependencies:
+ '@nodelib/fs.scandir': 2.1.5
+ fastq: 1.15.0
+ dev: true
+
+ /@opentelemetry/api@1.4.1:
+ resolution: {integrity: sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA==}
+ engines: {node: '>=8.0.0'}
+ dev: true
+
+ /@pkgr/utils@2.4.2:
+ resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==}
+ engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
+ dependencies:
+ cross-spawn: 7.0.3
+ fast-glob: 3.3.1
+ is-glob: 4.0.3
+ open: 9.1.0
+ picocolors: 1.0.0
+ tslib: 2.6.1
+ dev: true
+
+ /@primer/primitives@7.11.14:
+ resolution: {integrity: sha512-z/yUTEkbGhvFqoJ8rpLz3pHJfLNRdoyNd/xNdAl/LKqA97Z60tsSVJMfxNMXi3aS9dCIC1dexK5/Gp4y9JrRkg==}
+ dev: true
+
+ /@prisma/debug@5.0.0:
+ resolution: {integrity: sha512-3q/M/KqlQ01/HJXifU/zCNOHkoTWu24kGelMF/IBrRxm7njPqTTbwfnT1dh4JK+nuWM5/Dg1Lv00u2c0l7AHxg==}
+ dependencies:
+ '@types/debug': 4.1.8
+ debug: 4.3.4
+ strip-ansi: 6.0.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@prisma/engines@5.0.0:
+ resolution: {integrity: sha512-kyT/8fd0OpWmhAU5YnY7eP31brW1q1YrTGoblWrhQJDiN/1K+Z8S1kylcmtjqx5wsUGcP1HBWutayA/jtyt+sg==}
+ requiresBuild: true
+ dev: true
+
+ /@prisma/fetch-engine@5.0.0:
+ resolution: {integrity: sha512-eSzHTE0KcMvM5+O1++eaMuVf4D1zwWHdqjWr6D70skCg37q7RYsuty4GFnlWBuqC4aXwVf06EvIxiJ0SQIIeRw==}
+ dependencies:
+ '@prisma/debug': 5.0.0
+ '@prisma/get-platform': 5.0.0
+ execa: 5.1.1
+ find-cache-dir: 3.3.2
+ fs-extra: 11.1.1
+ hasha: 5.2.2
+ http-proxy-agent: 7.0.0
+ https-proxy-agent: 7.0.0
+ kleur: 4.1.5
+ node-fetch: 2.6.12
+ p-filter: 2.1.0
+ p-map: 4.0.0
+ p-retry: 4.6.2
+ progress: 2.0.3
+ rimraf: 3.0.2
+ temp-dir: 2.0.0
+ tempy: 1.0.1
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: true
+
+ /@prisma/generator-helper@5.0.0:
+ resolution: {integrity: sha512-pufQ1mhoH6WzKNtzL79HZDoW4Ql3Lf8QEKVmBoW8e3Tdb50bxpYBYue5LBqp9vNW1xd1pgZO53cNiRfLX2d4Zg==}
+ dependencies:
+ '@prisma/debug': 5.0.0
+ '@types/cross-spawn': 6.0.2
+ cross-spawn: 7.0.3
+ kleur: 4.1.5
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@prisma/get-platform@5.0.0:
+ resolution: {integrity: sha512-JT/rz/jaMTggDkd9OIma50si9rPLzSFe7XSrV3mKXwtv9t+rdwx5ZhmKJd+Rz6S1vhn/291k21JLfaxOW6u8KQ==}
+ dependencies:
+ '@prisma/debug': 5.0.0
+ escape-string-regexp: 4.0.0
+ execa: 5.1.1
+ fs-jetpack: 5.1.0
+ kleur: 4.1.5
+ replace-string: 3.1.0
+ strip-ansi: 6.0.1
+ tempy: 1.0.1
+ terminal-link: 2.1.1
+ ts-pattern: 4.3.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@prisma/internals@5.0.0:
+ resolution: {integrity: sha512-VGWyFk6QlSBXT8z65Alq5F3o9E8IiTtaBoa3rmKkGpZjUk85kJy3jZz4xkRv53TaeghGE5rWfwkfak26KtY5yQ==}
+ dependencies:
+ '@antfu/ni': 0.21.4
+ '@opentelemetry/api': 1.4.1
+ '@prisma/debug': 5.0.0
+ '@prisma/engines': 5.0.0
+ '@prisma/fetch-engine': 5.0.0
+ '@prisma/generator-helper': 5.0.0
+ '@prisma/get-platform': 5.0.0
+ '@prisma/prisma-schema-wasm': 4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584
+ archiver: 5.3.1
+ arg: 5.0.2
+ checkpoint-client: 1.1.24
+ cli-truncate: 2.1.0
+ dotenv: 16.0.3
+ escape-string-regexp: 4.0.0
+ execa: 5.1.1
+ find-up: 5.0.0
+ fp-ts: 2.16.0
+ fs-extra: 11.1.1
+ fs-jetpack: 5.1.0
+ global-dirs: 3.0.1
+ globby: 11.1.0
+ indent-string: 4.0.0
+ is-windows: 1.0.2
+ is-wsl: 2.2.0
+ kleur: 4.1.5
+ new-github-issue-url: 0.2.1
+ node-fetch: 2.6.12
+ npm-packlist: 5.1.3
+ open: 7.4.2
+ p-map: 4.0.0
+ prompts: 2.4.2
+ read-pkg-up: 7.0.1
+ replace-string: 3.1.0
+ resolve: 1.22.2
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ strip-indent: 3.0.0
+ temp-dir: 2.0.0
+ temp-write: 4.0.0
+ tempy: 1.0.1
+ terminal-link: 2.1.1
+ tmp: 0.2.1
+ ts-pattern: 4.3.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: true
+
+ /@prisma/prisma-schema-wasm@4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584:
+ resolution: {integrity: sha512-JFdsnSgBPN8reDTLOI9Vh/6ccCb2aD1LbY/LWQnkcIgNo6IdpzvuM+qRVbBuA6IZP2SdqQI8Lu6RL2P8EFBQUA==}
+ dev: true
+
+ /@proteria/hooks@0.0.2(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-TPKIyjYu2mJIMP/w1PgdywyUpA083DG2EH10YYMFQcCh6ePttRODTCy5onfBhRYyx7SJ1W1/tz0S8KVXxDfDFA==}
+ peerDependencies:
+ js-cookie: ^3.0.5
+ react: ^16.8 || ^17 || ^18
+ react-dom: ^16.8 || ^17 || ^18
+ peerDependenciesMeta:
+ js-cookie:
+ optional: true
+ dependencies:
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: true
+
+ /@radix-ui/primitive@1.0.1:
+ resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==}
+ dependencies:
+ '@babel/runtime': 7.22.6
+ dev: true
+
+ /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.22.6
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0)
+ '@types/react': 18.2.18
+ '@types/react-dom': 18.2.7
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: true
+
+ /@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.22.6
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@radix-ui/react-context': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-slot': 1.0.2(@types/react@18.2.18)(react@18.2.0)
+ '@types/react': 18.2.18
+ '@types/react-dom': 18.2.7
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: true
+
+ /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.18)(react@18.2.0):
+ resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.22.6
+ '@types/react': 18.2.18
+ react: 18.2.0
+ dev: true
+
+ /@radix-ui/react-context@1.0.1(@types/react@18.2.18)(react@18.2.0):
+ resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.22.6
+ '@types/react': 18.2.18
+ react: 18.2.0
+ dev: true
+
+ /@radix-ui/react-dialog@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-hJtRy/jPULGQZceSAP2Re6/4NpKo8im6V8P2hUqZsdFiSL8l35kYsw3qbRI6Ay5mQd2+wlLqje770eq+RJ3yZg==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.22.6
+ '@radix-ui/primitive': 1.0.1
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@radix-ui/react-context': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-id': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-slot': 1.0.2(@types/react@18.2.18)(react@18.2.0)
+ '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@types/react': 18.2.18
+ '@types/react-dom': 18.2.7
+ aria-hidden: 1.2.3
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ react-remove-scroll: 2.5.5(@types/react@18.2.18)(react@18.2.0)
+ dev: true
+
+ /@radix-ui/react-direction@1.0.1(@types/react@18.2.18)(react@18.2.0):
+ resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.22.6
+ '@types/react': 18.2.18
+ react: 18.2.0
+ dev: true
+
+ /@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.22.6
+ '@radix-ui/primitive': 1.0.1
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.18)(react@18.2.0)
+ '@types/react': 18.2.18
+ '@types/react-dom': 18.2.7
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: true
+
+ /@radix-ui/react-dropdown-menu@2.0.5(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-xdOrZzOTocqqkCkYo8yRPCib5OkTkqN7lqNCdxwPOdE466DOaNl4N8PkUIlsXthQvW5Wwkd+aEmWpfWlBoDPEw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.22.6
+ '@radix-ui/primitive': 1.0.1
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@radix-ui/react-context': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@radix-ui/react-id': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@radix-ui/react-menu': 2.0.5(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@types/react': 18.2.18
+ '@types/react-dom': 18.2.7
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: true
+
+ /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.18)(react@18.2.0):
+ resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.22.6
+ '@types/react': 18.2.18
+ react: 18.2.0
+ dev: true
+
+ /@radix-ui/react-focus-scope@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.22.6
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@types/react': 18.2.18
+ '@types/react-dom': 18.2.7
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: true
+
+ /@radix-ui/react-id@1.0.1(@types/react@18.2.18)(react@18.2.0):
+ resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.22.6
+ '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@types/react': 18.2.18
+ react: 18.2.0
+ dev: true
+
+ /@radix-ui/react-menu@2.0.5(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-Gw4f9pwdH+w5w+49k0gLjN0PfRDHvxmAgG16AbyJZ7zhwZ6PBHKtWohvnSwfusfnK3L68dpBREHpVkj8wEM7ZA==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.22.6
+ '@radix-ui/primitive': 1.0.1
+ '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@radix-ui/react-context': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@radix-ui/react-direction': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-id': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-slot': 1.0.2(@types/react@18.2.18)(react@18.2.0)
+ '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@types/react': 18.2.18
+ '@types/react-dom': 18.2.7
+ aria-hidden: 1.2.3
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ react-remove-scroll: 2.5.5(@types/react@18.2.18)(react@18.2.0)
+ dev: true
+
+ /@radix-ui/react-popper@1.1.2(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.22.6
+ '@floating-ui/react-dom': 2.0.1(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@radix-ui/react-context': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@radix-ui/rect': 1.0.1
+ '@types/react': 18.2.18
+ '@types/react-dom': 18.2.7
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: true
+
+ /@radix-ui/react-portal@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.22.6
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0)
+ '@types/react': 18.2.18
+ '@types/react-dom': 18.2.7
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: true
+
+ /@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.22.6
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@types/react': 18.2.18
+ '@types/react-dom': 18.2.7
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: true
+
+ /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.22.6
+ '@radix-ui/react-slot': 1.0.2(@types/react@18.2.18)(react@18.2.0)
+ '@types/react': 18.2.18
+ '@types/react-dom': 18.2.7
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: true
+
+ /@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.22.6
+ '@radix-ui/primitive': 1.0.1
+ '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@radix-ui/react-context': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@radix-ui/react-direction': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@radix-ui/react-id': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@types/react': 18.2.18
+ '@types/react-dom': 18.2.7
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: true
+
+ /@radix-ui/react-slot@1.0.2(@types/react@18.2.18)(react@18.2.0):
+ resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.22.6
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@types/react': 18.2.18
+ react: 18.2.0
+ dev: true
+
+ /@radix-ui/react-tooltip@1.0.6(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-DmNFOiwEc2UDigsYj6clJENma58OelxD24O4IODoZ+3sQc3Zb+L8w1EP+y9laTuKCLAysPw4fD6/v0j4KNV8rg==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.22.6
+ '@radix-ui/primitive': 1.0.1
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@radix-ui/react-context': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-id': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-slot': 1.0.2(@types/react@18.2.18)(react@18.2.0)
+ '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0)
+ '@types/react': 18.2.18
+ '@types/react-dom': 18.2.7
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: true
+
+ /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.18)(react@18.2.0):
+ resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.22.6
+ '@types/react': 18.2.18
+ react: 18.2.0
+ dev: true
+
+ /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.18)(react@18.2.0):
+ resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.22.6
+ '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@types/react': 18.2.18
+ react: 18.2.0
+ dev: true
+
+ /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.18)(react@18.2.0):
+ resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.22.6
+ '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@types/react': 18.2.18
+ react: 18.2.0
+ dev: true
+
+ /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.18)(react@18.2.0):
+ resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.22.6
+ '@types/react': 18.2.18
+ react: 18.2.0
+ dev: true
+
+ /@radix-ui/react-use-rect@1.0.1(@types/react@18.2.18)(react@18.2.0):
+ resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.22.6
+ '@radix-ui/rect': 1.0.1
+ '@types/react': 18.2.18
+ react: 18.2.0
+ dev: true
+
+ /@radix-ui/react-use-size@1.0.1(@types/react@18.2.18)(react@18.2.0):
+ resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.22.6
+ '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.18)(react@18.2.0)
+ '@types/react': 18.2.18
+ react: 18.2.0
+ dev: true
+
+ /@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.22.6
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0)
+ '@types/react': 18.2.18
+ '@types/react-dom': 18.2.7
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: true
+
+ /@radix-ui/rect@1.0.1:
+ resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==}
+ dependencies:
+ '@babel/runtime': 7.22.6
+ dev: true
+
+ /@react-hookz/deep-equal@1.0.4:
+ resolution: {integrity: sha512-N56fTrAPUDz/R423pag+n6TXWbvlBZDtTehaGFjK0InmN+V2OFWLE/WmORhmn6Ce7dlwH5+tQN1LJFw3ngTJVg==}
+ dev: true
+
+ /@react-hookz/web@23.1.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-fvbURdsa1ukttbLR1ASE/XmqXP09vZ1PiCYppYeR1sNMzCrdkG0iBnjxniFSVjJ8gIw2fRs6nqMTbeBz2uAkuA==}
+ peerDependencies:
+ js-cookie: ^3.0.5
+ react: ^16.8 || ^17 || ^18
+ react-dom: ^16.8 || ^17 || ^18
+ peerDependenciesMeta:
+ js-cookie:
+ optional: true
+ dependencies:
+ '@react-hookz/deep-equal': 1.0.4
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: true
+
+ /@szhsin/react-menu@4.0.2(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-cYpktkWng7jCTPKog33w5iYldbaHQso5aJFd+7j3SkhInqYWjxiG0TtxUS0c5yFqLm6woGQEJHiBpiYHIaYMxg==}
+ peerDependencies:
+ react: '>=16.14.0'
+ react-dom: '>=16.14.0'
+ dependencies:
+ prop-types: 15.8.1
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ react-transition-state: 2.1.1(react-dom@18.2.0)(react@18.2.0)
+ dev: true
+
+ /@tsconfig/node10@1.0.9:
+ resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==}
+ dev: true
+
+ /@tsconfig/node12@1.0.11:
+ resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==}
+ dev: true
+
+ /@tsconfig/node14@1.0.3:
+ resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==}
+ dev: true
+
+ /@tsconfig/node16@1.0.4:
+ resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==}
+ dev: true
+
+ /@types/babel-plugin-macros@3.1.0:
+ resolution: {integrity: sha512-kxYWx+NISzy46KMgnXUthHJNbcGw9w1jn6e1LZAciTv8KKO5z9z1LakHnXCj5aYrwydZ5dGE3MAgEu4X/MdWkA==}
+ dependencies:
+ '@types/babel__core': 7.20.1
+ dev: true
+
+ /@types/babel__core@7.20.1:
+ resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==}
+ dependencies:
+ '@babel/parser': 7.22.7
+ '@babel/types': 7.22.5
+ '@types/babel__generator': 7.6.4
+ '@types/babel__template': 7.4.1
+ '@types/babel__traverse': 7.20.1
+ dev: true
+
+ /@types/babel__generator@7.6.4:
+ resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==}
+ dependencies:
+ '@babel/types': 7.22.5
+ dev: true
+
+ /@types/babel__template@7.4.1:
+ resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==}
+ dependencies:
+ '@babel/parser': 7.22.7
+ '@babel/types': 7.22.5
+ dev: true
+
+ /@types/babel__traverse@7.20.1:
+ resolution: {integrity: sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==}
+ dependencies:
+ '@babel/types': 7.22.5
+ dev: true
+
+ /@types/chrome@0.0.242:
+ resolution: {integrity: sha512-SeMXBSfcAGX9ezTz7Pro7n/AiNdIH3cetkdbM+Kfg3zD24jmbnm0IAEIxzx8ccqrnJenLCfD7fR+4WIYAbeQHw==}
+ dependencies:
+ '@types/filesystem': 0.0.32
+ '@types/har-format': 1.2.11
+ dev: true
+
+ /@types/codemirror@5.60.8:
+ resolution: {integrity: sha512-VjFgDF/eB+Aklcy15TtOTLQeMjTo07k7KAjql8OK5Dirr7a6sJY4T1uVBDuTVG9VEmn1uUsohOpYnVfgC6/jyw==}
+ dependencies:
+ '@types/tern': 0.23.4
+ dev: true
+
+ /@types/convert-source-map@2.0.0:
+ resolution: {integrity: sha512-QUm4YOC/ENo0VjPVl2o8HGyTbHHQGDOw8PCg3rXBucYHKyZN/XjXRbPFAV1tB2FvM0/wyFoDct4cTIctzKrQFg==}
+ dev: true
+
+ /@types/cross-spawn@6.0.2:
+ resolution: {integrity: sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw==}
+ dependencies:
+ '@types/node': 20.4.5
+ dev: true
+
+ /@types/debug@4.1.8:
+ resolution: {integrity: sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==}
+ dependencies:
+ '@types/ms': 0.7.31
+ dev: true
+
+ /@types/dedent@0.7.0:
+ resolution: {integrity: sha512-EGlKlgMhnLt/cM4DbUSafFdrkeJoC9Mvnj0PUCU7tFmTjMjNRT957kXCx0wYm3JuEq4o4ZsS5vG+NlkM2DMd2A==}
+ dev: true
+
+ /@types/element-resize-detector@1.1.3:
+ resolution: {integrity: sha512-rqmeHxzNMPar/3IbdQRm+mydv8KlEXUtcp5M47rbZUEjslTjg+bT5+OXCknTCIy1AfvNR0Kio44iMY2zUH65CQ==}
+ dev: true
+
+ /@types/eslint@8.44.1:
+ resolution: {integrity: sha512-XpNDc4Z5Tb4x+SW1MriMVeIsMoONHCkWFMkR/aPJbzEsxqHy+4Glu/BqTdPrApfDeMaXbtNh6bseNgl5KaWrSg==}
+ dependencies:
+ '@types/estree': 1.0.1
+ '@types/json-schema': 7.0.12
+ dev: true
+
+ /@types/estree@1.0.1:
+ resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==}
+ dev: true
+
+ /@types/filesystem@0.0.32:
+ resolution: {integrity: sha512-Yuf4jR5YYMR2DVgwuCiP11s0xuVRyPKmz8vo6HBY3CGdeMj8af93CFZX+T82+VD1+UqHOxTq31lO7MI7lepBtQ==}
+ dependencies:
+ '@types/filewriter': 0.0.29
+ dev: true
+
+ /@types/filewriter@0.0.29:
+ resolution: {integrity: sha512-BsPXH/irW0ht0Ji6iw/jJaK8Lj3FJemon2gvEqHKpCdDCeemHa+rI3WBGq5z7cDMZgoLjY40oninGxqk+8NzNQ==}
+ dev: true
+
+ /@types/glob-to-regexp@0.4.1:
+ resolution: {integrity: sha512-S0mIukll6fbF0tvrKic/jj+jI8SHoSvGU+Cs95b/jzZEnBYCbj+7aJtQ9yeABuK3xP1okwA3jEH9qIRayijnvQ==}
+ dev: true
+
+ /@types/har-format@1.2.11:
+ resolution: {integrity: sha512-T232/TneofqK30AD1LRrrf8KnjLvzrjWDp7eWST5KoiSzrBfRsLrWDPk4STQPW4NZG6v2MltnduBVmakbZOBIQ==}
+ dev: true
+
+ /@types/js-yaml@4.0.5:
+ resolution: {integrity: sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==}
+ dev: true
+
+ /@types/json-schema@7.0.12:
+ resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==}
+ dev: true
+
+ /@types/json5@0.0.29:
+ resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
+ dev: true
+
+ /@types/lodash-es@4.17.8:
+ resolution: {integrity: sha512-euY3XQcZmIzSy7YH5+Unb3b2X12Wtk54YWINBvvGQ5SmMvwb11JQskGsfkH/5HXK77Kr8GF0wkVDIxzAisWtog==}
+ dependencies:
+ '@types/lodash': 4.14.196
+ dev: true
+
+ /@types/lodash@4.14.196:
+ resolution: {integrity: sha512-22y3o88f4a94mKljsZcanlNWPzO0uBsBdzLAngf2tp533LzZcQzb6+eZPJ+vCTt+bqF2XnvT9gejTLsAcJAJyQ==}
+ dev: true
+
+ /@types/ms@0.7.31:
+ resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==}
+ dev: true
+
+ /@types/node@20.4.5:
+ resolution: {integrity: sha512-rt40Nk13II9JwQBdeYqmbn2Q6IVTA5uPhvSO+JVqdXw/6/4glI6oR9ezty/A9Hg5u7JH4OmYmuQ+XvjKm0Datg==}
+ dev: true
+
+ /@types/normalize-package-data@2.4.1:
+ resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==}
+ dev: true
+
+ /@types/parse-json@4.0.0:
+ resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==}
+ dev: true
+
+ /@types/postcss-modules-local-by-default@4.0.0:
+ resolution: {integrity: sha512-0VLab/pcLTLcfbxi6THSIMVYcw9hEUBGvjwwaGpW77mMgRXfGF+a76t7BxTGyLh1y68tBvrffp8UWnqvm76+yg==}
+ dependencies:
+ postcss: 8.4.27
+ dev: true
+
+ /@types/postcss-modules-scope@3.0.1:
+ resolution: {integrity: sha512-LNkp3c4ML9EQj2dgslp4i80Jxj72YK3HjYzrTn6ftUVylW1zaKFGqrMlNIyqBmPWmIhZ/Y5r0Y4T49Hk1IuDUg==}
+ dependencies:
+ postcss: 8.4.27
+ dev: true
+
+ /@types/pouchdb-adapter-http@6.1.3:
+ resolution: {integrity: sha512-9Z4TLbF/KJWy/D2sWRPBA+RNU0odQimfdvlDX+EY7rGcd3aVoH8qjD/X0Xcd/0dfBH5pKrNIMFFQgW/TylRCmA==}
+ dependencies:
+ '@types/pouchdb-core': 7.0.11
+ dev: true
+
+ /@types/pouchdb-adapter-idb@6.1.4:
+ resolution: {integrity: sha512-KIAXbkF4uYUz0ZwfNEFLtEkK44mEWopAsD76UhucH92XnJloBysav+TjI4FFfYQyTjoW3S1s6V+Z14CUJZ0F6w==}
+ dependencies:
+ '@types/pouchdb-core': 7.0.11
+ dev: true
+
+ /@types/pouchdb-adapter-websql@6.1.4:
+ resolution: {integrity: sha512-zMJQCtXC40hBsIDRn0GhmpeGMK0f9l/OGWfLguvczROzxxcOD7REI+e6SEmX7gJKw5JuMvlfuHzkQwjmvSJbtg==}
+ dependencies:
+ '@types/pouchdb-core': 7.0.11
+ dev: true
+
+ /@types/pouchdb-browser@6.1.3:
+ resolution: {integrity: sha512-EdYowrWxW9SWBMX/rux2eq7dbHi5Zeyzz+FF/IAsgQKnUxgeCO5VO2j4zTzos0SDyJvAQU+EYRc11r7xGn5tvA==}
+ dependencies:
+ '@types/pouchdb-adapter-http': 6.1.3
+ '@types/pouchdb-adapter-idb': 6.1.4
+ '@types/pouchdb-adapter-websql': 6.1.4
+ '@types/pouchdb-core': 7.0.11
+ '@types/pouchdb-mapreduce': 6.1.7
+ '@types/pouchdb-replication': 6.4.4
+ dev: true
+
+ /@types/pouchdb-core@7.0.11:
+ resolution: {integrity: sha512-KTKj0Taf8pLTj8eW3qBtCd1Fh+/yhEyVo6/1czTN46MnseobdmnqgXtzaKgHMbuLouh+SHK1vM++aMPaG1qTTA==}
+ dependencies:
+ '@types/debug': 4.1.8
+ '@types/pouchdb-find': 7.3.0
+ dev: true
+
+ /@types/pouchdb-find@7.3.0:
+ resolution: {integrity: sha512-sFPli5tBjGX9UfXioik1jUzPdcN84eV82n0lmEFuoPepWqkLjQcyri0eOa++HYOaNPyMDhKFBqEALEZivK2dRg==}
+ dependencies:
+ '@types/pouchdb-core': 7.0.11
+ dev: true
+
+ /@types/pouchdb-mapreduce@6.1.7:
+ resolution: {integrity: sha512-WzBwm7tmO9QhfRzVaWT4v6JQSS/fG2OoUDrWrhX87rPe2Pn6laPvdK5li6myNRxCoI/l5e8Jd+oYBAFnaiFucA==}
+ dependencies:
+ '@types/pouchdb-core': 7.0.11
+ dev: true
+
+ /@types/pouchdb-replication@6.4.4:
+ resolution: {integrity: sha512-BsE5LKpjJK4iAf6Fx5kyrMw+33V+Ip7uWldUnU2BYrrvtR+MLD22dcImm7DZN1st2wPPb91i0XEnQzvP0w1C/Q==}
+ dependencies:
+ '@types/pouchdb-core': 7.0.11
+ '@types/pouchdb-find': 7.3.0
+ dev: true
+
+ /@types/prettier@2.7.3:
+ resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==}
+ dev: true
+
+ /@types/prop-types@15.7.5:
+ resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==}
+ dev: true
+
+ /@types/react-dom@18.2.7:
+ resolution: {integrity: sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==}
+ dependencies:
+ '@types/react': 18.2.18
+ dev: true
+
+ /@types/react-helmet@6.1.6:
+ resolution: {integrity: sha512-ZKcoOdW/Tg+kiUbkFCBtvDw0k3nD4HJ/h/B9yWxN4uDO8OkRksWTO+EL+z/Qu3aHTeTll3Ro0Cc/8UhwBCMG5A==}
+ dependencies:
+ '@types/react': 18.2.18
+ dev: true
+
+ /@types/react-window@1.8.5:
+ resolution: {integrity: sha512-V9q3CvhC9Jk9bWBOysPGaWy/Z0lxYcTXLtLipkt2cnRj1JOSFNF7wqGpkScSXMgBwC+fnVRg/7shwgddBG5ICw==}
+ dependencies:
+ '@types/react': 18.2.18
+ dev: true
+
+ /@types/react@18.2.18:
+ resolution: {integrity: sha512-da4NTSeBv/P34xoZPhtcLkmZuJ+oYaCxHmyHzwaDQo9RQPBeXV+06gEk2FpqEcsX9XrnNLvRpVh6bdavDSjtiQ==}
+ dependencies:
+ '@types/prop-types': 15.7.5
+ '@types/scheduler': 0.16.3
+ csstype: 3.1.2
+ dev: true
+
+ /@types/retry@0.12.0:
+ resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==}
+ dev: true
+
+ /@types/scheduler@0.16.3:
+ resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==}
+ dev: true
+
+ /@types/semver@7.5.0:
+ resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==}
+ dev: true
+
+ /@types/stylis@4.2.0:
+ resolution: {integrity: sha512-n4sx2bqL0mW1tvDf/loQ+aMX7GQD3lc3fkCMC55VFNDu/vBOabO+LTIeXKM14xK0ppk5TUGcWRjiSpIlUpghKw==}
+ dev: true
+
+ /@types/tern@0.23.4:
+ resolution: {integrity: sha512-JAUw1iXGO1qaWwEOzxTKJZ/5JxVeON9kvGZ/osgZaJImBnyjyn0cjovPsf6FNLmyGY8Vw9DoXZCMlfMkMwHRWg==}
+ dependencies:
+ '@types/estree': 1.0.1
+ dev: true
+
+ /@types/ua-parser-js@0.7.36:
+ resolution: {integrity: sha512-N1rW+njavs70y2cApeIw1vLMYXRwfBy+7trgavGuuTfOd7j1Yh7QTRc/yqsPl6ncokt72ZXuxEU0PiCp9bSwNQ==}
+ dev: true
+
+ /@types/validator@13.7.17:
+ resolution: {integrity: sha512-aqayTNmeWrZcvnG2MG9eGYI6b7S5fl+yKgPs6bAjOTwPS316R5SxBGKvtSExfyoJU7pIeHJfsHI0Ji41RVMkvQ==}
+ dev: true
+
+ /@types/w3c-css-typed-object-model-level-1@20180410.0.5:
+ resolution: {integrity: sha512-khoqDQqA/fUdK6mEJtQEfMAPCKkk8E1D+ahM/0HCy3mc5L33wJinqQNXu9Uf4+mqzMvORljHg76jvrmwS0bEjA==}
+ dev: true
+
+ /@types/webextension-polyfill@0.10.1:
+ resolution: {integrity: sha512-Sdg+E2F5JUbhkE1qX15QUxpyhfMFKRGJqND9nb1C0gNN4NR7kCV31/1GvNbg6Xe+m/JElJ9/lG5kepMzjGPuQw==}
+ dev: true
+
+ /@typescript-eslint/eslint-plugin@6.2.1(@typescript-eslint/parser@6.2.1)(eslint@8.46.0)(typescript@5.2.0-beta):
+ resolution: {integrity: sha512-iZVM/ALid9kO0+I81pnp1xmYiFyqibAHzrqX4q5YvvVEyJqY+e6rfTXSCsc2jUxGNqJqTfFSSij/NFkZBiBzLw==}
+ engines: {node: ^16.0.0 || >=18.0.0}
+ peerDependencies:
+ '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha
+ eslint: ^7.0.0 || ^8.0.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@eslint-community/regexpp': 4.6.2
+ '@typescript-eslint/parser': 6.2.1(eslint@8.46.0)(typescript@5.2.0-beta)
+ '@typescript-eslint/scope-manager': 6.2.1
+ '@typescript-eslint/type-utils': 6.2.1(eslint@8.46.0)(typescript@5.2.0-beta)
+ '@typescript-eslint/utils': 6.2.1(eslint@8.46.0)(typescript@5.2.0-beta)
+ '@typescript-eslint/visitor-keys': 6.2.1
+ debug: 4.3.4
+ eslint: 8.46.0
+ graphemer: 1.4.0
+ ignore: 5.2.4
+ natural-compare: 1.4.0
+ natural-compare-lite: 1.4.0
+ semver: 7.5.4
+ ts-api-utils: 1.0.1(typescript@5.2.0-beta)
+ typescript: 5.2.0-beta
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/parser@6.2.1(eslint@8.46.0)(typescript@5.2.0-beta):
+ resolution: {integrity: sha512-Ld+uL1kYFU8e6btqBFpsHkwQ35rw30IWpdQxgOqOh4NfxSDH6uCkah1ks8R/RgQqI5hHPXMaLy9fbFseIe+dIg==}
+ engines: {node: ^16.0.0 || >=18.0.0}
+ peerDependencies:
+ eslint: ^7.0.0 || ^8.0.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/scope-manager': 6.2.1
+ '@typescript-eslint/types': 6.2.1
+ '@typescript-eslint/typescript-estree': 6.2.1(typescript@5.2.0-beta)
+ '@typescript-eslint/visitor-keys': 6.2.1
+ debug: 4.3.4
+ eslint: 8.46.0
+ typescript: 5.2.0-beta
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/scope-manager@6.2.1:
+ resolution: {integrity: sha512-UCqBF9WFqv64xNsIEPfBtenbfodPXsJ3nPAr55mGPkQIkiQvgoWNo+astj9ZUfJfVKiYgAZDMnM6dIpsxUMp3Q==}
+ engines: {node: ^16.0.0 || >=18.0.0}
+ dependencies:
+ '@typescript-eslint/types': 6.2.1
+ '@typescript-eslint/visitor-keys': 6.2.1
+ dev: true
+
+ /@typescript-eslint/type-utils@6.2.1(eslint@8.46.0)(typescript@5.2.0-beta):
+ resolution: {integrity: sha512-fTfCgomBMIgu2Dh2Or3gMYgoNAnQm3RLtRp+jP7A8fY+LJ2+9PNpi5p6QB5C4RSP+U3cjI0vDlI3mspAkpPVbQ==}
+ engines: {node: ^16.0.0 || >=18.0.0}
+ peerDependencies:
+ eslint: ^7.0.0 || ^8.0.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/typescript-estree': 6.2.1(typescript@5.2.0-beta)
+ '@typescript-eslint/utils': 6.2.1(eslint@8.46.0)(typescript@5.2.0-beta)
+ debug: 4.3.4
+ eslint: 8.46.0
+ ts-api-utils: 1.0.1(typescript@5.2.0-beta)
+ typescript: 5.2.0-beta
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/types@6.2.1:
+ resolution: {integrity: sha512-528bGcoelrpw+sETlyM91k51Arl2ajbNT9L4JwoXE2dvRe1yd8Q64E4OL7vHYw31mlnVsf+BeeLyAZUEQtqahQ==}
+ engines: {node: ^16.0.0 || >=18.0.0}
+ dev: true
+
+ /@typescript-eslint/typescript-estree@6.2.1(typescript@5.2.0-beta):
+ resolution: {integrity: sha512-G+UJeQx9AKBHRQBpmvr8T/3K5bJa485eu+4tQBxFq0KoT22+jJyzo1B50JDT9QdC1DEmWQfdKsa8ybiNWYsi0Q==}
+ engines: {node: ^16.0.0 || >=18.0.0}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/types': 6.2.1
+ '@typescript-eslint/visitor-keys': 6.2.1
+ debug: 4.3.4
+ globby: 11.1.0
+ is-glob: 4.0.3
+ semver: 7.5.4
+ ts-api-utils: 1.0.1(typescript@5.2.0-beta)
+ typescript: 5.2.0-beta
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/utils@6.2.1(eslint@8.46.0)(typescript@5.2.0-beta):
+ resolution: {integrity: sha512-eBIXQeupYmxVB6S7x+B9SdBeB6qIdXKjgQBge2J+Ouv8h9Cxm5dHf/gfAZA6dkMaag+03HdbVInuXMmqFB/lKQ==}
+ engines: {node: ^16.0.0 || >=18.0.0}
+ peerDependencies:
+ eslint: ^7.0.0 || ^8.0.0
+ dependencies:
+ '@eslint-community/eslint-utils': 4.4.0(eslint@8.46.0)
+ '@types/json-schema': 7.0.12
+ '@types/semver': 7.5.0
+ '@typescript-eslint/scope-manager': 6.2.1
+ '@typescript-eslint/types': 6.2.1
+ '@typescript-eslint/typescript-estree': 6.2.1(typescript@5.2.0-beta)
+ eslint: 8.46.0
+ semver: 7.5.4
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+ dev: true
+
+ /@typescript-eslint/visitor-keys@6.2.1:
+ resolution: {integrity: sha512-iTN6w3k2JEZ7cyVdZJTVJx2Lv7t6zFA8DCrJEHD2mwfc16AEvvBWVhbFh34XyG2NORCd0viIgQY1+u7kPI0WpA==}
+ engines: {node: ^16.0.0 || >=18.0.0}
+ dependencies:
+ '@typescript-eslint/types': 6.2.1
+ eslint-visitor-keys: 3.4.1
+ dev: true
+
+ /@vscode/codicons@0.0.33:
+ resolution: {integrity: sha512-VdgpnD75swH9hpXjd34VBgQ2w2quK63WljodlUcOoJDPKiV+rPjHrcUc2sjLCNKxhl6oKqmsZgwOWcDAY2GKKQ==}
+ dev: true
+
+ /@wry/context@0.7.3:
+ resolution: {integrity: sha512-Nl8WTesHp89RF803Se9X3IiHjdmLBrIvPMaJkl+rKVJAYyPsz1TEUbu89943HpvujtSJgDUx9W4vZw3K1Mr3sA==}
+ engines: {node: '>=8'}
+ dependencies:
+ tslib: 2.6.1
+ dev: true
+
+ /@wry/equality@0.5.6:
+ resolution: {integrity: sha512-D46sfMTngaYlrH+OspKf8mIJETntFnf6Hsjb0V41jAXJ7Bx2kB8Rv8RCUujuVWYttFtHkUNp7g+FwxNQAr6mXA==}
+ engines: {node: '>=8'}
+ dependencies:
+ tslib: 2.6.1
+ dev: true
+
+ /@wry/trie@0.3.2:
+ resolution: {integrity: sha512-yRTyhWSls2OY/pYLfwff867r8ekooZ4UI+/gxot5Wj8EFwSf2rG+n+Mo/6LoLQm1TKA4GRj2+LCpbfS937dClQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ tslib: 2.6.1
+ dev: true
+
+ /@wry/trie@0.4.3:
+ resolution: {integrity: sha512-I6bHwH0fSf6RqQcnnXLJKhkSXG45MFral3GxPaY4uAl0LYDZM+YDVDAiU9bYwjTuysy1S0IeecWtmq1SZA3M1w==}
+ engines: {node: '>=8'}
+ dependencies:
+ tslib: 2.6.1
+ dev: true
+
+ /acorn-jsx@5.3.2(acorn@8.10.0):
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+ dependencies:
+ acorn: 8.10.0
+ dev: true
+
+ /acorn-walk@8.2.0:
+ resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==}
+ engines: {node: '>=0.4.0'}
+ dev: true
+
+ /acorn@8.10.0:
+ resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+ dev: true
+
+ /agent-base@7.1.0:
+ resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==}
+ engines: {node: '>= 14'}
+ dependencies:
+ debug: 4.3.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /aggregate-error@3.1.0:
+ resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==}
+ engines: {node: '>=8'}
+ dependencies:
+ clean-stack: 2.2.0
+ indent-string: 4.0.0
+ dev: true
+
+ /ajv@6.12.6:
+ resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-json-stable-stringify: 2.1.0
+ json-schema-traverse: 0.4.1
+ uri-js: 4.4.1
+ dev: true
+
+ /ansi-escapes@4.3.2:
+ resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ type-fest: 0.21.3
+ dev: true
+
+ /ansi-regex@5.0.1:
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /ansi-styles@3.2.1:
+ resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
+ engines: {node: '>=4'}
+ dependencies:
+ color-convert: 1.9.3
+ dev: true
+
+ /ansi-styles@4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+ dependencies:
+ color-convert: 2.0.1
+ dev: true
+
+ /anymatch@3.1.3:
+ resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+ engines: {node: '>= 8'}
+ dependencies:
+ normalize-path: 3.0.0
+ picomatch: 2.3.1
+ dev: true
+
+ /archiver-utils@2.1.0:
+ resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==}
+ engines: {node: '>= 6'}
+ dependencies:
+ glob: 7.2.3
+ graceful-fs: 4.2.11
+ lazystream: 1.0.1
+ lodash.defaults: 4.2.0
+ lodash.difference: 4.5.0
+ lodash.flatten: 4.4.0
+ lodash.isplainobject: 4.0.6
+ lodash.union: 4.6.0
+ normalize-path: 3.0.0
+ readable-stream: 2.3.8
+ dev: true
+
+ /archiver@5.3.1:
+ resolution: {integrity: sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==}
+ engines: {node: '>= 10'}
+ dependencies:
+ archiver-utils: 2.1.0
+ async: 3.2.4
+ buffer-crc32: 0.2.13
+ readable-stream: 3.6.2
+ readdir-glob: 1.1.3
+ tar-stream: 2.2.0
+ zip-stream: 4.1.0
+ dev: true
+
+ /arg@4.1.3:
+ resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==}
+ dev: true
+
+ /arg@5.0.2:
+ resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
+ dev: true
+
+ /argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+ dev: true
+
+ /aria-hidden@1.2.3:
+ resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ tslib: 2.6.1
+ dev: true
+
+ /aria-query@5.3.0:
+ resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
+ dependencies:
+ dequal: 2.0.3
+ dev: true
+
+ /array-buffer-byte-length@1.0.0:
+ resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==}
+ dependencies:
+ call-bind: 1.0.2
+ is-array-buffer: 3.0.2
+ dev: true
+
+ /array-includes@3.1.6:
+ resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.2.0
+ es-abstract: 1.22.1
+ get-intrinsic: 1.2.1
+ is-string: 1.0.7
+ dev: true
+
+ /array-union@2.1.0:
+ resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /array.prototype.findlastindex@1.2.2:
+ resolution: {integrity: sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.2.0
+ es-abstract: 1.22.1
+ es-shim-unscopables: 1.0.0
+ get-intrinsic: 1.2.1
+ dev: true
+
+ /array.prototype.flat@1.3.1:
+ resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.2.0
+ es-abstract: 1.22.1
+ es-shim-unscopables: 1.0.0
+ dev: true
+
+ /array.prototype.flatmap@1.3.1:
+ resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.2.0
+ es-abstract: 1.22.1
+ es-shim-unscopables: 1.0.0
+ dev: true
+
+ /arraybuffer.prototype.slice@1.0.1:
+ resolution: {integrity: sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ array-buffer-byte-length: 1.0.0
+ call-bind: 1.0.2
+ define-properties: 1.2.0
+ get-intrinsic: 1.2.1
+ is-array-buffer: 3.0.2
+ is-shared-array-buffer: 1.0.2
+ dev: true
+
+ /astral-regex@2.0.0:
+ resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /async-mutex@0.4.0:
+ resolution: {integrity: sha512-eJFZ1YhRR8UN8eBLoNzcDPcy/jqjsg6I1AP+KvWQX80BqOSW1oJPJXDylPUEeMr2ZQvHgnQ//Lp6f3RQ1zI7HA==}
+ dependencies:
+ tslib: 2.6.1
+ dev: true
+
+ /async@3.2.4:
+ resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==}
+ dev: true
+
+ /auto-bind@4.0.0:
+ resolution: {integrity: sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /available-typed-arrays@1.0.5:
+ resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /axe-core@4.7.2:
+ resolution: {integrity: sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /axobject-query@3.2.1:
+ resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==}
+ dependencies:
+ dequal: 2.0.3
+ dev: true
+
+ /babel-plugin-macros@2.8.0:
+ resolution: {integrity: sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==}
+ dependencies:
+ '@babel/runtime': 7.22.6
+ cosmiconfig: 6.0.0
+ resolve: 1.22.2
+ dev: true
+
+ /babel-plugin-macros@3.1.0:
+ resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==}
+ engines: {node: '>=10', npm: '>=6'}
+ dependencies:
+ '@babel/runtime': 7.22.6
+ cosmiconfig: 7.1.0
+ resolve: 1.22.2
+ dev: true
+
+ /babel-plugin-transform-minify-gql-template-literals@1.1.1:
+ resolution: {integrity: sha512-J4Un0uOHDG8Csa8+7Q0sIAPzwT9OyafS3kAoSBhAjIpuIgsDLZaCQTjaKQr2UryikMvzObwL8FRR6LRTp0oP1w==}
+ dev: true
+
+ /balanced-match@1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+ dev: true
+
+ /base64-js@1.5.1:
+ resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+ dev: true
+
+ /big-integer@1.6.51:
+ resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==}
+ engines: {node: '>=0.6'}
+ dev: true
+
+ /binary-extensions@2.2.0:
+ resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /bl@4.1.0:
+ resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
+ dependencies:
+ buffer: 5.7.1
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+ dev: true
+
+ /bplist-parser@0.2.0:
+ resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==}
+ engines: {node: '>= 5.10.0'}
+ dependencies:
+ big-integer: 1.6.51
+ dev: true
+
+ /brace-expansion@1.1.11:
+ resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+ dev: true
+
+ /brace-expansion@2.0.1:
+ resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
+ dependencies:
+ balanced-match: 1.0.2
+ dev: true
+
+ /braces@3.0.2:
+ resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
+ engines: {node: '>=8'}
+ dependencies:
+ fill-range: 7.0.1
+ dev: true
+
+ /browserslist@4.21.10:
+ resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+ dependencies:
+ caniuse-lite: 1.0.30001517
+ electron-to-chromium: 1.4.478
+ node-releases: 2.0.13
+ update-browserslist-db: 1.0.11(browserslist@4.21.10)
+ dev: true
+
+ /buffer-crc32@0.2.13:
+ resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
+ dev: true
+
+ /buffer@5.7.1:
+ resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
+ dependencies:
+ base64-js: 1.5.1
+ ieee754: 1.2.1
+ dev: true
+
+ /builtin-modules@3.3.0:
+ resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /bundle-name@3.0.0:
+ resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==}
+ engines: {node: '>=12'}
+ dependencies:
+ run-applescript: 5.0.0
+ dev: true
+
+ /call-bind@1.0.2:
+ resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==}
+ dependencies:
+ function-bind: 1.1.1
+ get-intrinsic: 1.2.1
+ dev: true
+
+ /callsites@3.1.0:
+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /camel-case@4.1.2:
+ resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==}
+ dependencies:
+ pascal-case: 3.1.2
+ tslib: 2.6.1
+ dev: true
+
+ /caniuse-lite@1.0.30001517:
+ resolution: {integrity: sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==}
+ dev: true
+
+ /capital-case@1.0.4:
+ resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==}
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.6.1
+ upper-case-first: 2.0.2
+ dev: true
+
+ /chalk@2.4.2:
+ resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
+ engines: {node: '>=4'}
+ dependencies:
+ ansi-styles: 3.2.1
+ escape-string-regexp: 1.0.5
+ supports-color: 5.5.0
+ dev: true
+
+ /chalk@4.1.2:
+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+ engines: {node: '>=10'}
+ dependencies:
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
+ dev: true
+
+ /change-case-all@1.0.15:
+ resolution: {integrity: sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==}
+ dependencies:
+ change-case: 4.1.2
+ is-lower-case: 2.0.2
+ is-upper-case: 2.0.2
+ lower-case: 2.0.2
+ lower-case-first: 2.0.2
+ sponge-case: 1.0.1
+ swap-case: 2.0.2
+ title-case: 3.0.3
+ upper-case: 2.0.2
+ upper-case-first: 2.0.2
+ dev: true
+
+ /change-case@4.1.2:
+ resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==}
+ dependencies:
+ camel-case: 4.1.2
+ capital-case: 1.0.4
+ constant-case: 3.0.4
+ dot-case: 3.0.4
+ header-case: 2.0.4
+ no-case: 3.0.4
+ param-case: 3.0.4
+ pascal-case: 3.1.2
+ path-case: 3.0.4
+ sentence-case: 3.0.4
+ snake-case: 3.0.4
+ tslib: 2.6.1
+ dev: true
+
+ /checkpoint-client@1.1.24:
+ resolution: {integrity: sha512-nIOlLhDS7MKs4tUzS3LCm+sE1NgTCVnVrXlD0RRxaoEkkLu8LIWSUNiNWai6a+LK5unLzTyZeTCYX1Smqy0YoA==}
+ dependencies:
+ ci-info: 3.8.0
+ env-paths: 2.2.1
+ fast-write-atomic: 0.2.1
+ make-dir: 3.1.0
+ ms: 2.1.3
+ node-fetch: 2.6.11
+ uuid: 9.0.0
+ transitivePeerDependencies:
+ - encoding
+ dev: true
+
+ /chokidar@3.5.3:
+ resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
+ engines: {node: '>= 8.10.0'}
+ dependencies:
+ anymatch: 3.1.3
+ braces: 3.0.2
+ glob-parent: 5.1.2
+ is-binary-path: 2.1.0
+ is-glob: 4.0.3
+ normalize-path: 3.0.0
+ readdirp: 3.6.0
+ optionalDependencies:
+ fsevents: 2.3.2
+ dev: true
+
+ /ci-info@3.8.0:
+ resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /class-validator@0.14.0:
+ resolution: {integrity: sha512-ct3ltplN8I9fOwUd8GrP8UQixwff129BkEtuWDKL5W45cQuLd19xqmTLu5ge78YDm/fdje6FMt0hGOhl0lii3A==}
+ dependencies:
+ '@types/validator': 13.7.17
+ libphonenumber-js: 1.10.38
+ validator: 13.9.0
+ dev: true
+
+ /clean-regexp@1.0.0:
+ resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==}
+ engines: {node: '>=4'}
+ dependencies:
+ escape-string-regexp: 1.0.5
+ dev: true
+
+ /clean-stack@2.2.0:
+ resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /cli-truncate@2.1.0:
+ resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==}
+ engines: {node: '>=8'}
+ dependencies:
+ slice-ansi: 3.0.0
+ string-width: 4.2.3
+ dev: true
+
+ /client-only@0.0.1:
+ resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
+ dev: true
+
+ /clsx@1.2.1:
+ resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /codemirror-graphql@2.0.9(@codemirror/language@6.0.0)(codemirror@5.65.14)(graphql@16.7.1):
+ resolution: {integrity: sha512-gl1LR6XSBgZtl7Dr2q4jjRNfhxMF8vn+rnjZTZPf/l+VrQgavY8l3G//hW7s3hWy73iiqkq5LZ4KE1tdaxB/vQ==}
+ peerDependencies:
+ '@codemirror/language': 6.0.0
+ codemirror: ^5.65.3
+ graphql: ^15.5.0 || ^16.0.0
+ dependencies:
+ '@codemirror/language': 6.0.0
+ codemirror: 5.65.14
+ graphql: 16.7.1
+ graphql-language-service: 5.1.7(graphql@16.7.1)
+ dev: true
+
+ /codemirror@5.65.14:
+ resolution: {integrity: sha512-VSNugIBDGt0OU9gDjeVr6fNkoFQznrWEUdAApMlXQNbfE8gGO19776D6MwSqF/V/w/sDwonsQ0z7KmmI9guScg==}
+ dev: true
+
+ /color-convert@1.9.3:
+ resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
+ dependencies:
+ color-name: 1.1.3
+ dev: true
+
+ /color-convert@2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+ dependencies:
+ color-name: 1.1.4
+ dev: true
+
+ /color-name@1.1.3:
+ resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
+ dev: true
+
+ /color-name@1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+ dev: true
+
+ /comlink@4.4.1:
+ resolution: {integrity: sha512-+1dlx0aY5Jo1vHy/tSsIGpSkN4tS9rZSW8FIhG0JH/crs9wwweswIo/POr451r7bZww3hFbPAKnTpimzL/mm4Q==}
+ dev: true
+
+ /commander@11.0.0:
+ resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==}
+ engines: {node: '>=16'}
+ dev: true
+
+ /common-tags@1.8.2:
+ resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==}
+ engines: {node: '>=4.0.0'}
+ dev: true
+
+ /commondir@1.0.1:
+ resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==}
+ dev: true
+
+ /compress-commons@4.1.1:
+ resolution: {integrity: sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==}
+ engines: {node: '>= 10'}
+ dependencies:
+ buffer-crc32: 0.2.13
+ crc32-stream: 4.0.2
+ normalize-path: 3.0.0
+ readable-stream: 3.6.2
+ dev: true
+
+ /concat-map@0.0.1:
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+ dev: true
+
+ /constant-case@3.0.4:
+ resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==}
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.6.1
+ upper-case: 2.0.2
+ dev: true
+
+ /convert-source-map@1.9.0:
+ resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
+ dev: true
+
+ /copy-anything@2.0.6:
+ resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==}
+ dependencies:
+ is-what: 3.14.1
+ dev: true
+
+ /copy-anything@3.0.5:
+ resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==}
+ engines: {node: '>=12.13'}
+ dependencies:
+ is-what: 4.1.15
+ dev: true
+
+ /copy-to-clipboard@3.3.3:
+ resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==}
+ dependencies:
+ toggle-selection: 1.0.6
+ dev: true
+
+ /core-util-is@1.0.3:
+ resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
+ dev: true
+
+ /cosmiconfig@6.0.0:
+ resolution: {integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==}
+ engines: {node: '>=8'}
+ dependencies:
+ '@types/parse-json': 4.0.0
+ import-fresh: 3.3.0
+ parse-json: 5.2.0
+ path-type: 4.0.0
+ yaml: 1.10.2
+ dev: true
+
+ /cosmiconfig@7.1.0:
+ resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==}
+ engines: {node: '>=10'}
+ dependencies:
+ '@types/parse-json': 4.0.0
+ import-fresh: 3.3.0
+ parse-json: 5.2.0
+ path-type: 4.0.0
+ yaml: 1.10.2
+ dev: true
+
+ /crc-32@1.2.2:
+ resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==}
+ engines: {node: '>=0.8'}
+ hasBin: true
+ dev: true
+
+ /crc32-stream@4.0.2:
+ resolution: {integrity: sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==}
+ engines: {node: '>= 10'}
+ dependencies:
+ crc-32: 1.2.2
+ readable-stream: 3.6.2
+ dev: true
+
+ /create-require@1.1.1:
+ resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
+ dev: true
+
+ /cross-spawn@7.0.3:
+ resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
+ engines: {node: '>= 8'}
+ dependencies:
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.2
+ dev: true
+
+ /crypto-random-string@2.0.0:
+ resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /css-tree@1.1.3:
+ resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==}
+ engines: {node: '>=8.0.0'}
+ dependencies:
+ mdn-data: 2.0.14
+ source-map: 0.6.1
+ dev: true
+
+ /cssesc@3.0.0:
+ resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
+ engines: {node: '>=4'}
+ hasBin: true
+ dev: true
+
+ /csstype@3.1.2:
+ resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==}
+ dev: true
+
+ /damerau-levenshtein@1.0.8:
+ resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==}
+ dev: true
+
+ /debug@3.2.7:
+ resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ dependencies:
+ ms: 2.1.3
+ dev: true
+
+ /debug@4.3.4:
+ resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ dependencies:
+ ms: 2.1.2
+ dev: true
+
+ /dedent@1.5.1(babel-plugin-macros@3.1.0):
+ resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==}
+ peerDependencies:
+ babel-plugin-macros: ^3.1.0
+ peerDependenciesMeta:
+ babel-plugin-macros:
+ optional: true
+ dependencies:
+ babel-plugin-macros: 3.1.0
+ dev: true
+
+ /deep-is@0.1.4:
+ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+ dev: true
+
+ /default-browser-id@3.0.0:
+ resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==}
+ engines: {node: '>=12'}
+ dependencies:
+ bplist-parser: 0.2.0
+ untildify: 4.0.0
+ dev: true
+
+ /default-browser@4.0.0:
+ resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==}
+ engines: {node: '>=14.16'}
+ dependencies:
+ bundle-name: 3.0.0
+ default-browser-id: 3.0.0
+ execa: 7.2.0
+ titleize: 3.0.0
+ dev: true
+
+ /define-lazy-prop@3.0.0:
+ resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /define-properties@1.2.0:
+ resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-property-descriptors: 1.0.0
+ object-keys: 1.1.1
+ dev: true
+
+ /del@6.1.1:
+ resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==}
+ engines: {node: '>=10'}
+ dependencies:
+ globby: 11.1.0
+ graceful-fs: 4.2.11
+ is-glob: 4.0.3
+ is-path-cwd: 2.2.0
+ is-path-inside: 3.0.3
+ p-map: 4.0.0
+ rimraf: 3.0.2
+ slash: 3.0.0
+ dev: true
+
+ /dependency-graph@0.11.0:
+ resolution: {integrity: sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==}
+ engines: {node: '>= 0.6.0'}
+ dev: true
+
+ /dequal@2.0.3:
+ resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /detect-node-es@1.1.0:
+ resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==}
+ dev: true
+
+ /diff@4.0.2:
+ resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==}
+ engines: {node: '>=0.3.1'}
+ dev: true
+
+ /dir-glob@3.0.1:
+ resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
+ engines: {node: '>=8'}
+ dependencies:
+ path-type: 4.0.0
+ dev: true
+
+ /doctrine@2.1.0:
+ resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ esutils: 2.0.3
+ dev: true
+
+ /doctrine@3.0.0:
+ resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ esutils: 2.0.3
+ dev: true
+
+ /dot-case@3.0.4:
+ resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==}
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.6.1
+ dev: true
+
+ /dotenv@16.0.3:
+ resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /dotenv@16.3.1:
+ resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /dset@3.1.2:
+ resolution: {integrity: sha512-g/M9sqy3oHe477Ar4voQxWtaPIFw1jTdKZuomOjhCcBx9nHUNn0pu6NopuFFrTh/TRZIKEj+76vLWFu9BNKk+Q==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /electron-to-chromium@1.4.478:
+ resolution: {integrity: sha512-qjTA8djMXd+ruoODDFGnRCRBpID+AAfYWCyGtYTNhsuwxI19s8q19gbjKTwRS5z/LyVf5wICaIiPQGLekmbJbA==}
+ dev: true
+
+ /emoji-regex@10.2.1:
+ resolution: {integrity: sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA==}
+ dev: true
+
+ /emoji-regex@8.0.0:
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+ dev: true
+
+ /end-of-stream@1.4.4:
+ resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
+ dependencies:
+ once: 1.4.0
+ dev: true
+
+ /enhanced-resolve@5.15.0:
+ resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==}
+ engines: {node: '>=10.13.0'}
+ dependencies:
+ graceful-fs: 4.2.11
+ tapable: 2.2.1
+ dev: true
+
+ /entities@2.1.0:
+ resolution: {integrity: sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==}
+ dev: true
+
+ /env-paths@2.2.1:
+ resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /errno@0.1.8:
+ resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==}
+ hasBin: true
+ requiresBuild: true
+ dependencies:
+ prr: 1.0.1
+ dev: true
+ optional: true
+
+ /error-ex@1.3.2:
+ resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
+ dependencies:
+ is-arrayish: 0.2.1
+ dev: true
+
+ /es-abstract@1.22.1:
+ resolution: {integrity: sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ array-buffer-byte-length: 1.0.0
+ arraybuffer.prototype.slice: 1.0.1
+ available-typed-arrays: 1.0.5
+ call-bind: 1.0.2
+ es-set-tostringtag: 2.0.1
+ es-to-primitive: 1.2.1
+ function.prototype.name: 1.1.5
+ get-intrinsic: 1.2.1
+ get-symbol-description: 1.0.0
+ globalthis: 1.0.3
+ gopd: 1.0.1
+ has: 1.0.3
+ has-property-descriptors: 1.0.0
+ has-proto: 1.0.1
+ has-symbols: 1.0.3
+ internal-slot: 1.0.5
+ is-array-buffer: 3.0.2
+ is-callable: 1.2.7
+ is-negative-zero: 2.0.2
+ is-regex: 1.1.4
+ is-shared-array-buffer: 1.0.2
+ is-string: 1.0.7
+ is-typed-array: 1.1.12
+ is-weakref: 1.0.2
+ object-inspect: 1.12.3
+ object-keys: 1.1.1
+ object.assign: 4.1.4
+ regexp.prototype.flags: 1.5.0
+ safe-array-concat: 1.0.0
+ safe-regex-test: 1.0.0
+ string.prototype.trim: 1.2.7
+ string.prototype.trimend: 1.0.6
+ string.prototype.trimstart: 1.0.6
+ typed-array-buffer: 1.0.0
+ typed-array-byte-length: 1.0.0
+ typed-array-byte-offset: 1.0.0
+ typed-array-length: 1.0.4
+ unbox-primitive: 1.0.2
+ which-typed-array: 1.1.11
+ dev: true
+
+ /es-set-tostringtag@2.0.1:
+ resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ get-intrinsic: 1.2.1
+ has: 1.0.3
+ has-tostringtag: 1.0.0
+ dev: true
+
+ /es-shim-unscopables@1.0.0:
+ resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==}
+ dependencies:
+ has: 1.0.3
+ dev: true
+
+ /es-to-primitive@1.2.1:
+ resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ is-callable: 1.2.7
+ is-date-object: 1.0.5
+ is-symbol: 1.0.4
+ dev: true
+
+ /esbin@0.0.1-beta.2(esbuild@0.18.17):
+ resolution: {integrity: sha512-44c90x+lr9Nu7q4YA0zM0HXLeR+gqn5+9YXEtlFpB/a7NhcN7aVvxczDbwCs3l8KgaHc8lA4XDjnq2FfZIjSPg==}
+ hasBin: true
+ peerDependencies:
+ esbuild: '>=0.12 <1'
+ dependencies:
+ debug: 4.3.4
+ esbuild: 0.18.17
+ pirates: 4.0.6
+ tsconfig-paths: 4.2.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /esbuild-plugin-sass@1.0.1(esbuild@0.18.17):
+ resolution: {integrity: sha512-YFxjzD9Z1vz92QCJcAmCO15WVCUiOobw9ypdVeMsW+xa6S+zqryLUIh8d3fe/UkRHRO5PODZz/3xDAQuEXZwmQ==}
+ peerDependencies:
+ esbuild: '>=0.11.14'
+ dependencies:
+ css-tree: 1.1.3
+ esbuild: 0.18.17
+ fs-extra: 10.0.0
+ sass: 1.47.0
+ tmp: 0.2.1
+ dev: true
+
+ /esbuild@0.18.17:
+ resolution: {integrity: sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==}
+ engines: {node: '>=12'}
+ hasBin: true
+ requiresBuild: true
+ optionalDependencies:
+ '@esbuild/android-arm': 0.18.17
+ '@esbuild/android-arm64': 0.18.17
+ '@esbuild/android-x64': 0.18.17
+ '@esbuild/darwin-arm64': 0.18.17
+ '@esbuild/darwin-x64': 0.18.17
+ '@esbuild/freebsd-arm64': 0.18.17
+ '@esbuild/freebsd-x64': 0.18.17
+ '@esbuild/linux-arm': 0.18.17
+ '@esbuild/linux-arm64': 0.18.17
+ '@esbuild/linux-ia32': 0.18.17
+ '@esbuild/linux-loong64': 0.18.17
+ '@esbuild/linux-mips64el': 0.18.17
+ '@esbuild/linux-ppc64': 0.18.17
+ '@esbuild/linux-riscv64': 0.18.17
+ '@esbuild/linux-s390x': 0.18.17
+ '@esbuild/linux-x64': 0.18.17
+ '@esbuild/netbsd-x64': 0.18.17
+ '@esbuild/openbsd-x64': 0.18.17
+ '@esbuild/sunos-x64': 0.18.17
+ '@esbuild/win32-arm64': 0.18.17
+ '@esbuild/win32-ia32': 0.18.17
+ '@esbuild/win32-x64': 0.18.17
+ dev: true
+
+ /escalade@3.1.1:
+ resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /escape-string-regexp@1.0.5:
+ resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
+ engines: {node: '>=0.8.0'}
+ dev: true
+
+ /escape-string-regexp@4.0.0:
+ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /eslint-config-prettier@8.9.0(eslint@8.46.0):
+ resolution: {integrity: sha512-+sbni7NfVXnOpnRadUA8S28AUlsZt9GjgFvABIRL9Hkn8KqNzOp+7Lw4QWtrwn20KzU3wqu1QoOj2m+7rKRqkA==}
+ hasBin: true
+ peerDependencies:
+ eslint: '>=7.0.0'
+ dependencies:
+ eslint: 8.46.0
+ dev: true
+
+ /eslint-define-config@1.22.0:
+ resolution: {integrity: sha512-pckNJppFwC4AX+AGK63aa4sX5BluPwWwHES3fq/ER0jDR2U2czwlngg38B4EQ2ibvofufc+R5QfmdPKI6+74vQ==}
+ engines: {node: ^16.13.0 || >=18.0.0, npm: '>=7.0.0', pnpm: '>= 8.6.0'}
+ dev: true
+
+ /eslint-import-resolver-node@0.3.7:
+ resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==}
+ dependencies:
+ debug: 3.2.7
+ is-core-module: 2.12.1
+ resolve: 1.22.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@6.2.1)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.28.0)(eslint@8.46.0):
+ resolution: {integrity: sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ peerDependencies:
+ eslint: '*'
+ eslint-plugin-import: '*'
+ dependencies:
+ debug: 4.3.4
+ enhanced-resolve: 5.15.0
+ eslint: 8.46.0
+ eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.2.1)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.46.0)
+ eslint-plugin-import: 2.28.0(@typescript-eslint/parser@6.2.1)(eslint@8.46.0)
+ get-tsconfig: 4.6.2
+ globby: 13.2.2
+ is-core-module: 2.12.1
+ is-glob: 4.0.3
+ synckit: 0.8.5
+ transitivePeerDependencies:
+ - '@typescript-eslint/parser'
+ - eslint-import-resolver-node
+ - eslint-import-resolver-webpack
+ - supports-color
+ dev: true
+
+ /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.2.1)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.46.0):
+ resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ '@typescript-eslint/parser': '*'
+ eslint: '*'
+ eslint-import-resolver-node: '*'
+ eslint-import-resolver-typescript: '*'
+ eslint-import-resolver-webpack: '*'
+ peerDependenciesMeta:
+ '@typescript-eslint/parser':
+ optional: true
+ eslint:
+ optional: true
+ eslint-import-resolver-node:
+ optional: true
+ eslint-import-resolver-typescript:
+ optional: true
+ eslint-import-resolver-webpack:
+ optional: true
+ dependencies:
+ '@typescript-eslint/parser': 6.2.1(eslint@8.46.0)(typescript@5.2.0-beta)
+ debug: 3.2.7
+ eslint: 8.46.0
+ eslint-import-resolver-node: 0.3.7
+ eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@6.2.1)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.28.0)(eslint@8.46.0)
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /eslint-plugin-import@2.28.0(@typescript-eslint/parser@6.2.1)(eslint@8.46.0):
+ resolution: {integrity: sha512-B8s/n+ZluN7sxj9eUf7/pRFERX0r5bnFA2dCaLHy2ZeaQEAz0k+ZZkFWRFHJAqxfxQDx6KLv9LeIki7cFdwW+Q==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ '@typescript-eslint/parser': '*'
+ eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8
+ peerDependenciesMeta:
+ '@typescript-eslint/parser':
+ optional: true
+ dependencies:
+ '@typescript-eslint/parser': 6.2.1(eslint@8.46.0)(typescript@5.2.0-beta)
+ array-includes: 3.1.6
+ array.prototype.findlastindex: 1.2.2
+ array.prototype.flat: 1.3.1
+ array.prototype.flatmap: 1.3.1
+ debug: 3.2.7
+ doctrine: 2.1.0
+ eslint: 8.46.0
+ eslint-import-resolver-node: 0.3.7
+ eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.2.1)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.46.0)
+ has: 1.0.3
+ is-core-module: 2.12.1
+ is-glob: 4.0.3
+ minimatch: 3.1.2
+ object.fromentries: 2.0.6
+ object.groupby: 1.0.0
+ object.values: 1.1.6
+ resolve: 1.22.3
+ semver: 6.3.1
+ tsconfig-paths: 3.14.2
+ transitivePeerDependencies:
+ - eslint-import-resolver-typescript
+ - eslint-import-resolver-webpack
+ - supports-color
+ dev: true
+
+ /eslint-plugin-unicorn@48.0.1(eslint@8.46.0):
+ resolution: {integrity: sha512-FW+4r20myG/DqFcCSzoumaddKBicIPeFnTrifon2mWIzlfyvzwyqZjqVP7m4Cqr/ZYisS2aiLghkUWaPg6vtCw==}
+ engines: {node: '>=16'}
+ peerDependencies:
+ eslint: '>=8.44.0'
+ dependencies:
+ '@babel/helper-validator-identifier': 7.22.5
+ '@eslint-community/eslint-utils': 4.4.0(eslint@8.46.0)
+ ci-info: 3.8.0
+ clean-regexp: 1.0.0
+ eslint: 8.46.0
+ esquery: 1.5.0
+ indent-string: 4.0.0
+ is-builtin-module: 3.2.1
+ jsesc: 3.0.2
+ lodash: 4.17.21
+ pluralize: 8.0.0
+ read-pkg-up: 7.0.1
+ regexp-tree: 0.1.27
+ regjsparser: 0.10.0
+ semver: 7.5.4
+ strip-indent: 3.0.0
+ dev: true
+
+ /eslint-scope@7.2.2:
+ resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 5.3.0
+ dev: true
+
+ /eslint-visitor-keys@3.4.1:
+ resolution: {integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dev: true
+
+ /eslint-visitor-keys@3.4.2:
+ resolution: {integrity: sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dev: true
+
+ /eslint@8.46.0:
+ resolution: {integrity: sha512-cIO74PvbW0qU8e0mIvk5IV3ToWdCq5FYG6gWPHHkx6gNdjlbAYvtfHmlCMXxjcoVaIdwy/IAt3+mDkZkfvb2Dg==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ hasBin: true
+ dependencies:
+ '@eslint-community/eslint-utils': 4.4.0(eslint@8.46.0)
+ '@eslint-community/regexpp': 4.6.2
+ '@eslint/eslintrc': 2.1.1
+ '@eslint/js': 8.46.0
+ '@humanwhocodes/config-array': 0.11.10
+ '@humanwhocodes/module-importer': 1.0.1
+ '@nodelib/fs.walk': 1.2.8
+ ajv: 6.12.6
+ chalk: 4.1.2
+ cross-spawn: 7.0.3
+ debug: 4.3.4
+ doctrine: 3.0.0
+ escape-string-regexp: 4.0.0
+ eslint-scope: 7.2.2
+ eslint-visitor-keys: 3.4.2
+ espree: 9.6.1
+ esquery: 1.5.0
+ esutils: 2.0.3
+ fast-deep-equal: 3.1.3
+ file-entry-cache: 6.0.1
+ find-up: 5.0.0
+ glob-parent: 6.0.2
+ globals: 13.20.0
+ graphemer: 1.4.0
+ ignore: 5.2.4
+ imurmurhash: 0.1.4
+ is-glob: 4.0.3
+ is-path-inside: 3.0.3
+ js-yaml: 4.1.0
+ json-stable-stringify-without-jsonify: 1.0.1
+ levn: 0.4.1
+ lodash.merge: 4.6.2
+ minimatch: 3.1.2
+ natural-compare: 1.4.0
+ optionator: 0.9.3
+ strip-ansi: 6.0.1
+ text-table: 0.2.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /espree@9.6.1:
+ resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ acorn: 8.10.0
+ acorn-jsx: 5.3.2(acorn@8.10.0)
+ eslint-visitor-keys: 3.4.2
+ dev: true
+
+ /esquery@1.5.0:
+ resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==}
+ engines: {node: '>=0.10'}
+ dependencies:
+ estraverse: 5.3.0
+ dev: true
+
+ /esrecurse@4.3.0:
+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+ engines: {node: '>=4.0'}
+ dependencies:
+ estraverse: 5.3.0
+ dev: true
+
+ /estraverse@5.3.0:
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+ engines: {node: '>=4.0'}
+ dev: true
+
+ /esutils@2.0.3:
+ resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /execa@5.1.1:
+ resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
+ engines: {node: '>=10'}
+ dependencies:
+ cross-spawn: 7.0.3
+ get-stream: 6.0.1
+ human-signals: 2.1.0
+ is-stream: 2.0.1
+ merge-stream: 2.0.0
+ npm-run-path: 4.0.1
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+ strip-final-newline: 2.0.0
+ dev: true
+
+ /execa@7.2.0:
+ resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==}
+ engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0}
+ dependencies:
+ cross-spawn: 7.0.3
+ get-stream: 6.0.1
+ human-signals: 4.3.1
+ is-stream: 3.0.0
+ merge-stream: 2.0.0
+ npm-run-path: 5.1.0
+ onetime: 6.0.0
+ signal-exit: 3.0.7
+ strip-final-newline: 3.0.0
+ dev: true
+
+ /fast-deep-equal@3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+ dev: true
+
+ /fast-glob@3.3.1:
+ resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==}
+ engines: {node: '>=8.6.0'}
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ '@nodelib/fs.walk': 1.2.8
+ glob-parent: 5.1.2
+ merge2: 1.4.1
+ micromatch: 4.0.5
+ dev: true
+
+ /fast-json-stable-stringify@2.1.0:
+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+ dev: true
+
+ /fast-levenshtein@2.0.6:
+ resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+ dev: true
+
+ /fast-write-atomic@0.2.1:
+ resolution: {integrity: sha512-WvJe06IfNYlr+6cO3uQkdKdy3Cb1LlCJSF8zRs2eT8yuhdbSlR9nIt+TgQ92RUxiRrQm+/S7RARnMfCs5iuAjw==}
+ dev: true
+
+ /fastq@1.15.0:
+ resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==}
+ dependencies:
+ reusify: 1.0.4
+ dev: true
+
+ /file-entry-cache@6.0.1:
+ resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
+ engines: {node: ^10.12.0 || >=12.0.0}
+ dependencies:
+ flat-cache: 3.0.4
+ dev: true
+
+ /fill-range@7.0.1:
+ resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ to-regex-range: 5.0.1
+ dev: true
+
+ /find-cache-dir@3.3.2:
+ resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==}
+ engines: {node: '>=8'}
+ dependencies:
+ commondir: 1.0.1
+ make-dir: 3.1.0
+ pkg-dir: 4.2.0
+ dev: true
+
+ /find-root@1.1.0:
+ resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==}
+ dev: true
+
+ /find-up@4.1.0:
+ resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
+ engines: {node: '>=8'}
+ dependencies:
+ locate-path: 5.0.0
+ path-exists: 4.0.0
+ dev: true
+
+ /find-up@5.0.0:
+ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+ engines: {node: '>=10'}
+ dependencies:
+ locate-path: 6.0.0
+ path-exists: 4.0.0
+ dev: true
+
+ /flat-cache@3.0.4:
+ resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==}
+ engines: {node: ^10.12.0 || >=12.0.0}
+ dependencies:
+ flatted: 3.2.7
+ rimraf: 3.0.2
+ dev: true
+
+ /flatted@3.2.7:
+ resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==}
+ dev: true
+
+ /for-each@0.3.3:
+ resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
+ dependencies:
+ is-callable: 1.2.7
+ dev: true
+
+ /fp-ts@2.16.0:
+ resolution: {integrity: sha512-bLq+KgbiXdTEoT1zcARrWEpa5z6A/8b7PcDW7Gef3NSisQ+VS7ll2Xbf1E+xsgik0rWub/8u0qP/iTTjj+PhxQ==}
+ dev: true
+
+ /framer-motion@6.5.1(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-o1BGqqposwi7cgDrtg0dNONhkmPsUFDaLcKXigzuTFC5x58mE8iyTazxSudFzmT6MEyJKfjjU8ItoMe3W+3fiw==}
+ peerDependencies:
+ react: '>=16.8 || ^17.0.0 || ^18.0.0'
+ react-dom: '>=16.8 || ^17.0.0 || ^18.0.0'
+ dependencies:
+ '@motionone/dom': 10.12.0
+ framesync: 6.0.1
+ hey-listen: 1.0.8
+ popmotion: 11.0.3
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ style-value-types: 5.0.0
+ tslib: 2.6.1
+ optionalDependencies:
+ '@emotion/is-prop-valid': 0.8.8
+ dev: true
+
+ /framesync@6.0.1:
+ resolution: {integrity: sha512-fUY88kXvGiIItgNC7wcTOl0SNRCVXMKSWW2Yzfmn7EKNc+MpCzcz9DhdHcdjbrtN3c6R4H5dTY2jiCpPdysEjA==}
+ dependencies:
+ tslib: 2.6.1
+ dev: true
+
+ /fs-constants@1.0.0:
+ resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
+ dev: true
+
+ /fs-extra@10.0.0:
+ resolution: {integrity: sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ graceful-fs: 4.2.11
+ jsonfile: 6.1.0
+ universalify: 2.0.0
+ dev: true
+
+ /fs-extra@11.1.1:
+ resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==}
+ engines: {node: '>=14.14'}
+ dependencies:
+ graceful-fs: 4.2.11
+ jsonfile: 6.1.0
+ universalify: 2.0.0
+ dev: true
+
+ /fs-jetpack@5.1.0:
+ resolution: {integrity: sha512-Xn4fDhLydXkuzepZVsr02jakLlmoARPy+YWIclo4kh0GyNGUHnTqeH/w/qIsVn50dFxtp8otPL2t/HcPJBbxUA==}
+ dependencies:
+ minimatch: 5.1.6
+ dev: true
+
+ /fs.realpath@1.0.0:
+ resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+ dev: true
+
+ /fsevents@2.3.2:
+ resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /function-bind@1.1.1:
+ resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
+ dev: true
+
+ /function.prototype.name@1.1.5:
+ resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.2.0
+ es-abstract: 1.22.1
+ functions-have-names: 1.2.3
+ dev: true
+
+ /functions-have-names@1.2.3:
+ resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
+ dev: true
+
+ /fuse.js@6.6.2:
+ resolution: {integrity: sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /generic-names@4.0.0:
+ resolution: {integrity: sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==}
+ dependencies:
+ loader-utils: 3.2.1
+ dev: true
+
+ /gensync@1.0.0-beta.2:
+ resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
+ engines: {node: '>=6.9.0'}
+ dev: true
+
+ /get-intrinsic@1.2.1:
+ resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==}
+ dependencies:
+ function-bind: 1.1.1
+ has: 1.0.3
+ has-proto: 1.0.1
+ has-symbols: 1.0.3
+ dev: true
+
+ /get-nonce@1.0.1:
+ resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /get-stream@6.0.1:
+ resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /get-symbol-description@1.0.0:
+ resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ get-intrinsic: 1.2.1
+ dev: true
+
+ /get-tsconfig@4.6.2:
+ resolution: {integrity: sha512-E5XrT4CbbXcXWy+1jChlZmrmCwd5KGx502kDCXJJ7y898TtWW9FwoG5HfOLVRKmlmDGkWN2HM9Ho+/Y8F0sJDg==}
+ dependencies:
+ resolve-pkg-maps: 1.0.0
+ dev: true
+
+ /glob-parent@5.1.2:
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+ engines: {node: '>= 6'}
+ dependencies:
+ is-glob: 4.0.3
+ dev: true
+
+ /glob-parent@6.0.2:
+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+ engines: {node: '>=10.13.0'}
+ dependencies:
+ is-glob: 4.0.3
+ dev: true
+
+ /glob-to-regexp@0.4.1:
+ resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==}
+ dev: true
+
+ /glob@7.2.3:
+ resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+ dependencies:
+ fs.realpath: 1.0.0
+ inflight: 1.0.6
+ inherits: 2.0.4
+ minimatch: 3.1.2
+ once: 1.4.0
+ path-is-absolute: 1.0.1
+ dev: true
+
+ /glob@8.1.0:
+ resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ fs.realpath: 1.0.0
+ inflight: 1.0.6
+ inherits: 2.0.4
+ minimatch: 5.1.6
+ once: 1.4.0
+ dev: true
+
+ /global-dirs@3.0.1:
+ resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==}
+ engines: {node: '>=10'}
+ dependencies:
+ ini: 2.0.0
+ dev: true
+
+ /globals@11.12.0:
+ resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /globals@13.20.0:
+ resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ type-fest: 0.20.2
+ dev: true
+
+ /globalthis@1.0.3:
+ resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ define-properties: 1.2.0
+ dev: true
+
+ /globby@11.1.0:
+ resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
+ engines: {node: '>=10'}
+ dependencies:
+ array-union: 2.1.0
+ dir-glob: 3.0.1
+ fast-glob: 3.3.1
+ ignore: 5.2.4
+ merge2: 1.4.1
+ slash: 3.0.0
+ dev: true
+
+ /globby@13.2.2:
+ resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ dir-glob: 3.0.1
+ fast-glob: 3.3.1
+ ignore: 5.2.4
+ merge2: 1.4.1
+ slash: 4.0.0
+ dev: true
+
+ /goober@2.1.13(csstype@3.1.2):
+ resolution: {integrity: sha512-jFj3BQeleOoy7t93E9rZ2de+ScC4lQICLwiAQmKMg9F6roKGaLSHoCDYKkWlSafg138jejvq/mTdvmnwDQgqoQ==}
+ peerDependencies:
+ csstype: ^3.0.10
+ dependencies:
+ csstype: 3.1.2
+ dev: true
+
+ /gopd@1.0.1:
+ resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
+ dependencies:
+ get-intrinsic: 1.2.1
+ dev: true
+
+ /graceful-fs@4.2.11:
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+ dev: true
+
+ /graphemer@1.4.0:
+ resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
+ dev: true
+
+ /graphiql@3.0.5(@codemirror/language@6.0.0)(@types/node@20.4.5)(@types/react-dom@18.2.7)(@types/react@18.2.18)(graphql@16.7.1)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-R02CKVXPajOmJcg0TAKuRMU8qvwb7ltGDYqbaQMKbLeYYw/wQUrmTxLwdVuRadgRL4ubNzl3q5vKTkQKR5Ay2Q==}
+ peerDependencies:
+ graphql: ^15.5.0 || ^16.0.0
+ react: ^16.8.0 || ^17 || ^18
+ react-dom: ^16.8.0 || ^17 || ^18
+ dependencies:
+ '@graphiql/react': 0.19.3(@codemirror/language@6.0.0)(@types/node@20.4.5)(@types/react-dom@18.2.7)(@types/react@18.2.18)(graphql@16.7.1)(react-dom@18.2.0)(react@18.2.0)
+ '@graphiql/toolkit': 0.9.1(@types/node@20.4.5)(graphql@16.7.1)
+ graphql: 16.7.1
+ graphql-language-service: 5.1.7(graphql@16.7.1)
+ markdown-it: 12.3.2
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ transitivePeerDependencies:
+ - '@codemirror/language'
+ - '@types/node'
+ - '@types/react'
+ - '@types/react-dom'
+ - graphql-ws
+ dev: true
+
+ /graphql-language-service@5.1.7(graphql@16.7.1):
+ resolution: {integrity: sha512-xkawYMJeoNYGhT+SpSH3c2qf6HpGHQ/duDmrseVHBpVCrXAiGnliXGSCC4jyMGgZQ05GytsZ12p0nUo7s6lSSw==}
+ hasBin: true
+ peerDependencies:
+ graphql: ^15.5.0 || ^16.0.0
+ dependencies:
+ graphql: 16.7.1
+ nullthrows: 1.1.1
+ vscode-languageserver-types: 3.17.3
+ dev: true
+
+ /graphql-query-complexity@0.12.0(graphql@16.7.1):
+ resolution: {integrity: sha512-fWEyuSL6g/+nSiIRgIipfI6UXTI7bAxrpPlCY1c0+V3pAEUo1ybaKmSBgNr1ed2r+agm1plJww8Loig9y6s2dw==}
+ peerDependencies:
+ graphql: ^14.6.0 || ^15.0.0 || ^16.0.0
+ dependencies:
+ graphql: 16.7.1
+ lodash.get: 4.4.2
+ dev: true
+
+ /graphql-scalars@1.22.2(graphql@16.7.1):
+ resolution: {integrity: sha512-my9FB4GtghqXqi/lWSVAOPiTzTnnEzdOXCsAC2bb5V7EFNQjVjwy3cSSbUvgYOtDuDibd+ZsCDhz+4eykYOlhQ==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0
+ dependencies:
+ graphql: 16.7.1
+ tslib: 2.6.1
+ dev: true
+
+ /graphql-subscriptions@2.0.0(graphql@16.7.1):
+ resolution: {integrity: sha512-s6k2b8mmt9gF9pEfkxsaO1lTxaySfKoEJzEfmwguBbQ//Oq23hIXCfR1hm4kdh5hnR20RdwB+s3BCb+0duHSZA==}
+ peerDependencies:
+ graphql: ^15.7.2 || ^16.0.0
+ dependencies:
+ graphql: 16.7.1
+ iterall: 1.3.0
+ dev: true
+
+ /graphql-tag@2.12.6(graphql@16.7.1):
+ resolution: {integrity: sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ graphql: ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0
+ dependencies:
+ graphql: 16.7.1
+ tslib: 2.6.1
+ dev: true
+
+ /graphql-type-json@0.3.2(graphql@16.7.1):
+ resolution: {integrity: sha512-J+vjof74oMlCWXSvt0DOf2APEdZOCdubEvGDUAlqH//VBYcOYsGgRW7Xzorr44LvkjiuvecWc8fChxuZZbChtg==}
+ peerDependencies:
+ graphql: '>=0.8.0'
+ dependencies:
+ graphql: 16.7.1
+ dev: true
+
+ /graphql@16.7.1:
+ resolution: {integrity: sha512-DRYR9tf+UGU0KOsMcKAlXeFfX89UiiIZ0dRU3mR0yJfu6OjZqUcp68NnFLnqQU5RexygFoDy1EW+ccOYcPfmHg==}
+ engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0}
+ dev: true
+
+ /has-bigints@1.0.2:
+ resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
+ dev: true
+
+ /has-flag@3.0.0:
+ resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /has-flag@4.0.0:
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /has-property-descriptors@1.0.0:
+ resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==}
+ dependencies:
+ get-intrinsic: 1.2.1
+ dev: true
+
+ /has-proto@1.0.1:
+ resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /has-symbols@1.0.3:
+ resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /has-tostringtag@1.0.0:
+ resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-symbols: 1.0.3
+ dev: true
+
+ /has@1.0.3:
+ resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
+ engines: {node: '>= 0.4.0'}
+ dependencies:
+ function-bind: 1.1.1
+ dev: true
+
+ /hasha@5.2.2:
+ resolution: {integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ is-stream: 2.0.1
+ type-fest: 0.8.1
+ dev: true
+
+ /header-case@2.0.4:
+ resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==}
+ dependencies:
+ capital-case: 1.0.4
+ tslib: 2.6.1
+ dev: true
+
+ /hey-listen@1.0.8:
+ resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==}
+ dev: true
+
+ /hoist-non-react-statics@3.3.2:
+ resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==}
+ dependencies:
+ react-is: 16.13.1
+ dev: true
+
+ /hooks.macro@1.1.2(react@18.2.0):
+ resolution: {integrity: sha512-cekr0kazwaRhTuoiLteb97OkGhwjpW4sGVHKFG+O24qTeGIZmMbVUATww0HMXLwiedUDCQO0nnxsL3YKyGUH+g==}
+ peerDependencies:
+ react: ^16.8.0
+ dependencies:
+ '@babel/helper-module-imports': 7.22.5
+ babel-plugin-macros: 2.8.0
+ react: 18.2.0
+ dev: true
+
+ /hosted-git-info@2.8.9:
+ resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==}
+ dev: true
+
+ /html-parse-stringify@3.0.1:
+ resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==}
+ dependencies:
+ void-elements: 3.1.0
+ dev: true
+
+ /http-proxy-agent@7.0.0:
+ resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==}
+ engines: {node: '>= 14'}
+ dependencies:
+ agent-base: 7.1.0
+ debug: 4.3.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /https-proxy-agent@7.0.0:
+ resolution: {integrity: sha512-0euwPCRyAPSgGdzD1IVN9nJYHtBhJwb6XPfbpQcYbPCwrBidX6GzxmchnaF4sfF/jPb74Ojx5g4yTg3sixlyPw==}
+ engines: {node: '>= 14'}
+ dependencies:
+ agent-base: 7.1.0
+ debug: 4.3.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /human-signals@2.1.0:
+ resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
+ engines: {node: '>=10.17.0'}
+ dev: true
+
+ /human-signals@4.3.1:
+ resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==}
+ engines: {node: '>=14.18.0'}
+ dev: true
+
+ /i18next-http-backend@2.2.1(patch_hash=oxpqp5jjldpyo63xee6uzmu3na):
+ resolution: {integrity: sha512-ZXIdn/8NJIBJ0X4hzXfc3STYxKrCKh1fYjji9HPyIpEJfvTvy8/ZlTl8RuTizzCPj2ZcWrfaecyOMKs6bQ7u5A==}
+ dependencies:
+ cross-fetch: link:shims/cross-fetch
+ dev: true
+ patched: true
+
+ /i18next-icu@2.3.0(intl-messageformat@10.5.0):
+ resolution: {integrity: sha512-x+j7kd5nDJCfbU53uwsMfXD7ALPu5uv0bqjAMQ5nVvXRoj1L7gkmswKtM3XDWYo4YUHf1jznlhSdPyy0xEwU+Q==}
+ peerDependencies:
+ intl-messageformat: ^10.3.3
+ dependencies:
+ intl-messageformat: 10.5.0
+ dev: true
+
+ /i18next@23.4.1:
+ resolution: {integrity: sha512-07ekE7hbUrbxTYj97VnBzyhKcGURTJC9p4iWTwCVC8t63T+YrgqQmb/n1LBQMivZYwR61pqS+PC0G2rtENycyQ==}
+ dependencies:
+ '@babel/runtime': 7.22.6
+ dev: true
+
+ /iconv-lite@0.6.3:
+ resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
+ engines: {node: '>=0.10.0'}
+ requiresBuild: true
+ dependencies:
+ safer-buffer: 2.1.2
+ dev: true
+ optional: true
+
+ /icss-utils@5.1.0(postcss@8.4.27):
+ resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==}
+ engines: {node: ^10 || ^12 || >= 14}
+ peerDependencies:
+ postcss: ^8.1.0
+ dependencies:
+ postcss: 8.4.27
+ dev: true
+
+ /idb-keyval@6.2.1:
+ resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==}
+ dev: true
+
+ /ieee754@1.2.1:
+ resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+ dev: true
+
+ /ignore-walk@5.0.1:
+ resolution: {integrity: sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==}
+ engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
+ dependencies:
+ minimatch: 5.1.6
+ dev: true
+
+ /ignore@5.2.4:
+ resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==}
+ engines: {node: '>= 4'}
+ dev: true
+
+ /image-size@0.5.5:
+ resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==}
+ engines: {node: '>=0.10.0'}
+ hasBin: true
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /immediate@3.3.0:
+ resolution: {integrity: sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==}
+ dev: true
+
+ /immer@10.0.2:
+ resolution: {integrity: sha512-Rx3CqeqQ19sxUtYV9CU911Vhy8/721wRFnJv3REVGWUmoAcIwzifTsdmJte/MV+0/XpM35LZdQMBGkRIoLPwQA==}
+ dev: true
+
+ /immutable@4.3.1:
+ resolution: {integrity: sha512-lj9cnmB/kVS0QHsJnYKD1uo3o39nrbKxszjnqS9Fr6NB7bZzW45U6WSGBPKXDL/CvDKqDNPA4r3DoDQ8GTxo2A==}
+ dev: true
+
+ /import-fresh@3.3.0:
+ resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
+ engines: {node: '>=6'}
+ dependencies:
+ parent-module: 1.0.1
+ resolve-from: 4.0.0
+ dev: true
+
+ /import-from@4.0.0:
+ resolution: {integrity: sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==}
+ engines: {node: '>=12.2'}
+ dev: true
+
+ /imurmurhash@0.1.4:
+ resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
+ engines: {node: '>=0.8.19'}
+ dev: true
+
+ /indent-string@4.0.0:
+ resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /inflight@1.0.6:
+ resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
+ dependencies:
+ once: 1.4.0
+ wrappy: 1.0.2
+ dev: true
+
+ /inherits@2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+ dev: true
+
+ /ini@2.0.0:
+ resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /internal-slot@1.0.5:
+ resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ get-intrinsic: 1.2.1
+ has: 1.0.3
+ side-channel: 1.0.4
+ dev: true
+
+ /intl-messageformat@10.5.0:
+ resolution: {integrity: sha512-AvojYuOaRb6r2veOKfTVpxH9TrmjSdc5iR9R5RgBwrDZYSmAAFVT+QLbW3C4V7Qsg0OguMp67Q/EoUkxZzXRGw==}
+ dependencies:
+ '@formatjs/ecma402-abstract': 1.17.0
+ '@formatjs/fast-memoize': 2.2.0
+ '@formatjs/icu-messageformat-parser': 2.6.0
+ tslib: 2.6.1
+ dev: true
+
+ /invariant@2.2.4:
+ resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==}
+ dependencies:
+ loose-envify: 1.4.0
+ dev: true
+
+ /is-absolute@1.0.0:
+ resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-relative: 1.0.0
+ is-windows: 1.0.2
+ dev: true
+
+ /is-array-buffer@3.0.2:
+ resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==}
+ dependencies:
+ call-bind: 1.0.2
+ get-intrinsic: 1.2.1
+ is-typed-array: 1.1.12
+ dev: true
+
+ /is-arrayish@0.2.1:
+ resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
+ dev: true
+
+ /is-bigint@1.0.4:
+ resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==}
+ dependencies:
+ has-bigints: 1.0.2
+ dev: true
+
+ /is-binary-path@2.1.0:
+ resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+ engines: {node: '>=8'}
+ dependencies:
+ binary-extensions: 2.2.0
+ dev: true
+
+ /is-boolean-object@1.1.2:
+ resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ has-tostringtag: 1.0.0
+ dev: true
+
+ /is-builtin-module@3.2.1:
+ resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==}
+ engines: {node: '>=6'}
+ dependencies:
+ builtin-modules: 3.3.0
+ dev: true
+
+ /is-callable@1.2.7:
+ resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /is-core-module@2.12.1:
+ resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==}
+ dependencies:
+ has: 1.0.3
+ dev: true
+
+ /is-date-object@1.0.5:
+ resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-tostringtag: 1.0.0
+ dev: true
+
+ /is-docker@2.2.1:
+ resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
+ engines: {node: '>=8'}
+ hasBin: true
+ dev: true
+
+ /is-docker@3.0.0:
+ resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ hasBin: true
+ dev: true
+
+ /is-extglob@2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /is-fullwidth-code-point@3.0.0:
+ resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /is-glob@4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-extglob: 2.1.1
+ dev: true
+
+ /is-inside-container@1.0.0:
+ resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==}
+ engines: {node: '>=14.16'}
+ hasBin: true
+ dependencies:
+ is-docker: 3.0.0
+ dev: true
+
+ /is-lower-case@2.0.2:
+ resolution: {integrity: sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ==}
+ dependencies:
+ tslib: 2.6.1
+ dev: true
+
+ /is-negative-zero@2.0.2:
+ resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /is-number-object@1.0.7:
+ resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-tostringtag: 1.0.0
+ dev: true
+
+ /is-number@7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+ engines: {node: '>=0.12.0'}
+ dev: true
+
+ /is-path-cwd@2.2.0:
+ resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /is-path-inside@3.0.3:
+ resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /is-plain-object@2.0.4:
+ resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ isobject: 3.0.1
+ dev: true
+
+ /is-primitive@3.0.1:
+ resolution: {integrity: sha512-GljRxhWvlCNRfZyORiH77FwdFwGcMO620o37EOYC0ORWdq+WYNVqW0w2Juzew4M+L81l6/QS3t5gkkihyRqv9w==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /is-regex@1.1.4:
+ resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ has-tostringtag: 1.0.0
+ dev: true
+
+ /is-relative@1.0.0:
+ resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-unc-path: 1.0.0
+ dev: true
+
+ /is-shared-array-buffer@1.0.2:
+ resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==}
+ dependencies:
+ call-bind: 1.0.2
+ dev: true
+
+ /is-stream@2.0.1:
+ resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /is-stream@3.0.0:
+ resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dev: true
+
+ /is-string@1.0.7:
+ resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-tostringtag: 1.0.0
+ dev: true
+
+ /is-symbol@1.0.4:
+ resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-symbols: 1.0.3
+ dev: true
+
+ /is-typed-array@1.1.12:
+ resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ which-typed-array: 1.1.11
+ dev: true
+
+ /is-unc-path@1.0.0:
+ resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ unc-path-regex: 0.1.2
+ dev: true
+
+ /is-upper-case@2.0.2:
+ resolution: {integrity: sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ==}
+ dependencies:
+ tslib: 2.6.1
+ dev: true
+
+ /is-weakref@1.0.2:
+ resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==}
+ dependencies:
+ call-bind: 1.0.2
+ dev: true
+
+ /is-what@3.14.1:
+ resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==}
+ dev: true
+
+ /is-what@4.1.15:
+ resolution: {integrity: sha512-uKua1wfy3Yt+YqsD6mTUEa2zSi3G1oPlqTflgaPJ7z63vUGN5pxFpnQfeSLMFnJDEsdvOtkp1rUWkYjB4YfhgA==}
+ engines: {node: '>=12.13'}
+ dev: true
+
+ /is-windows@1.0.2:
+ resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /is-wsl@2.2.0:
+ resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
+ engines: {node: '>=8'}
+ dependencies:
+ is-docker: 2.2.1
+ dev: true
+
+ /isarray@1.0.0:
+ resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
+ dev: true
+
+ /isarray@2.0.5:
+ resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
+ dev: true
+
+ /isexe@2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+ dev: true
+
+ /isobject@3.0.1:
+ resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /iterall@1.3.0:
+ resolution: {integrity: sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==}
+ dev: true
+
+ /js-tokens@4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+ dev: true
+
+ /js-yaml@4.1.0:
+ resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
+ hasBin: true
+ dependencies:
+ argparse: 2.0.1
+ dev: true
+
+ /jsesc@0.5.0:
+ resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==}
+ hasBin: true
+ dev: true
+
+ /jsesc@2.5.2:
+ resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
+ engines: {node: '>=4'}
+ hasBin: true
+ dev: true
+
+ /jsesc@3.0.2:
+ resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==}
+ engines: {node: '>=6'}
+ hasBin: true
+ dev: true
+
+ /json-parse-even-better-errors@2.3.1:
+ resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
+ dev: true
+
+ /json-schema-traverse@0.4.1:
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+ dev: true
+
+ /json-stable-stringify-without-jsonify@1.0.1:
+ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+ dev: true
+
+ /json5@1.0.2:
+ resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
+ hasBin: true
+ dependencies:
+ minimist: 1.2.8
+ dev: true
+
+ /json5@2.2.3:
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+ engines: {node: '>=6'}
+ hasBin: true
+ dev: true
+
+ /jsonfile@6.1.0:
+ resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
+ dependencies:
+ universalify: 2.0.0
+ optionalDependencies:
+ graceful-fs: 4.2.11
+ dev: true
+
+ /kleur@3.0.3:
+ resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /kleur@4.1.5:
+ resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /language-subtag-registry@0.3.22:
+ resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==}
+ dev: true
+
+ /language-tags@1.0.8:
+ resolution: {integrity: sha512-aWAZwgPLS8hJ20lNPm9HNVs4inexz6S2sQa3wx/+ycuutMNE5/IfYxiWYBbi+9UWCQVaXYCOPUl6gFrPR7+jGg==}
+ dependencies:
+ language-subtag-registry: 0.3.22
+ dev: true
+
+ /lazystream@1.0.1:
+ resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==}
+ engines: {node: '>= 0.6.3'}
+ dependencies:
+ readable-stream: 2.3.8
+ dev: true
+
+ /less@4.1.3:
+ resolution: {integrity: sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==}
+ engines: {node: '>=6'}
+ hasBin: true
+ dependencies:
+ copy-anything: 2.0.6
+ parse-node-version: 1.0.1
+ tslib: 2.6.1
+ optionalDependencies:
+ errno: 0.1.8
+ graceful-fs: 4.2.11
+ image-size: 0.5.5
+ make-dir: 2.1.0
+ mime: 1.6.0
+ needle: 3.2.0
+ source-map: 0.6.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /levn@0.4.1:
+ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+ dev: true
+
+ /libphonenumber-js@1.10.38:
+ resolution: {integrity: sha512-4NjVXVUmpZ9Zsqq6FXa2+MKI+KAI3tOqA0pxXgXGluhpj4ge5didmbWJpMBqGB3AVGv1SnEtKdGTbxjSEG1kCQ==}
+ dev: true
+
+ /lilconfig@2.1.0:
+ resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /lines-and-columns@1.2.4:
+ resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+ dev: true
+
+ /linkify-it@3.0.3:
+ resolution: {integrity: sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==}
+ dependencies:
+ uc.micro: 1.0.6
+ dev: true
+
+ /loader-utils@3.2.1:
+ resolution: {integrity: sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==}
+ engines: {node: '>= 12.13.0'}
+ dev: true
+
+ /locate-path@5.0.0:
+ resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
+ engines: {node: '>=8'}
+ dependencies:
+ p-locate: 4.1.0
+ dev: true
+
+ /locate-path@6.0.0:
+ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+ engines: {node: '>=10'}
+ dependencies:
+ p-locate: 5.0.0
+ dev: true
+
+ /lodash-es@4.17.21:
+ resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
+ dev: true
+
+ /lodash.camelcase@4.3.0:
+ resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==}
+ dev: true
+
+ /lodash.defaults@4.2.0:
+ resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==}
+ dev: true
+
+ /lodash.difference@4.5.0:
+ resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==}
+ dev: true
+
+ /lodash.flatten@4.4.0:
+ resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==}
+ dev: true
+
+ /lodash.get@4.4.2:
+ resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==}
+ dev: true
+
+ /lodash.isplainobject@4.0.6:
+ resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==}
+ dev: true
+
+ /lodash.merge@4.6.2:
+ resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+ dev: true
+
+ /lodash.noop@3.0.1:
+ resolution: {integrity: sha512-TmYdmu/pebrdTIBDK/FDx9Bmfzs9x0sZG6QIJuMDTqEPfeciLcN13ij+cOd0i9vwJfBtbG9UQ+C7MkXgYxrIJg==}
+ dev: true
+
+ /lodash.union@4.6.0:
+ resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==}
+ dev: true
+
+ /lodash@4.17.21:
+ resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+ dev: true
+
+ /loose-envify@1.4.0:
+ resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
+ hasBin: true
+ dependencies:
+ js-tokens: 4.0.0
+ dev: true
+
+ /lower-case-first@2.0.2:
+ resolution: {integrity: sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg==}
+ dependencies:
+ tslib: 2.6.1
+ dev: true
+
+ /lower-case@2.0.2:
+ resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==}
+ dependencies:
+ tslib: 2.6.1
+ dev: true
+
+ /lru-cache@10.0.0:
+ resolution: {integrity: sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==}
+ engines: {node: 14 || >=16.14}
+ dev: true
+
+ /lru-cache@5.1.1:
+ resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+ dependencies:
+ yallist: 3.1.1
+ dev: true
+
+ /lru-cache@6.0.0:
+ resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
+ engines: {node: '>=10'}
+ dependencies:
+ yallist: 4.0.0
+ dev: true
+
+ /make-dir@2.1.0:
+ resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==}
+ engines: {node: '>=6'}
+ requiresBuild: true
+ dependencies:
+ pify: 4.0.1
+ semver: 5.7.2
+ dev: true
+ optional: true
+
+ /make-dir@3.1.0:
+ resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
+ engines: {node: '>=8'}
+ dependencies:
+ semver: 6.3.1
+ dev: true
+
+ /make-error@1.3.6:
+ resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
+ dev: true
+
+ /map-cache@0.2.2:
+ resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /markdown-it@12.3.2:
+ resolution: {integrity: sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==}
+ hasBin: true
+ dependencies:
+ argparse: 2.0.1
+ entities: 2.1.0
+ linkify-it: 3.0.3
+ mdurl: 1.0.1
+ uc.micro: 1.0.6
+ dev: true
+
+ /mdn-data@2.0.14:
+ resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==}
+ dev: true
+
+ /mdurl@1.0.1:
+ resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==}
+ dev: true
+
+ /memoize-one@5.2.1:
+ resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==}
+ dev: true
+
+ /memoize-one@6.0.0:
+ resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==}
+ dev: true
+
+ /merge-stream@2.0.0:
+ resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+ dev: true
+
+ /merge2@1.4.1:
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+ engines: {node: '>= 8'}
+ dev: true
+
+ /meros@1.3.0(@types/node@20.4.5):
+ resolution: {integrity: sha512-2BNGOimxEz5hmjUG2FwoxCt5HN7BXdaWyFqEwxPTrJzVdABtrL4TiHTcsWSFAxPQ/tOnEaQEJh3qWq71QRMY+w==}
+ engines: {node: '>=13'}
+ peerDependencies:
+ '@types/node': '>=13'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ dependencies:
+ '@types/node': 20.4.5
+ dev: true
+
+ /micromatch@4.0.5:
+ resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
+ engines: {node: '>=8.6'}
+ dependencies:
+ braces: 3.0.2
+ picomatch: 2.3.1
+ dev: true
+
+ /mime@1.6.0:
+ resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
+ engines: {node: '>=4'}
+ hasBin: true
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /mimic-fn@2.1.0:
+ resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /mimic-fn@4.0.0:
+ resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /min-indent@1.0.1:
+ resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /minimatch@3.1.2:
+ resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+ dependencies:
+ brace-expansion: 1.1.11
+ dev: true
+
+ /minimatch@5.1.6:
+ resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==}
+ engines: {node: '>=10'}
+ dependencies:
+ brace-expansion: 2.0.1
+ dev: true
+
+ /minimatch@9.0.3:
+ resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==}
+ engines: {node: '>=16 || 14 >=14.17'}
+ dependencies:
+ brace-expansion: 2.0.1
+ dev: true
+
+ /minimist@1.2.8:
+ resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+ dev: true
+
+ /monaco-editor@0.40.0(patch_hash=ku3o7hkzj5ntzax27c7xlqnuoa):
+ resolution: {integrity: sha512-1wymccLEuFSMBvCk/jT1YDW/GuxMLYwnFwF9CDyYCxoTw2Pt379J3FUhwy9c43j51JdcxVPjwk0jm0EVDsBS2g==}
+ dev: true
+ patched: true
+
+ /ms@2.1.2:
+ resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
+ dev: true
+
+ /ms@2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+ dev: true
+
+ /nanoid@3.3.6:
+ resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+ dev: true
+
+ /nanoid@4.0.2:
+ resolution: {integrity: sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==}
+ engines: {node: ^14 || ^16 || >=18}
+ hasBin: true
+ dev: true
+
+ /natural-compare-lite@1.4.0:
+ resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==}
+ dev: true
+
+ /natural-compare@1.4.0:
+ resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+ dev: true
+
+ /needle@3.2.0:
+ resolution: {integrity: sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==}
+ engines: {node: '>= 4.4.x'}
+ hasBin: true
+ requiresBuild: true
+ dependencies:
+ debug: 3.2.7
+ iconv-lite: 0.6.3
+ sax: 1.2.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+ optional: true
+
+ /new-github-issue-url@0.2.1:
+ resolution: {integrity: sha512-md4cGoxuT4T4d/HDOXbrUHkTKrp/vp+m3aOA7XXVYwNsUNMK49g3SQicTSeV5GIz/5QVGAeYRAOlyp9OvlgsYA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /no-case@3.0.4:
+ resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==}
+ dependencies:
+ lower-case: 2.0.2
+ tslib: 2.6.1
+ dev: true
+
+ /node-fetch@2.6.11:
+ resolution: {integrity: sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==}
+ engines: {node: 4.x || >=6.0.0}
+ peerDependencies:
+ encoding: ^0.1.0
+ peerDependenciesMeta:
+ encoding:
+ optional: true
+ dependencies:
+ whatwg-url: 5.0.0
+ dev: true
+
+ /node-fetch@2.6.12:
+ resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==}
+ engines: {node: 4.x || >=6.0.0}
+ peerDependencies:
+ encoding: ^0.1.0
+ peerDependenciesMeta:
+ encoding:
+ optional: true
+ dependencies:
+ whatwg-url: 5.0.0
+ dev: true
+
+ /node-releases@2.0.13:
+ resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==}
+ dev: true
+
+ /normalize-package-data@2.5.0:
+ resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==}
+ dependencies:
+ hosted-git-info: 2.8.9
+ resolve: 1.22.2
+ semver: 5.7.2
+ validate-npm-package-license: 3.0.4
+ dev: true
+
+ /normalize-path@2.1.1:
+ resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ remove-trailing-separator: 1.1.0
+ dev: true
+
+ /normalize-path@3.0.0:
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /normalize.css@8.0.1:
+ resolution: {integrity: sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==}
+ dev: true
+
+ /npm-bundled@2.0.1:
+ resolution: {integrity: sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==}
+ engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
+ dependencies:
+ npm-normalize-package-bin: 2.0.0
+ dev: true
+
+ /npm-normalize-package-bin@2.0.0:
+ resolution: {integrity: sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==}
+ engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
+ dev: true
+
+ /npm-packlist@5.1.3:
+ resolution: {integrity: sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==}
+ engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
+ hasBin: true
+ dependencies:
+ glob: 8.1.0
+ ignore-walk: 5.0.1
+ npm-bundled: 2.0.1
+ npm-normalize-package-bin: 2.0.0
+ dev: true
+
+ /npm-run-path@4.0.1:
+ resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
+ engines: {node: '>=8'}
+ dependencies:
+ path-key: 3.1.1
+ dev: true
+
+ /npm-run-path@5.1.0:
+ resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ path-key: 4.0.0
+ dev: true
+
+ /nullthrows@1.1.1:
+ resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==}
+ dev: true
+
+ /object-assign@4.1.1:
+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /object-inspect@1.12.3:
+ resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==}
+ dev: true
+
+ /object-keys@1.1.1:
+ resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /object.assign@4.1.4:
+ resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.2.0
+ has-symbols: 1.0.3
+ object-keys: 1.1.1
+ dev: true
+
+ /object.fromentries@2.0.6:
+ resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.2.0
+ es-abstract: 1.22.1
+ dev: true
+
+ /object.groupby@1.0.0:
+ resolution: {integrity: sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.2.0
+ es-abstract: 1.22.1
+ get-intrinsic: 1.2.1
+ dev: true
+
+ /object.values@1.1.6:
+ resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.2.0
+ es-abstract: 1.22.1
+ dev: true
+
+ /once@1.4.0:
+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+ dependencies:
+ wrappy: 1.0.2
+ dev: true
+
+ /onetime@5.1.2:
+ resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
+ engines: {node: '>=6'}
+ dependencies:
+ mimic-fn: 2.1.0
+ dev: true
+
+ /onetime@6.0.0:
+ resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ mimic-fn: 4.0.0
+ dev: true
+
+ /open@7.4.2:
+ resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==}
+ engines: {node: '>=8'}
+ dependencies:
+ is-docker: 2.2.1
+ is-wsl: 2.2.0
+ dev: true
+
+ /open@9.1.0:
+ resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==}
+ engines: {node: '>=14.16'}
+ dependencies:
+ default-browser: 4.0.0
+ define-lazy-prop: 3.0.0
+ is-inside-container: 1.0.0
+ is-wsl: 2.2.0
+ dev: true
+
+ /optimism@0.16.2:
+ resolution: {integrity: sha512-zWNbgWj+3vLEjZNIh/okkY2EUfX+vB9TJopzIZwT1xxaMqC5hRLLraePod4c5n4He08xuXNH+zhKFFCu390wiQ==}
+ dependencies:
+ '@wry/context': 0.7.3
+ '@wry/trie': 0.3.2
+ dev: true
+
+ /optionator@0.9.3:
+ resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ '@aashutoshrathi/word-wrap': 1.2.6
+ deep-is: 0.1.4
+ fast-levenshtein: 2.0.6
+ levn: 0.4.1
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+ dev: true
+
+ /p-filter@2.1.0:
+ resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==}
+ engines: {node: '>=8'}
+ dependencies:
+ p-map: 2.1.0
+ dev: true
+
+ /p-limit@2.3.0:
+ resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
+ engines: {node: '>=6'}
+ dependencies:
+ p-try: 2.2.0
+ dev: true
+
+ /p-limit@3.1.0:
+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ yocto-queue: 0.1.0
+ dev: true
+
+ /p-locate@4.1.0:
+ resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
+ engines: {node: '>=8'}
+ dependencies:
+ p-limit: 2.3.0
+ dev: true
+
+ /p-locate@5.0.0:
+ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+ engines: {node: '>=10'}
+ dependencies:
+ p-limit: 3.1.0
+ dev: true
+
+ /p-map@2.1.0:
+ resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /p-map@4.0.0:
+ resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ aggregate-error: 3.1.0
+ dev: true
+
+ /p-retry@4.6.2:
+ resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ '@types/retry': 0.12.0
+ retry: 0.13.1
+ dev: true
+
+ /p-try@2.2.0:
+ resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /param-case@3.0.4:
+ resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==}
+ dependencies:
+ dot-case: 3.0.4
+ tslib: 2.6.1
+ dev: true
+
+ /parent-module@1.0.1:
+ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+ engines: {node: '>=6'}
+ dependencies:
+ callsites: 3.1.0
+ dev: true
+
+ /parse-filepath@1.0.2:
+ resolution: {integrity: sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==}
+ engines: {node: '>=0.8'}
+ dependencies:
+ is-absolute: 1.0.0
+ map-cache: 0.2.2
+ path-root: 0.1.1
+ dev: true
+
+ /parse-json@5.2.0:
+ resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
+ engines: {node: '>=8'}
+ dependencies:
+ '@babel/code-frame': 7.22.5
+ error-ex: 1.3.2
+ json-parse-even-better-errors: 2.3.1
+ lines-and-columns: 1.2.4
+ dev: true
+
+ /parse-node-version@1.0.1:
+ resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==}
+ engines: {node: '>= 0.10'}
+ dev: true
+
+ /pascal-case@3.1.2:
+ resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==}
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.6.1
+ dev: true
+
+ /path-case@3.0.4:
+ resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==}
+ dependencies:
+ dot-case: 3.0.4
+ tslib: 2.6.1
+ dev: true
+
+ /path-exists@4.0.0:
+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /path-is-absolute@1.0.1:
+ resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /path-key@3.1.1:
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /path-key@4.0.0:
+ resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /path-parse@1.0.7:
+ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+ dev: true
+
+ /path-root-regex@0.1.2:
+ resolution: {integrity: sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /path-root@0.1.1:
+ resolution: {integrity: sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ path-root-regex: 0.1.2
+ dev: true
+
+ /path-type@4.0.0:
+ resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /picocolors@1.0.0:
+ resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
+ dev: true
+
+ /picomatch@2.3.1:
+ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+ engines: {node: '>=8.6'}
+ dev: true
+
+ /pify@4.0.1:
+ resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
+ engines: {node: '>=6'}
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /pirates@4.0.6:
+ resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==}
+ engines: {node: '>= 6'}
+ dev: true
+
+ /pkg-dir@4.2.0:
+ resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ find-up: 4.1.0
+ dev: true
+
+ /pluralize@8.0.0:
+ resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /popmotion@11.0.3:
+ resolution: {integrity: sha512-Y55FLdj3UxkR7Vl3s7Qr4e9m0onSnP8W7d/xQLsoJM40vs6UKHFdygs6SWryasTZYqugMjm3BepCF4CWXDiHgA==}
+ dependencies:
+ framesync: 6.0.1
+ hey-listen: 1.0.8
+ style-value-types: 5.0.0
+ tslib: 2.6.1
+ dev: true
+
+ /postcss-load-config@3.1.4(postcss@8.4.27)(ts-node@10.9.1):
+ resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==}
+ engines: {node: '>= 10'}
+ peerDependencies:
+ postcss: '>=8.0.9'
+ ts-node: '>=9.0.0'
+ peerDependenciesMeta:
+ postcss:
+ optional: true
+ ts-node:
+ optional: true
+ dependencies:
+ lilconfig: 2.1.0
+ postcss: 8.4.27
+ ts-node: 10.9.1(@types/node@20.4.5)(typescript@5.2.0-beta)
+ yaml: 1.10.2
+ dev: true
+
+ /postcss-modules-extract-imports@3.0.0(postcss@8.4.27):
+ resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==}
+ engines: {node: ^10 || ^12 || >= 14}
+ peerDependencies:
+ postcss: ^8.1.0
+ dependencies:
+ postcss: 8.4.27
+ dev: true
+
+ /postcss-modules-local-by-default@4.0.3(postcss@8.4.27):
+ resolution: {integrity: sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==}
+ engines: {node: ^10 || ^12 || >= 14}
+ peerDependencies:
+ postcss: ^8.1.0
+ dependencies:
+ icss-utils: 5.1.0(postcss@8.4.27)
+ postcss: 8.4.27
+ postcss-selector-parser: 6.0.13
+ postcss-value-parser: 4.2.0
+ dev: true
+
+ /postcss-modules-scope@3.0.0(postcss@8.4.27):
+ resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==}
+ engines: {node: ^10 || ^12 || >= 14}
+ peerDependencies:
+ postcss: ^8.1.0
+ dependencies:
+ postcss: 8.4.27
+ postcss-selector-parser: 6.0.13
+ dev: true
+
+ /postcss-modules-values@4.0.0(postcss@8.4.27):
+ resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==}
+ engines: {node: ^10 || ^12 || >= 14}
+ peerDependencies:
+ postcss: ^8.1.0
+ dependencies:
+ icss-utils: 5.1.0(postcss@8.4.27)
+ postcss: 8.4.27
+ dev: true
+
+ /postcss-modules@6.0.0(postcss@8.4.27):
+ resolution: {integrity: sha512-7DGfnlyi/ju82BRzTIjWS5C4Tafmzl3R79YP/PASiocj+aa6yYphHhhKUOEoXQToId5rgyFgJ88+ccOUydjBXQ==}
+ peerDependencies:
+ postcss: ^8.0.0
+ dependencies:
+ generic-names: 4.0.0
+ icss-utils: 5.1.0(postcss@8.4.27)
+ lodash.camelcase: 4.3.0
+ postcss: 8.4.27
+ postcss-modules-extract-imports: 3.0.0(postcss@8.4.27)
+ postcss-modules-local-by-default: 4.0.3(postcss@8.4.27)
+ postcss-modules-scope: 3.0.0(postcss@8.4.27)
+ postcss-modules-values: 4.0.0(postcss@8.4.27)
+ string-hash: 1.1.3
+ dev: true
+
+ /postcss-selector-parser@6.0.13:
+ resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==}
+ engines: {node: '>=4'}
+ dependencies:
+ cssesc: 3.0.0
+ util-deprecate: 1.0.2
+ dev: true
+
+ /postcss-value-parser@4.2.0:
+ resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
+ dev: true
+
+ /postcss@8.4.27:
+ resolution: {integrity: sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==}
+ engines: {node: ^10 || ^12 || >=14}
+ dependencies:
+ nanoid: 3.3.6
+ picocolors: 1.0.0
+ source-map-js: 1.0.2
+ dev: true
+
+ /pouchdb-browser@8.0.1:
+ resolution: {integrity: sha512-wXObS1Layd/gBRKwa6EBS99tFY9G3VPaMRu8ffWCohkpi9PZCm3z1xeB4P4S9Qecf0u5so+rxvbVVyTtgdhvaQ==}
+ dependencies:
+ immediate: 3.3.0
+ spark-md5: 3.0.2
+ uuid: 8.3.2
+ vuvuzela: 1.0.3
+ dev: true
+
+ /prelude-ls@1.2.1:
+ resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
+ engines: {node: '>= 0.8.0'}
+ dev: true
+
+ /prettier@3.0.0:
+ resolution: {integrity: sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==}
+ engines: {node: '>=14'}
+ hasBin: true
+ dev: true
+
+ /process-nextick-args@2.0.1:
+ resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
+ dev: true
+
+ /progress@2.0.3:
+ resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==}
+ engines: {node: '>=0.4.0'}
+ dev: true
+
+ /prompts@2.4.2:
+ resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==}
+ engines: {node: '>= 6'}
+ dependencies:
+ kleur: 3.0.3
+ sisteransi: 1.0.5
+ dev: true
+
+ /prop-types@15.8.1:
+ resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
+ dependencies:
+ loose-envify: 1.4.0
+ object-assign: 4.1.1
+ react-is: 16.13.1
+ dev: true
+
+ /prr@1.0.1:
+ resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==}
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /punycode@2.3.0:
+ resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /queue-microtask@1.2.3:
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+ dev: true
+
+ /react-dom@18.2.0(react@18.2.0):
+ resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==}
+ peerDependencies:
+ react: ^18.2.0
+ dependencies:
+ loose-envify: 1.4.0
+ react: 18.2.0
+ scheduler: 0.23.0
+ dev: true
+
+ /react-fast-compare@3.2.2:
+ resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==}
+ dev: true
+
+ /react-helmet@6.1.0(react@18.2.0):
+ resolution: {integrity: sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw==}
+ peerDependencies:
+ react: '>=16.3.0'
+ dependencies:
+ object-assign: 4.1.1
+ prop-types: 15.8.1
+ react: 18.2.0
+ react-fast-compare: 3.2.2
+ react-side-effect: 2.1.2(react@18.2.0)
+ dev: true
+
+ /react-hot-toast@2.4.1(csstype@3.1.2)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-j8z+cQbWIM5LY37pR6uZR6D4LfseplqnuAO4co4u8917hBUvXlEqyP1ZzqVLcqoyUesZZv/ImreoCeHVDpE5pQ==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ react: '>=16'
+ react-dom: '>=16'
+ dependencies:
+ goober: 2.1.13(csstype@3.1.2)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ transitivePeerDependencies:
+ - csstype
+ dev: true
+
+ /react-i18next@13.0.3(i18next@23.4.1)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-/t4kt4Y2o+21hbvx+o9zpVnmoiud7KLDncyZFGN0U6TGAWYaXdTsp/ytAHFcKKSAODg4noIMaOO3X7bMgCqLHw==}
+ peerDependencies:
+ i18next: '>= 23.2.3'
+ react: '>= 16.8.0'
+ react-dom: '*'
+ react-native: '*'
+ peerDependenciesMeta:
+ react-dom:
+ optional: true
+ react-native:
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.22.6
+ html-parse-stringify: 3.0.1
+ i18next: 23.4.1
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: true
+
+ /react-is@16.13.1:
+ resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
+ dev: true
+
+ /react-remove-scroll-bar@2.3.4(@types/react@18.2.18)(react@18.2.0):
+ resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@types/react': 18.2.18
+ react: 18.2.0
+ react-style-singleton: 2.2.1(@types/react@18.2.18)(react@18.2.0)
+ tslib: 2.6.1
+ dev: true
+
+ /react-remove-scroll@2.5.5(@types/react@18.2.18)(react@18.2.0):
+ resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@types/react': 18.2.18
+ react: 18.2.0
+ react-remove-scroll-bar: 2.3.4(@types/react@18.2.18)(react@18.2.0)
+ react-style-singleton: 2.2.1(@types/react@18.2.18)(react@18.2.0)
+ tslib: 2.6.1
+ use-callback-ref: 1.3.0(@types/react@18.2.18)(react@18.2.0)
+ use-sidecar: 1.1.2(@types/react@18.2.18)(react@18.2.0)
+ dev: true
+
+ /react-side-effect@2.1.2(react@18.2.0):
+ resolution: {integrity: sha512-PVjOcvVOyIILrYoyGEpDN3vmYNLdy1CajSFNt4TDsVQC5KpTijDvWVoR+/7Rz2xT978D8/ZtFceXxzsPwZEDvw==}
+ peerDependencies:
+ react: ^16.3.0 || ^17.0.0 || ^18.0.0
+ dependencies:
+ react: 18.2.0
+ dev: true
+
+ /react-style-singleton@2.2.1(@types/react@18.2.18)(react@18.2.0):
+ resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@types/react': 18.2.18
+ get-nonce: 1.0.1
+ invariant: 2.2.4
+ react: 18.2.0
+ tslib: 2.6.1
+ dev: true
+
+ /react-transition-state@2.1.1(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-kQx5g1FVu9knoz1T1WkapjUgFz08qQ/g1OmuWGi3/AoEFfS0kStxrPlZx81urjCXdz2d+1DqLpU6TyLW/Ro04Q==}
+ peerDependencies:
+ react: '>=16.8.0'
+ react-dom: '>=16.8.0'
+ dependencies:
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: true
+
+ /react-window@1.8.9(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-+Eqx/fj1Aa5WnhRfj9dJg4VYATGwIUP2ItwItiJ6zboKWA6EX3lYDAXfGF2hyNqplEprhbtjbipiADEcwQ823Q==}
+ engines: {node: '>8.0.0'}
+ peerDependencies:
+ react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0
+ react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.22.6
+ memoize-one: 5.2.1
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: true
+
+ /react@18.2.0:
+ resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ loose-envify: 1.4.0
+ dev: true
+
+ /read-pkg-up@7.0.1:
+ resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==}
+ engines: {node: '>=8'}
+ dependencies:
+ find-up: 4.1.0
+ read-pkg: 5.2.0
+ type-fest: 0.8.1
+ dev: true
+
+ /read-pkg@5.2.0:
+ resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==}
+ engines: {node: '>=8'}
+ dependencies:
+ '@types/normalize-package-data': 2.4.1
+ normalize-package-data: 2.5.0
+ parse-json: 5.2.0
+ type-fest: 0.6.0
+ dev: true
+
+ /readable-stream@2.3.8:
+ resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
+ dependencies:
+ core-util-is: 1.0.3
+ inherits: 2.0.4
+ isarray: 1.0.0
+ process-nextick-args: 2.0.1
+ safe-buffer: 5.1.2
+ string_decoder: 1.1.1
+ util-deprecate: 1.0.2
+ dev: true
+
+ /readable-stream@3.6.2:
+ resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
+ engines: {node: '>= 6'}
+ dependencies:
+ inherits: 2.0.4
+ string_decoder: 1.3.0
+ util-deprecate: 1.0.2
+ dev: true
+
+ /readdir-glob@1.1.3:
+ resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==}
+ dependencies:
+ minimatch: 5.1.6
+ dev: true
+
+ /readdirp@3.6.0:
+ resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+ engines: {node: '>=8.10.0'}
+ dependencies:
+ picomatch: 2.3.1
+ dev: true
+
+ /reflect-metadata@0.1.13:
+ resolution: {integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==}
+ dev: true
+
+ /regenerator-runtime@0.13.11:
+ resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==}
+ dev: true
+
+ /regexp-tree@0.1.27:
+ resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==}
+ hasBin: true
+ dev: true
+
+ /regexp.prototype.flags@1.5.0:
+ resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.2.0
+ functions-have-names: 1.2.3
+ dev: true
+
+ /regjsparser@0.10.0:
+ resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==}
+ hasBin: true
+ dependencies:
+ jsesc: 0.5.0
+ dev: true
+
+ /remove-trailing-separator@1.1.0:
+ resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==}
+ dev: true
+
+ /replace-string@3.1.0:
+ resolution: {integrity: sha512-yPpxc4ZR2makceA9hy/jHNqc7QVkd4Je/N0WRHm6bs3PtivPuPynxE5ejU/mp5EhnCv8+uZL7vhz8rkluSlx+Q==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /reserved-words@0.1.2:
+ resolution: {integrity: sha512-0S5SrIUJ9LfpbVl4Yzij6VipUdafHrOTzvmfazSw/jeZrZtQK303OPZW+obtkaw7jQlTQppy0UvZWm9872PbRw==}
+ dev: true
+
+ /resolve-from@4.0.0:
+ resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /resolve-from@5.0.0:
+ resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /resolve-pkg-maps@1.0.0:
+ resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
+ dev: true
+
+ /resolve@1.22.2:
+ resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==}
+ hasBin: true
+ dependencies:
+ is-core-module: 2.12.1
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+ dev: true
+
+ /resolve@1.22.3:
+ resolution: {integrity: sha512-P8ur/gp/AmbEzjr729bZnLjXK5Z+4P0zhIJgBgzqRih7hL7BOukHGtSTA3ACMY467GRFz3duQsi0bDZdR7DKdw==}
+ hasBin: true
+ dependencies:
+ is-core-module: 2.12.1
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+ dev: true
+
+ /resolve@2.0.0-next.4:
+ resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==}
+ hasBin: true
+ dependencies:
+ is-core-module: 2.12.1
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+ dev: true
+
+ /response-iterator@0.2.6:
+ resolution: {integrity: sha512-pVzEEzrsg23Sh053rmDUvLSkGXluZio0qu8VT6ukrYuvtjVfCbDZH9d6PGXb8HZfzdNZt8feXv/jvUzlhRgLnw==}
+ engines: {node: '>=0.8'}
+ dev: true
+
+ /retry@0.13.1:
+ resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==}
+ engines: {node: '>= 4'}
+ dev: true
+
+ /reusify@1.0.4:
+ resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+ dev: true
+
+ /rimraf@3.0.2:
+ resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
+ hasBin: true
+ dependencies:
+ glob: 7.2.3
+ dev: true
+
+ /run-applescript@5.0.0:
+ resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==}
+ engines: {node: '>=12'}
+ dependencies:
+ execa: 5.1.1
+ dev: true
+
+ /run-parallel@1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+ dependencies:
+ queue-microtask: 1.2.3
+ dev: true
+
+ /rxjs@7.8.1:
+ resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==}
+ requiresBuild: true
+ dependencies:
+ tslib: 2.6.1
+ dev: true
+ optional: true
+
+ /safe-array-concat@1.0.0:
+ resolution: {integrity: sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==}
+ engines: {node: '>=0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ get-intrinsic: 1.2.1
+ has-symbols: 1.0.3
+ isarray: 2.0.5
+ dev: true
+
+ /safe-buffer@5.1.2:
+ resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
+ dev: true
+
+ /safe-buffer@5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+ dev: true
+
+ /safe-regex-test@1.0.0:
+ resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==}
+ dependencies:
+ call-bind: 1.0.2
+ get-intrinsic: 1.2.1
+ is-regex: 1.1.4
+ dev: true
+
+ /safer-buffer@2.1.2:
+ resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /sass@1.47.0:
+ resolution: {integrity: sha512-GtXwvwgD7/6MLUZPnlA5/8cdRgC9SzT5kAnnJMRmEZQFRE3J56Foswig4NyyyQGsnmNvg6EUM/FP0Pe9Y2zywQ==}
+ engines: {node: '>=8.9.0'}
+ hasBin: true
+ dependencies:
+ chokidar: 3.5.3
+ immutable: 4.3.1
+ source-map-js: 1.0.2
+ dev: true
+
+ /sass@1.64.2:
+ resolution: {integrity: sha512-TnDlfc+CRnUAgLO9D8cQLFu/GIjJIzJCGkE7o4ekIGQOH7T3GetiRR/PsTWJUHhkzcSPrARkPI+gNWn5alCzDg==}
+ engines: {node: '>=14.0.0'}
+ hasBin: true
+ dependencies:
+ chokidar: 3.5.3
+ immutable: 4.3.1
+ source-map-js: 1.0.2
+ dev: true
+
+ /sax@1.2.4:
+ resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==}
+ dev: true
+
+ /scheduler@0.23.0:
+ resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==}
+ dependencies:
+ loose-envify: 1.4.0
+ dev: true
+
+ /semver@5.7.2:
+ resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==}
+ hasBin: true
+ dev: true
+
+ /semver@6.3.1:
+ resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+ hasBin: true
+ dev: true
+
+ /semver@7.5.4:
+ resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==}
+ engines: {node: '>=10'}
+ hasBin: true
+ dependencies:
+ lru-cache: 6.0.0
+ dev: true
+
+ /sentence-case@3.0.4:
+ resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==}
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.6.1
+ upper-case-first: 2.0.2
+ dev: true
+
+ /set-value@4.1.0:
+ resolution: {integrity: sha512-zTEg4HL0RwVrqcWs3ztF+x1vkxfm0lP+MQQFPiMJTKVceBwEV0A569Ou8l9IYQG8jOZdMVI1hGsc0tmeD2o/Lw==}
+ engines: {node: '>=11.0'}
+ dependencies:
+ is-plain-object: 2.0.4
+ is-primitive: 3.0.1
+ dev: true
+
+ /shebang-command@2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
+ dependencies:
+ shebang-regex: 3.0.0
+ dev: true
+
+ /shebang-regex@3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /side-channel@1.0.4:
+ resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==}
+ dependencies:
+ call-bind: 1.0.2
+ get-intrinsic: 1.2.1
+ object-inspect: 1.12.3
+ dev: true
+
+ /signal-exit@3.0.7:
+ resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
+ dev: true
+
+ /sisteransi@1.0.5:
+ resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
+ dev: true
+
+ /slash@3.0.0:
+ resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /slash@4.0.0:
+ resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /slice-ansi@3.0.0:
+ resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ ansi-styles: 4.3.0
+ astral-regex: 2.0.0
+ is-fullwidth-code-point: 3.0.0
+ dev: true
+
+ /snake-case@3.0.4:
+ resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==}
+ dependencies:
+ dot-case: 3.0.4
+ tslib: 2.6.1
+ dev: true
+
+ /source-map-js@1.0.2:
+ resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /source-map@0.5.7:
+ resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /source-map@0.6.1:
+ resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /source-map@0.7.4:
+ resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==}
+ engines: {node: '>= 8'}
+ dev: true
+
+ /spark-md5@3.0.2:
+ resolution: {integrity: sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==}
+ dev: true
+
+ /spdx-correct@3.2.0:
+ resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==}
+ dependencies:
+ spdx-expression-parse: 3.0.1
+ spdx-license-ids: 3.0.13
+ dev: true
+
+ /spdx-exceptions@2.3.0:
+ resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==}
+ dev: true
+
+ /spdx-expression-parse@3.0.1:
+ resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==}
+ dependencies:
+ spdx-exceptions: 2.3.0
+ spdx-license-ids: 3.0.13
+ dev: true
+
+ /spdx-license-ids@3.0.13:
+ resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==}
+ dev: true
+
+ /sponge-case@1.0.1:
+ resolution: {integrity: sha512-dblb9Et4DAtiZ5YSUZHLl4XhH4uK80GhAZrVXdN4O2P4gQ40Wa5UIOPUHlA/nFd2PLblBZWUioLMMAVrgpoYcA==}
+ dependencies:
+ tslib: 2.6.1
+ dev: true
+
+ /state-local@1.0.7:
+ resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==}
+ dev: true
+
+ /string-hash@1.1.3:
+ resolution: {integrity: sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==}
+ dev: true
+
+ /string-width@4.2.3:
+ resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+ engines: {node: '>=8'}
+ dependencies:
+ emoji-regex: 8.0.0
+ is-fullwidth-code-point: 3.0.0
+ strip-ansi: 6.0.1
+ dev: true
+
+ /string.prototype.trim@1.2.7:
+ resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.2.0
+ es-abstract: 1.22.1
+ dev: true
+
+ /string.prototype.trimend@1.0.6:
+ resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.2.0
+ es-abstract: 1.22.1
+ dev: true
+
+ /string.prototype.trimstart@1.0.6:
+ resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.2.0
+ es-abstract: 1.22.1
+ dev: true
+
+ /string_decoder@1.1.1:
+ resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
+ dependencies:
+ safe-buffer: 5.1.2
+ dev: true
+
+ /string_decoder@1.3.0:
+ resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+ dependencies:
+ safe-buffer: 5.2.1
+ dev: true
+
+ /strip-ansi@6.0.1:
+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+ engines: {node: '>=8'}
+ dependencies:
+ ansi-regex: 5.0.1
+ dev: true
+
+ /strip-bom@3.0.0:
+ resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /strip-final-newline@2.0.0:
+ resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /strip-final-newline@3.0.0:
+ resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /strip-indent@3.0.0:
+ resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ min-indent: 1.0.1
+ dev: true
+
+ /strip-json-comments@3.1.1:
+ resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /style-mod@4.0.3:
+ resolution: {integrity: sha512-78Jv8kYJdjbvRwwijtCevYADfsI0lGzYJe4mMFdceO8l75DFFDoqBhR1jVDicDRRaX4//g1u9wKeo+ztc2h1Rw==}
+ dev: true
+
+ /style-value-types@5.0.0:
+ resolution: {integrity: sha512-08yq36Ikn4kx4YU6RD7jWEv27v4V+PUsOGa4n/as8Et3CuODMJQ00ENeAVXAeydX4Z2j1XHZF1K2sX4mGl18fA==}
+ dependencies:
+ hey-listen: 1.0.8
+ tslib: 2.6.1
+ dev: true
+
+ /stylis@4.2.0:
+ resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==}
+ dev: true
+
+ /stylus@0.59.0:
+ resolution: {integrity: sha512-lQ9w/XIOH5ZHVNuNbWW8D822r+/wBSO/d6XvtyHLF7LW4KaCIDeVbvn5DF8fGCJAUCwVhVi/h6J0NUcnylUEjg==}
+ hasBin: true
+ dependencies:
+ '@adobe/css-tools': 4.2.0
+ debug: 4.3.4
+ glob: 7.2.3
+ sax: 1.2.4
+ source-map: 0.7.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /superjson@1.13.1:
+ resolution: {integrity: sha512-AVH2eknm9DEd3qvxM4Sq+LTCkSXE2ssfh1t11MHMXyYXFQyQ1HLgVvV+guLTsaQnJU3gnaVo34TohHPulY/wLg==}
+ engines: {node: '>=10'}
+ dependencies:
+ copy-anything: 3.0.5
+ dev: true
+
+ /supports-color@5.5.0:
+ resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
+ engines: {node: '>=4'}
+ dependencies:
+ has-flag: 3.0.0
+ dev: true
+
+ /supports-color@7.2.0:
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+ engines: {node: '>=8'}
+ dependencies:
+ has-flag: 4.0.0
+ dev: true
+
+ /supports-hyperlinks@2.3.0:
+ resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==}
+ engines: {node: '>=8'}
+ dependencies:
+ has-flag: 4.0.0
+ supports-color: 7.2.0
+ dev: true
+
+ /supports-preserve-symlinks-flag@1.0.0:
+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /swap-case@2.0.2:
+ resolution: {integrity: sha512-kc6S2YS/2yXbtkSMunBtKdah4VFETZ8Oh6ONSmSd9bRxhqTrtARUCBUiWXH3xVPpvR7tz2CSnkuXVE42EcGnMw==}
+ dependencies:
+ tslib: 2.6.1
+ dev: true
+
+ /symbol-observable@4.0.0:
+ resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==}
+ engines: {node: '>=0.10'}
+ dev: true
+
+ /synckit@0.8.5:
+ resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ dependencies:
+ '@pkgr/utils': 2.4.2
+ tslib: 2.6.1
+ dev: true
+
+ /tapable@2.2.1:
+ resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /tar-stream@2.2.0:
+ resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==}
+ engines: {node: '>=6'}
+ dependencies:
+ bl: 4.1.0
+ end-of-stream: 1.4.4
+ fs-constants: 1.0.0
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+ dev: true
+
+ /temp-dir@1.0.0:
+ resolution: {integrity: sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /temp-dir@2.0.0:
+ resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /temp-write@4.0.0:
+ resolution: {integrity: sha512-HIeWmj77uOOHb0QX7siN3OtwV3CTntquin6TNVg6SHOqCP3hYKmox90eeFOGaY1MqJ9WYDDjkyZrW6qS5AWpbw==}
+ engines: {node: '>=8'}
+ dependencies:
+ graceful-fs: 4.2.11
+ is-stream: 2.0.1
+ make-dir: 3.1.0
+ temp-dir: 1.0.0
+ uuid: 3.4.0
+ dev: true
+
+ /tempy@1.0.1:
+ resolution: {integrity: sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==}
+ engines: {node: '>=10'}
+ dependencies:
+ del: 6.1.1
+ is-stream: 2.0.1
+ temp-dir: 2.0.0
+ type-fest: 0.16.0
+ unique-string: 2.0.0
+ dev: true
+
+ /terminal-link@2.1.1:
+ resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ ansi-escapes: 4.3.2
+ supports-hyperlinks: 2.3.0
+ dev: true
+
+ /text-table@0.2.0:
+ resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
+ dev: true
+
+ /tiny-invariant@1.3.1:
+ resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==}
+ dev: true
+
+ /title-case@3.0.3:
+ resolution: {integrity: sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==}
+ dependencies:
+ tslib: 2.6.1
+ dev: true
+
+ /titleize@3.0.0:
+ resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /tmp@0.2.1:
+ resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==}
+ engines: {node: '>=8.17.0'}
+ dependencies:
+ rimraf: 3.0.2
+ dev: true
+
+ /to-fast-properties@2.0.0:
+ resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /to-regex-range@5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+ dependencies:
+ is-number: 7.0.0
+ dev: true
+
+ /toggle-selection@1.0.6:
+ resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==}
+ dev: true
+
+ /tr46@0.0.3:
+ resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
+ dev: true
+
+ /ts-api-utils@1.0.1(typescript@5.2.0-beta):
+ resolution: {integrity: sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==}
+ engines: {node: '>=16.13.0'}
+ peerDependencies:
+ typescript: '>=4.2.0'
+ dependencies:
+ typescript: 5.2.0-beta
+ dev: true
+
+ /ts-invariant@0.10.3:
+ resolution: {integrity: sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ tslib: 2.6.1
+ dev: true
+
+ /ts-node@10.9.1(@types/node@20.4.5)(typescript@5.2.0-beta):
+ resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==}
+ hasBin: true
+ peerDependencies:
+ '@swc/core': '>=1.2.50'
+ '@swc/wasm': '>=1.2.50'
+ '@types/node': '*'
+ typescript: '>=2.7'
+ peerDependenciesMeta:
+ '@swc/core':
+ optional: true
+ '@swc/wasm':
+ optional: true
+ dependencies:
+ '@cspotcode/source-map-support': 0.8.1
+ '@tsconfig/node10': 1.0.9
+ '@tsconfig/node12': 1.0.11
+ '@tsconfig/node14': 1.0.3
+ '@tsconfig/node16': 1.0.4
+ '@types/node': 20.4.5
+ acorn: 8.10.0
+ acorn-walk: 8.2.0
+ arg: 4.1.3
+ create-require: 1.1.1
+ diff: 4.0.2
+ make-error: 1.3.6
+ typescript: 5.2.0-beta
+ v8-compile-cache-lib: 3.0.1
+ yn: 3.1.1
+ dev: true
+
+ /ts-pattern@4.3.0:
+ resolution: {integrity: sha512-pefrkcd4lmIVR0LA49Imjf9DYLK8vtWhqBPA3Ya1ir8xCW0O2yjL9dsCVvI7pCodLC5q7smNpEtDR2yVulQxOg==}
+ dev: true
+
+ /tsconfig-paths@3.14.2:
+ resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==}
+ dependencies:
+ '@types/json5': 0.0.29
+ json5: 1.0.2
+ minimist: 1.2.8
+ strip-bom: 3.0.0
+ dev: true
+
+ /tsconfig-paths@4.2.0:
+ resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==}
+ engines: {node: '>=6'}
+ dependencies:
+ json5: 2.2.3
+ minimist: 1.2.8
+ strip-bom: 3.0.0
+ dev: true
+
+ /tslib@2.5.3:
+ resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==}
+ dev: true
+
+ /tslib@2.6.1:
+ resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==}
+ dev: true
+
+ /tua-body-scroll-lock@1.4.0:
+ resolution: {integrity: sha512-pbl411d7RSxjYXt5pB5GdBQ5BraVg1PMvr8BSUXc4buCMeK1OYu7L10PuOU8EhdfWoxGiAfvLrioSQe6Cr9m1g==}
+ dev: true
+
+ /type-check@0.4.0:
+ resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ prelude-ls: 1.2.1
+ dev: true
+
+ /type-fest@0.16.0:
+ resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /type-fest@0.20.2:
+ resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /type-fest@0.21.3:
+ resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /type-fest@0.6.0:
+ resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /type-fest@0.8.1:
+ resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /typed-array-buffer@1.0.0:
+ resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ get-intrinsic: 1.2.1
+ is-typed-array: 1.1.12
+ dev: true
+
+ /typed-array-byte-length@1.0.0:
+ resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ for-each: 0.3.3
+ has-proto: 1.0.1
+ is-typed-array: 1.1.12
+ dev: true
+
+ /typed-array-byte-offset@1.0.0:
+ resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ available-typed-arrays: 1.0.5
+ call-bind: 1.0.2
+ for-each: 0.3.3
+ has-proto: 1.0.1
+ is-typed-array: 1.1.12
+ dev: true
+
+ /typed-array-length@1.0.4:
+ resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==}
+ dependencies:
+ call-bind: 1.0.2
+ for-each: 0.3.3
+ is-typed-array: 1.1.12
+ dev: true
+
+ /typed-emitter@2.1.0:
+ resolution: {integrity: sha512-g/KzbYKbH5C2vPkaXGu8DJlHrGKHLsM25Zg9WuC9pMGfuvT+X25tZQWo5fK1BjBm8+UrVE9LDCvaY0CQk+fXDA==}
+ optionalDependencies:
+ rxjs: 7.8.1
+ dev: true
+
+ /typescript-plugin-css-modules@5.0.1(ts-node@10.9.1)(typescript@5.2.0-beta):
+ resolution: {integrity: sha512-hKXObfwfjx2/myRq4JeQ8D3xIWYTFqusi0hS/Aka7RFX1xQEoEkdOGDWyXNb8LmObawsUzbI30gQnZvqYXCrkA==}
+ peerDependencies:
+ typescript: '>=4.0.0'
+ dependencies:
+ '@types/postcss-modules-local-by-default': 4.0.0
+ '@types/postcss-modules-scope': 3.0.1
+ dotenv: 16.3.1
+ icss-utils: 5.1.0(postcss@8.4.27)
+ less: 4.1.3
+ lodash.camelcase: 4.3.0
+ postcss: 8.4.27
+ postcss-load-config: 3.1.4(postcss@8.4.27)(ts-node@10.9.1)
+ postcss-modules-extract-imports: 3.0.0(postcss@8.4.27)
+ postcss-modules-local-by-default: 4.0.3(postcss@8.4.27)
+ postcss-modules-scope: 3.0.0(postcss@8.4.27)
+ reserved-words: 0.1.2
+ sass: 1.64.2
+ source-map-js: 1.0.2
+ stylus: 0.59.0
+ tsconfig-paths: 4.2.0
+ typescript: 5.2.0-beta
+ transitivePeerDependencies:
+ - supports-color
+ - ts-node
+ dev: true
+
+ /typescript@5.2.0-beta:
+ resolution: {integrity: sha512-z5cq8BXVwaY8cwltw0BiyHRCVXen3QNgIzIcJV4NiLzaWvavxltzFSXd2csO4HoBjlGnuG+/LLbUZ8is3fD6iA==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+ dev: true
+
+ /ua-parser-js@1.0.35:
+ resolution: {integrity: sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA==}
+ dev: true
+
+ /uc.micro@1.0.6:
+ resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==}
+ dev: true
+
+ /unbox-primitive@1.0.2:
+ resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==}
+ dependencies:
+ call-bind: 1.0.2
+ has-bigints: 1.0.2
+ has-symbols: 1.0.3
+ which-boxed-primitive: 1.0.2
+ dev: true
+
+ /unc-path-regex@0.1.2:
+ resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /unique-string@2.0.0:
+ resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==}
+ engines: {node: '>=8'}
+ dependencies:
+ crypto-random-string: 2.0.0
+ dev: true
+
+ /universalify@2.0.0:
+ resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==}
+ engines: {node: '>= 10.0.0'}
+ dev: true
+
+ /unixify@1.0.0:
+ resolution: {integrity: sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ normalize-path: 2.1.1
+ dev: true
+
+ /untildify@4.0.0:
+ resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /update-browserslist-db@1.0.11(browserslist@4.21.10):
+ resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+ dependencies:
+ browserslist: 4.21.10
+ escalade: 3.1.1
+ picocolors: 1.0.0
+ dev: true
+
+ /upper-case-first@2.0.2:
+ resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==}
+ dependencies:
+ tslib: 2.6.1
+ dev: true
+
+ /upper-case@2.0.2:
+ resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==}
+ dependencies:
+ tslib: 2.6.1
+ dev: true
+
+ /uri-js@4.4.1:
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+ dependencies:
+ punycode: 2.3.0
+ dev: true
+
+ /use-callback-ref@1.3.0(@types/react@18.2.18)(react@18.2.0):
+ resolution: {integrity: sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@types/react': 18.2.18
+ react: 18.2.0
+ tslib: 2.6.1
+ dev: true
+
+ /use-context-selector@1.4.1(react-dom@18.2.0)(react@18.2.0)(scheduler@0.23.0):
+ resolution: {integrity: sha512-Io2ArvcRO+6MWIhkdfMFt+WKQX+Vb++W8DS2l03z/Vw/rz3BclKpM0ynr4LYGyU85Eke+Yx5oIhTY++QR0ZDoA==}
+ peerDependencies:
+ react: '>=16.8.0'
+ react-dom: '*'
+ react-native: '*'
+ scheduler: '>=0.19.0'
+ peerDependenciesMeta:
+ react-dom:
+ optional: true
+ react-native:
+ optional: true
+ dependencies:
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ scheduler: 0.23.0
+ dev: true
+
+ /use-sidecar@1.1.2(@types/react@18.2.18)(react@18.2.0):
+ resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@types/react': 18.2.18
+ detect-node-es: 1.1.0
+ react: 18.2.0
+ tslib: 2.6.1
+ dev: true
+
+ /util-deprecate@1.0.2:
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+ dev: true
+
+ /uuid@3.4.0:
+ resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==}
+ deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.
+ hasBin: true
+ dev: true
+
+ /uuid@8.3.2:
+ resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
+ hasBin: true
+ dev: true
+
+ /uuid@9.0.0:
+ resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==}
+ hasBin: true
+ dev: true
+
+ /v8-compile-cache-lib@3.0.1:
+ resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==}
+ dev: true
+
+ /validate-npm-package-license@3.0.4:
+ resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
+ dependencies:
+ spdx-correct: 3.2.0
+ spdx-expression-parse: 3.0.1
+ dev: true
+
+ /validator@13.9.0:
+ resolution: {integrity: sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==}
+ engines: {node: '>= 0.10'}
+ dev: true
+
+ /value-or-promise@1.0.12:
+ resolution: {integrity: sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /void-elements@3.1.0:
+ resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /vscode-languageserver-types@3.17.3:
+ resolution: {integrity: sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA==}
+ dev: true
+
+ /vuvuzela@1.0.3:
+ resolution: {integrity: sha512-Tm7jR1xTzBbPW+6y1tknKiEhz04Wf/1iZkcTJjSFcpNko43+dFW6+OOeQe9taJIug3NdfUAjFKgUSyQrIKaDvQ==}
+ dev: true
+
+ /w3c-keyname@2.2.8:
+ resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==}
+ dev: true
+
+ /webextension-polyfill@0.10.0:
+ resolution: {integrity: sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==}
+ dev: true
+
+ /webidl-conversions@3.0.1:
+ resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
+ dev: true
+
+ /whatwg-url@5.0.0:
+ resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
+ dependencies:
+ tr46: 0.0.3
+ webidl-conversions: 3.0.1
+ dev: true
+
+ /which-boxed-primitive@1.0.2:
+ resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
+ dependencies:
+ is-bigint: 1.0.4
+ is-boolean-object: 1.1.2
+ is-number-object: 1.0.7
+ is-string: 1.0.7
+ is-symbol: 1.0.4
+ dev: true
+
+ /which-typed-array@1.1.11:
+ resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ available-typed-arrays: 1.0.5
+ call-bind: 1.0.2
+ for-each: 0.3.3
+ gopd: 1.0.1
+ has-tostringtag: 1.0.0
+ dev: true
+
+ /which@2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
+ hasBin: true
+ dependencies:
+ isexe: 2.0.0
+ dev: true
+
+ /wrappy@1.0.2:
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+ dev: true
+
+ /yallist@3.1.1:
+ resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+ dev: true
+
+ /yallist@4.0.0:
+ resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
+ dev: true
+
+ /yaml@1.10.2:
+ resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
+ engines: {node: '>= 6'}
+ dev: true
+
+ /yn@3.1.1:
+ resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /yocto-queue@0.1.0:
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /zen-observable-ts@1.2.5:
+ resolution: {integrity: sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg==}
+ dependencies:
+ zen-observable: 0.8.15
+ dev: true
+
+ /zen-observable@0.8.15:
+ resolution: {integrity: sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==}
+ dev: true
+
+ /zip-stream@4.1.0:
+ resolution: {integrity: sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==}
+ engines: {node: '>= 10'}
+ dependencies:
+ archiver-utils: 2.1.0
+ compress-commons: 4.1.1
+ readable-stream: 3.6.2
+ dev: true
+
+ /zod@3.21.4:
+ resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==}
+ dev: true
diff --git a/scripts/build-apps.ts b/scripts/build-apps.ts
new file mode 100755
index 0000000..9714ceb
--- /dev/null
+++ b/scripts/build-apps.ts
@@ -0,0 +1,300 @@
+#!/usr/bin/env -S node -r esbin
+import "dotenv/config"
+import { promises as fs } from "fs"
+import { resolve } from "path"
+import glob from "fast-glob"
+import { program } from "commander"
+import sass from "esbuild-plugin-sass"
+import * as esbuild from "esbuild"
+import type { PluginItem } from "@babel/core"
+import { c } from "./utils"
+import { cssModules } from "./plugins/esbuild-css-modules"
+import { babelPlugin as babel } from "./plugins/esbuild-babel"
+import { externalDep } from "./plugins/esbuild-external-dep"
+import { stringImport } from "./plugins/esbuild-string-import"
+import { yamlPlugin as yaml } from "./plugins/esbuild-yaml"
+import { alias } from "./plugins/esbuild-alias"
+import { getDefaultTarget } from "./plugins/esbuild-browserslist"
+
+const dist = "dist"
+const SERVE_PORT = 3114
+
+program
+ .option("-g, --grep ", "only build packages that match ")
+ .option("-s, --silent", "hide all output")
+ .option(
+ "-e, --env ",
+ "set the NODE_ENV environment variable",
+ process.env.NODE_ENV || "production",
+ )
+ .option("-w, --watch", "watch for changes and rebuild")
+ .parse()
+
+const { grep, silent, env, watch } = program.opts()
+const __PROD__ = env === "production"
+
+const log = silent ? () => {} : console.log
+
+async function main() {
+ const queue = new Queue([
+ new Build("src/options/index.tsx", `${dist}/app/options`, { serve: true }),
+ new Build("src/popup/index.tsx", `${dist}/app/popup`),
+ new Build("src/server/index.ts", `${dist}/app/server`, {
+ platform: "node",
+ format: "cjs",
+ splitting: false,
+ minify: false,
+ }),
+ new Build("src/background/index.ts", `${dist}/app/background`),
+ new Build("src/background/compiler.ts", `${dist}/app/background/compiler`),
+ new Build("src/context/index.ts", `${dist}/app/context`, {
+ format: "iife",
+ splitting: false,
+ }),
+ new Build("src/devtools/index.ts", `${dist}/app/devtools`),
+ new Build("src/install/index.ts", `${dist}/app/install`),
+ new Build("src/graphiql/index.tsx", `${dist}/app/playground`),
+ new Build("src/reference/index.tsx", `${dist}/app/reference`, {
+ format: "iife",
+ splitting: false,
+ }),
+ ]).filter(grep ? task => task.entry.includes(grep) : () => true)
+
+ if (!queue.length) {
+ return
+ }
+
+ await queue.run(task => task.clean())
+
+ log(
+ watch ? "Watching" : "Building",
+ `${c.blue(queue.length)} package(s) in ${c.blue(env)}`,
+ )
+ if (queue.length < 5) {
+ log(queue.tasks.map((t, i) => ` ${i + 1}. ${c.green(t.entry)}`).join("\n"))
+ }
+
+ await queue.build()
+
+ if (__PROD__) {
+ await printBundleSize()
+ }
+}
+
+if (require.main === module) {
+ Promise.resolve()
+ .then(() => main())
+ .catch(e => {
+ console.error(e)
+ process.exit(1)
+ })
+}
+
+type BuildOptions = Pick<
+ esbuild.BuildOptions,
+ "entryPoints" | "outdir" | "format" | "splitting" | "platform" | "minify"
+> & {
+ serve?: boolean
+}
+
+export const getBasicOptions = ({
+ entryPoints,
+ minify = __PROD__,
+ plugins = [],
+ babelPlugins = [],
+}: {
+ entryPoints: [string]
+ minify?: boolean
+ plugins?: esbuild.Plugin[]
+ babelPlugins?: PluginItem[]
+}): Partial => ({
+ entryPoints,
+ define: {
+ ...Object.entries(process.env).reduce(
+ (acc, [key, value]) =>
+ key.startsWith("NEXT_PUBLIC_")
+ ? { ...acc, [`process.env.${key}`]: JSON.stringify(value) }
+ : acc,
+ {} as Record,
+ ),
+ "process.env.NODE_ENV": JSON.stringify(env),
+ "process.env.NODE_DEBUG": "false",
+ "process.env.SERVE_PORT": String(SERVE_PORT),
+ "process.browser": "true",
+ global: "globalThis",
+ },
+ bundle: true,
+ format: "esm",
+ external: ["path", "glob", "fs", "util", "monaco-editor"],
+ plugins: [
+ ...plugins,
+ externalDep(["prettier", "sass"]),
+ babel(babelPlugins),
+ yaml(),
+ stringImport(),
+ alias({
+ lodash: require.resolve("lodash-es"),
+ "webextension-polyfill": require.resolve("../src/vendor/webextension-polyfill"),
+ "monaco-editor": require.resolve("../src/options/monaco.ts"),
+
+ // https://github.com/MichalLytek/type-graphql/issues/366#issuecomment-511075437
+ "libphonenumber-js": require.resolve("lodash.noop"),
+ // we never use graphql-subscriptions
+ "graphql-subscriptions": require.resolve("lodash.noop"),
+
+ // Make esbuild use the module version
+ graphql: require.resolve("graphql/index.mjs"),
+
+ ...(entryPoints[0].includes("graphiql") || __PROD__
+ ? {}
+ : {
+ react: require.resolve("../src/vendor/why-did-you-render/index.js"),
+ "react/jsx-runtime": require.resolve(
+ "../src/vendor/why-did-you-render/jsx-runtime",
+ ),
+ }),
+ }),
+ cssModules({
+ generateScopedName: __PROD__
+ ? "[hash:base64:6]"
+ : "[name]__[local]___[hash:base64:5]",
+ localsConvention: "camelCaseOnly",
+ }),
+ sass(),
+ ].filter(Boolean),
+ target: getDefaultTarget(),
+ banner: {
+ js: "/* eslint-disable */",
+ },
+ legalComments: "none",
+ keepNames: false,
+ tsconfig: "./tsconfig.json",
+ sourcemap: "linked",
+ minify,
+ splitting: true,
+ metafile: true,
+ loader: {
+ ".eot": "file",
+ ".png": "file",
+ ".ttf": "file",
+ ".woff": "file",
+ ".woff2": "file",
+ },
+})
+
+async function printBundleSize() {
+ const root = resolve(dist, "app")
+ const files = await glob(["**/*", "!**/*.map", "!**/meta.json"], {
+ cwd: root,
+ onlyFiles: true,
+ })
+ const sizes = await Promise.all(
+ files.map(async file => {
+ const { size } = await fs.stat(resolve(root, file))
+ return { file, size }
+ }),
+ )
+
+ const list = sizes
+ .filter(a => a.size > 50000)
+ .sort((a, b) => b.size - a.size)
+ .slice(0, 10)
+
+ for (const { file, size } of list) {
+ log(
+ c.blue(`./dist/app/${file.padEnd(38, " ")}`),
+ c.green(`${humanFileSize(size).padStart(9, " ")}`),
+ )
+ }
+}
+
+function humanFileSize(bytes: number, si = false, dp = 1) {
+ const thresh = si ? 1000 : 1024
+
+ if (Math.abs(bytes) < thresh) {
+ return bytes + " B"
+ }
+
+ const units = si
+ ? ["kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"]
+ : ["KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"]
+ let u = -1
+ const r = 10 ** dp
+
+ do {
+ bytes /= thresh
+ ++u
+ } while (Math.round(Math.abs(bytes) * r) / r >= thresh && u < units.length - 1)
+
+ return bytes.toFixed(dp) + " " + units[u]
+}
+
+class Build {
+ enabled = true
+
+ constructor(
+ readonly entry: string,
+ readonly outdir: string,
+ readonly options?: BuildOptions,
+ ) {}
+
+ disable() {
+ this.enabled = false
+ return this
+ }
+
+ async clean() {
+ if (!this.enabled) return
+
+ await fs.rm(this.outdir, { recursive: true, force: true })
+ }
+
+ async build() {
+ if (!this.enabled) return
+
+ const { outdir, options: { serve, ...options } = {} } = this
+
+ const ctx = await esbuild.context({
+ ...getBasicOptions({
+ entryPoints: [this.entry],
+ }),
+ ...options,
+ outdir,
+ })
+
+ const { metafile } = await ctx.rebuild()
+
+ if (__PROD__) {
+ await fs.writeFile(resolve(outdir, "meta.json"), JSON.stringify(metafile))
+ }
+
+ if (watch) {
+ await ctx.watch()
+ if (serve) {
+ await ctx.serve({ port: SERVE_PORT })
+ }
+ } else {
+ await ctx.dispose()
+ }
+ }
+}
+
+class Queue {
+ constructor(public tasks: readonly Build[]) {}
+
+ get length() {
+ return this.tasks.length
+ }
+
+ filter(predicate: (task: Build) => boolean) {
+ return new Queue(this.tasks.filter(predicate))
+ }
+
+ run(fn: (task: Build) => Promise) {
+ return Promise.all(this.tasks.map(fn))
+ }
+
+ build() {
+ return this.run(task => task.build())
+ }
+}
diff --git a/scripts/build-css-module-def.ts b/scripts/build-css-module-def.ts
new file mode 100755
index 0000000..8a42f2d
--- /dev/null
+++ b/scripts/build-css-module-def.ts
@@ -0,0 +1,29 @@
+#!/usr/bin/env -S node -r esbin
+import fs from "fs"
+import { uniq } from "lodash"
+import { writeFormatted } from "./utils"
+
+const modules = [
+ "src/vendor/allotment/src/allotment.module.css",
+ "src/vendor/allotment/src/sash.module.css",
+]
+
+for (const module of modules) {
+ const source = fs.readFileSync(module, "utf8")
+ const classNames = uniq(
+ Array.from(source.matchAll(/\.([a-z][a-z0-9_-]+)/gi), m => m[1]),
+ )
+
+ writeFormatted(
+ module + ".d.ts",
+ [
+ "// This file is generated by scripts/build-css-module-def.ts",
+ "",
+ "declare const classNames: {", //
+ ...classNames.map(c => ` "${c}": string;`),
+ "}",
+ "",
+ "export default classNames;",
+ ].join("\n"),
+ )
+}
diff --git a/scripts/build-gql.ts b/scripts/build-gql.ts
new file mode 100755
index 0000000..77c2dbf
--- /dev/null
+++ b/scripts/build-gql.ts
@@ -0,0 +1,91 @@
+#!/usr/bin/env -S node -r esbin
+import { promises as fs } from "node:fs"
+import { format } from "prettier"
+import { CodeFileLoader } from "@graphql-tools/code-file-loader"
+import { GraphQLFileLoader } from "@graphql-tools/graphql-file-loader"
+import * as typescript from "@graphql-codegen/typescript"
+import * as typescriptOperations from "@graphql-codegen/typescript-operations"
+import * as add from "@graphql-codegen/add"
+import { plugin as _, codegen, typedDocumentNodePlugin } from "@aet/gql-tools/codegen"
+import { buildSchema } from "./build-schema-file"
+
+async function main() {
+ await buildSchema()
+
+ const scalars: Record = {
+ DateTime: "Date",
+ }
+
+ const context = await codegen({
+ schema: {
+ source: "./src/generated/schema.gql",
+ loaders: [new GraphQLFileLoader()],
+ },
+ documents: {
+ source: ["./src/**/*.{ts,tsx}", "!/src/generated/**/*.{ts,tsx}"],
+ loaders: [new CodeFileLoader({ pluckConfig: { skipIndent: true } })],
+ },
+ })
+
+ const content = await context.generate({
+ plugins: [
+ _(typescript, {
+ immutableTypes: true,
+ useTypeImports: true,
+ declarationKind: "interface",
+ allowEnumStringTypes: true,
+ enumsAsTypes: true,
+ scalars,
+ }),
+ _(typescriptOperations, {
+ declarationKind: "interface",
+ allowEnumStringTypes: true,
+ scalars,
+ }),
+ _(add, {
+ content: /* js */ `
+ /* eslint-disable */
+ import { gql as _gql } from "@apollo/client";
+ import type { DocumentNode } from "graphql";
+ export { ApolloClient, useQuery, useApolloClient, useLazyQuery, useMutation } from "@apollo/client";
+
+ export const gql = _gql as unknown as {
+ (
+ literals: string | readonly string[],
+ ...args: any[]
+ ): DocumentMap[K];
+ (
+ literals: string | readonly string[],
+ ...args: any[]
+ ): DocumentNode;
+ }
+ `,
+ }),
+ _(typedDocumentNodePlugin, {
+ createDocumentMap: true,
+ exportDocumentNodes: true,
+ }),
+ ],
+ pipeline: [
+ source =>
+ source
+ .replace(/Scalars\['String']\['(in|out)put']/g, "string")
+ .replace(/Scalars\['ID']\['(in|out)put']/g, "string")
+ .replace(/Scalars\['Boolean']\['(in|out)put']/g, "boolean")
+ .replace(/Scalars\['Int']\['(in|out)put']/g, "number")
+ .replace(/Scalars\['Float']\['(in|out)put']/g, "number")
+ .replaceAll("Scalars['DateTime']['input']", "Date")
+ .replaceAll("Scalars['JSON']['input']", "any")
+ .replace(/(\w+) \| `\$\{\1}`/g, " $1")
+ .replace(/: (Input)?Maybe<([['\]\w<> ]+)>/g, ": $2 | null")
+ .replace(/: Array<([\w<> ]+)>/g, ": $1[]")
+ .replace(/export type (\w+) = {/g, "export interface $1 {")
+ .replace(/export type (Make|Maybe|InputMaybe|Exact|Incremental)/g, "type $1"),
+ code => format(code, { parser: "typescript" }),
+ ],
+ })
+
+ await fs.writeFile("./src/generated/graphql.ts", content)
+}
+
+void main()
diff --git a/scripts/build-htmls.tsx b/scripts/build-htmls.tsx
new file mode 100755
index 0000000..4d4ef92
--- /dev/null
+++ b/scripts/build-htmls.tsx
@@ -0,0 +1,91 @@
+#!/usr/bin/env -S node -r esbin
+import fs from "fs"
+import React from "react"
+import { renderToStaticMarkup } from "react-dom/server"
+
+const __DEV__ = process.env.NODE_ENV !== "production"
+
+const Head: FC<{
+ children: React.ReactNode
+}> = ({ children }) => (
+
+
+
+ {children}
+
+)
+
+const files: {
+ [path: string]: React.ReactElement
+} = {
+ "./dist/background.html": (
+
+
+
+
+
+ ),
+ "./dist/devtools.html": (
+
+
+
+
+
+ ),
+ "./dist/options.html": (
+
+
+
+
+
+
+ {__DEV__ && (
+ // React DevTools
+ // curl -s http://localhost:8097 | openssl dgst -sha384 -binary | openssl base64 -A
+
+ )}
+
+
+
+
+
+ ),
+ "./dist/playground.html": (
+
+
+
+
+
+
+
+
+
+ ),
+ "./dist/popup.html": (
+
+
+
+
+
+
+
+
+
+ ),
+ "./dist/reference.html": (
+
+
+
+
+
+
+
+
+
+ ),
+}
+
+for (const [path, content] of Object.entries(files)) {
+ const html = "" + renderToStaticMarkup(content)
+ fs.writeFileSync(path, html)
+}
diff --git a/scripts/build-license.ts b/scripts/build-license.ts
new file mode 100755
index 0000000..f00865e
--- /dev/null
+++ b/scripts/build-license.ts
@@ -0,0 +1,145 @@
+#!/usr/bin/env -S node -r esbin
+import fs from "node:fs"
+import { resolve } from "node:path"
+import { load } from "js-yaml"
+
+process.chdir(resolve(__dirname, ".."))
+
+const candidates = [
+ "master/LICENSE",
+ "master/LICENCE",
+ "master/LICENSE.md",
+ "master/license.md",
+ "main/LICENSE.txt",
+]
+
+async function getLicense(repo: string) {
+ for (const candidate of candidates) {
+ const path = `https://raw.githubusercontent.com/${repo}/${candidate}`
+ const res = await fetch(path)
+ if (!res.ok) continue
+ const text = await res.text()
+ return text
+ }
+ throw new Error(`Could not find license for ${repo}`)
+}
+
+async function getSDPXLicense(license: string) {
+ const path = `https://raw.githubusercontent.com/spdx/license-list-data/main/text/${license}.txt`
+ const res = await fetch(path)
+ if (!res.ok) throw new Error(`Could not find license ${license}`)
+ const text = await res.text()
+ return text
+}
+
+function getVendorLicenses() {
+ return fs
+ .readdirSync("src/vendor")
+ .map(name => ({ name, path: `src/vendor/${name}/LICENSE` }))
+ .filter(({ path }) => fs.existsSync(path))
+ .map(({ name, path }) => [name, fs.readFileSync(path, "utf8")])
+}
+
+async function getPackageLicense(pkg: string) {
+ const files = ["LICENSE", "LICENCE", "license.md"]
+ for (const file of files) {
+ const path = `node_modules/${pkg}/${file}`
+ if (fs.existsSync(path)) {
+ return fs.readFileSync(path, "utf8")
+ }
+ }
+
+ const pkgJson = JSON.parse(fs.readFileSync(`node_modules/${pkg}/package.json`, "utf8"))
+ const licenseName = pkgJson.license as string
+ if (!licenseName) throw new Error(`Could not find license for ${pkg}`)
+
+ return getSDPXLicense(licenseName)
+}
+
+function getPackageLicenses() {
+ const {
+ dependencies = {},
+ devDependencies = {},
+ peerDependencies = {},
+ } = JSON.parse(fs.readFileSync("package.json", "utf8"))
+ const packages = Object.keys({
+ ...dependencies,
+ ...devDependencies,
+ ...peerDependencies,
+ })
+ return Promise.all(packages.map(async pkg => [pkg, await getPackageLicense(pkg)]))
+}
+
+class Licenses {
+ libs = new Set()
+
+ constructor(readonly json: Record) {}
+
+ set(name: string, license: string) {
+ this.libs.add(name)
+ this.json[name] = license
+ }
+
+ async setIfAbsent(name: string, license: () => Promise) {
+ if (!this.json[name]) {
+ const text = await license()
+ this.set(name, text)
+ }
+ }
+
+ assign(others: Record) {
+ for (const [name, license] of Object.entries(others)) {
+ this.set(name, license)
+ }
+ }
+
+ purge() {
+ for (const name of Object.keys(this.json)) {
+ if (!this.libs.has(name)) {
+ delete this.json[name]
+ }
+ }
+ }
+
+ toJSON() {
+ return this.json
+ }
+}
+
+async function main() {
+ const outPath = "src/generated/licenses.json"
+ if (!fs.existsSync(outPath)) {
+ fs.writeFileSync(outPath, "{}")
+ }
+ const res = new Licenses(
+ JSON.parse(fs.readFileSync(outPath, "utf8")) as Record,
+ )
+ const config = load(fs.readFileSync("src/licenses.yml", "utf8")) as {
+ github: string[]
+ licenses: { [name: string]: string }
+ }
+
+ // res.set("archive", await getSPLicense("AGPL-3.0-or-later"));
+ for (const repo of config.github) {
+ await res.setIfAbsent(repo, () => getLicense(repo))
+ }
+ for (const [name, license] of Object.entries(config.licenses)) {
+ await res.setIfAbsent(name, () => getSDPXLicense(license))
+ }
+ res.assign(Object.fromEntries(getVendorLicenses()))
+ res.assign(Object.fromEntries(await getPackageLicenses()))
+ res.purge()
+
+ fs.writeFileSync(
+ outPath,
+ JSON.stringify(
+ Object.fromEntries(
+ Object.entries(res.toJSON()).sort(([a], [b]) => a.localeCompare(b)),
+ ),
+ null,
+ 2,
+ ) + "\n",
+ )
+}
+
+void main()
diff --git a/scripts/build-locales.ts b/scripts/build-locales.ts
new file mode 100755
index 0000000..41d6353
--- /dev/null
+++ b/scripts/build-locales.ts
@@ -0,0 +1,42 @@
+#!/usr/bin/env -S node -r esbin
+import { execSync } from "child_process"
+import { resolve } from "path"
+import en from "../src/shared/i18n/resources/en-US/index.json"
+import { writeFormatted } from "./utils"
+
+const languages = process.argv.slice(2).includes("-f")
+ ? execSync("crowdin list languages --code=locale --plain")
+ .toString()
+ .trim()
+ .split("\n")
+ .concat("en-US")
+ .sort()
+ : ["de-DE", "en-US", "es-ES", "fr-CA", "fr-FR", "ja-JP", "ko-KR", "zh-CN", "zh-TW"]
+
+const keys: string[] = Array.from(
+ (function* keys(
+ obj: Record,
+ prefixes: string[] = [],
+ ): Generator {
+ for (const [key, value] of Object.entries(obj)) {
+ if (value != null && typeof value === "object") {
+ yield* keys(value as any, prefixes.concat(key))
+ } else {
+ yield prefixes.concat(key).join(".")
+ }
+ }
+ })(en),
+).sort()
+
+const code = [
+ `export const languages = ${JSON.stringify(languages, null, 2)};`,
+ "",
+ "export type TranslationKey =",
+ keys.map(key => " | " + JSON.stringify(key)).join("\n"),
+ ";\n",
+]
+
+writeFormatted(
+ resolve(__dirname, "../src/shared/i18n/data.generated.ts"),
+ code.join("\n"),
+)
diff --git a/scripts/build-makefile.ts b/scripts/build-makefile.ts
new file mode 100755
index 0000000..98adf9d
--- /dev/null
+++ b/scripts/build-makefile.ts
@@ -0,0 +1,116 @@
+#!/usr/bin/env -S node -r esbin
+import { promises as fs } from "fs"
+import { resolve } from "path"
+import { kebabCase } from "lodash"
+import { sync as glob } from "fast-glob"
+import { ensureArray as arr } from "~/shared/ensureArray"
+// import _ from "dedent";
+
+interface Task {
+ deps: string | string[]
+ target: string | string[]
+ command: string | string[]
+}
+
+// Variables for Makefile
+// $@: The file name of the target of the rule.
+// $<: The name of the first prerequisite.
+// $?: The names of all the prerequisites that are newer than the target, with spaces between them.
+// $^: The names of all the prerequisites, with spaces between them.
+
+const tasks: { [name: string]: () => Task } = {
+ Makefile: (script = "scripts/build-makefile.ts") => ({
+ command: script,
+ target: "Makefile",
+ deps: [script],
+ }),
+
+ theme: (script = "scripts/build-theme.tsx") => ({
+ command: `${script} -o $(@D)`,
+ target: [
+ "src/shared/theme/tokens.generated.ts",
+ "src/shared/theme/tokens.generated.css",
+ ],
+ deps: ["src/shared/theme/tokens.tsx", script],
+ }),
+
+ models: (
+ models = "src/shared/models",
+ source = `${models}/models.yml`,
+ script = "./scripts/build-models.ts",
+ ) => ({
+ command: `${script}`,
+ target: glob(`${models}/*.generated.ts`),
+ deps: [source, script],
+ }),
+
+ WebExtensionPolyfill: (base = "src/vendor/webextension-polyfill") => ({
+ target: `${base}/api-metadata.generated.json`,
+ deps: glob(`${base}/**/*`),
+ command: `./${base}/scripts/compress.ts`,
+ }),
+
+ HTML: (script = "scripts/build-htmls.tsx") => ({
+ target: glob("dist/*.html"),
+ deps: script,
+ command: script,
+ }),
+
+ locales: (script = "scripts/build-locales.ts") => ({
+ target: [
+ ...glob(["dist/_locales/**/*.json", "src/shared/i18n/resources"]),
+ "src/shared/i18n/data.generated.ts",
+ ],
+ deps: script,
+ command: script,
+ }),
+
+ // monaco: (
+ // script = "./scripts/build-monaco.ts",
+ // dist = "dist/vendor/monaco-editor/index.js",
+ // ) => ({
+ // target: dist,
+ // deps: ["package.json", script],
+ // command: [script, `touch ${dist}`],
+ // }),
+
+ sass: (script = "./scripts/build-sass.ts") => ({
+ target: "dist/vendor/sass/index.js",
+ deps: ["package.json", script],
+ command: script,
+ }),
+}
+
+async function main() {
+ const sep = " \\\n "
+
+ function* generate() {
+ yield "# This file is generated by `make Makefile`"
+
+ const instances = Object.entries(tasks).map(([name, t]) => [name, t()] as const)
+ for (const [name, task] of instances) {
+ const { target } = task
+ yield arr(target).join(" ") +
+ ": " +
+ arr(task.deps)
+ .filter(d => !glob(d).some(file => target.includes(file)))
+ .join(sep)
+
+ yield `\t@echo "✨ Building ${name}..."`
+ for (const cmd of arr(task.command)) {
+ yield `\t@${cmd}`
+ }
+ yield ""
+ yield `${kebabCase(name)}: ${arr(target)[0]}`
+ yield ""
+ }
+
+ yield "all: " + instances.map(task => kebabCase(task[0])).join(sep)
+ yield ""
+ }
+
+ const makefile = [...generate()].join("\n")
+ await fs.writeFile(resolve(__dirname, "../Makefile"), makefile)
+}
+
+main()
diff --git a/scripts/build-manifest.ts b/scripts/build-manifest.ts
new file mode 100755
index 0000000..cef965b
--- /dev/null
+++ b/scripts/build-manifest.ts
@@ -0,0 +1,68 @@
+#!/usr/bin/env -S node -r esbin
+import "dotenv/config"
+import fs from "fs"
+import { resolve } from "path"
+import type { Manifest } from "webextension-polyfill"
+
+const manifest: Manifest.WebExtensionManifest = {
+ name: "__MSG_extName__",
+ version: "19.11.6",
+ description: "__MSG_description__",
+ manifest_version: 2,
+ default_locale: "en_US",
+ icons: {
+ 64: "assets/images/64.png",
+ 128: "assets/images/128.png",
+ 256: "assets/images/256.png",
+ },
+ permissions: [
+ "tabs",
+ "downloads",
+ "webNavigation",
+ "storage",
+ "http://*/",
+ "https://*/",
+ "chrome://favicon/",
+ ],
+ content_security_policy:
+ "script-src 'unsafe-inline' 'self' http://localhost:8097/; object-src 'self'",
+ minimum_chrome_version: "90.0",
+ background: {
+ page: "background.html",
+ persistent: true,
+ },
+ devtools_page: "devtools.html",
+ content_scripts: [
+ {
+ matches: [""],
+ run_at: "document_start",
+ all_frames: true,
+ js: ["app/context/index.js"],
+ },
+ {
+ matches: ["http://userstyles.org/*", "https://userstyles.org/*"],
+ run_at: "document_end",
+ all_frames: false,
+ js: ["app/install/index.js"],
+ },
+ ],
+ options_ui: {
+ page: "options.html",
+ open_in_tab: true,
+ },
+ browser_action: {
+ default_icon: {
+ 16: "assets/images/16w.png",
+ 19: "assets/images/19w.png",
+ 32: "assets/images/32w.png",
+ 38: "assets/images/38w.png",
+ },
+ default_title: "__MSG_extName__",
+ default_popup: "popup.html",
+ },
+}
+
+fs.writeFileSync(
+ resolve(__dirname, "../dist", "manifest.json"),
+ JSON.stringify(manifest, null, 2),
+)
diff --git a/scripts/build-models.ts b/scripts/build-models.ts
new file mode 100755
index 0000000..7be769c
--- /dev/null
+++ b/scripts/build-models.ts
@@ -0,0 +1,321 @@
+#!/usr/bin/env -S node -r esbin
+import "dotenv/config"
+import { promises as fs } from "fs"
+import { resolve } from "path"
+import { assign, camelCase } from "lodash"
+import yaml from "js-yaml"
+import { writeFormatted } from "./utils"
+
+// type Outputs = "partial input" | "input" | "object" | "inputAndObject" | "args" | "zod";
+type Output =
+ | ["input", { partial?: boolean; name?: string }] //
+ | ["object"]
+ | ["args"]
+ | ["zod"]
+
+interface Model {
+ as: Output[]
+ extends?: string
+ fields: string
+ extra?: Record
+}
+
+const FIELD_REGEX =
+ /^(?\w+)(?\?)?(:\s*(?[\w\s[\]|]+))?(\s*=\s*(?.+))?$/
+
+function parseField(field: string) {
+ const groups = field.match(FIELD_REGEX)?.groups
+ if (!groups) {
+ throw new Error(`Invalid field: ${field}`)
+ }
+
+ if (!groups.type && groups.defaultValue) {
+ const v = groups.defaultValue
+ if (v === "true" || v === "false") {
+ groups.type = "boolean"
+ }
+ }
+
+ return groups as {
+ name: string
+ optional?: "?"
+ type: string
+ defaultValue: string
+ }
+}
+
+function parseFields(value: any) {
+ if (typeof value === "object") {
+ value = Object.entries(value)
+ .map(([name, type]) => `${name}: ${type}`)
+ .join("\n")
+ }
+
+ return (value as string).trim().split("\n").map(parseField)
+}
+
+const getInputName = (name: string) => (name.startsWith("Input") ? name : `Input${name}`)
+
+type Generate = Generator
+
+async function main() {
+ const folder = resolve(__dirname, "../src/shared/models")
+ const source = await fs.readFile(resolve(folder, "models.yml"), "utf8")
+ const json = yaml.load(source) as {
+ enums: Record
+ imports?: string
+ models: Record
+ }
+
+ const models = Object.entries(json.models).map(
+ ([name, { as, extends: _, fields, extra }]) => ({
+ name,
+ as: as.map(t =>
+ Array.isArray(t) ? [t[0], (assign as any)(...t.slice(1))] : [t, {}],
+ ) as Output[],
+ extends: _,
+ fields: parseFields(fields),
+ extra,
+ }),
+ )
+
+ for (const model of models) {
+ if (model.extends) {
+ const parent = models.find(m => m.name === model.extends)
+ if (!parent) {
+ throw new Error(`Could not find parent ${model.extends}`)
+ }
+ model.fields = parent.fields.concat(model.fields)
+ }
+ }
+
+ const importedEnums = new Set()
+ const enumNames = Object.keys(json.enums)
+
+ function getReifiedType(type: string): string {
+ if (type.endsWith("| null")) {
+ type = type.slice(0, -6).trim()
+ }
+ if (type.endsWith("[]")) {
+ return `[${getReifiedType(type.slice(0, -2))}]`
+ }
+ switch (type) {
+ case "string":
+ case "String":
+ return "String"
+ case "int":
+ case "Int":
+ return "Int"
+ case "boolean":
+ case "Boolean":
+ return "Boolean"
+ default:
+ if (enumNames.includes(type)) {
+ importedEnums.add(type)
+ }
+ if (/^\d+$/.test(type)) {
+ return "Int"
+ }
+ return type
+ }
+ }
+
+ function getVirtualType(type: string): string {
+ if (type.endsWith("[]")) {
+ return `${getVirtualType(type.slice(0, -2))}[]`
+ } else if (type.endsWith("| null")) {
+ return `${getVirtualType(type.slice(0, -6).trim())} | null`
+ }
+ switch (type) {
+ case "int":
+ case "Int":
+ return "number"
+ case "ID":
+ case "String":
+ return "string"
+ case "Boolean":
+ return "boolean"
+ default:
+ if (enumNames.includes(type)) {
+ importedEnums.add(type)
+ }
+ return type
+ }
+ }
+
+ function getZodType(type: string): string {
+ if (type.endsWith("[]")) {
+ return `z.array(${getZodType(type.slice(0, -2))})`
+ } else if (type.endsWith("| null")) {
+ return `${getZodType(type.slice(0, -6).trim())}.optional()`
+ }
+ switch (type) {
+ case "int":
+ case "Int":
+ return "z.number()"
+ case "string":
+ return "z.string()"
+ case "boolean":
+ return "z.boolean()"
+ default:
+ if (/^[\d.]+$/.test(type)) {
+ return `z.literal(${type})`
+ }
+
+ if (enumNames.includes(type)) {
+ return `z.nativeEnum(${type})`
+ }
+ return `z.instanceof(${type})`
+ }
+ }
+
+ const banners: string[] = [
+ `import { ArgsType, Field, ID, InputType, Int, ObjectType } from "@aet/gql-tools/macro";`,
+ // `import { z } from "zod";`,
+ ]
+
+ /* eslint-disable @typescript-eslint/consistent-type-imports, @typescript-eslint/no-unused-vars, @typescript-eslint/no-inferrable-types */
+ const getModels = function* (): Generate {
+ for (const model of models) {
+ let attachInputToObject = false
+ for (const type of model.as) {
+ let { name } = model
+ let isInput = false
+ let isPartialInput = false
+
+ switch (type[0]) {
+ case "input":
+ isInput = true
+ isPartialInput = type[1].partial ?? false
+
+ if (
+ Object.keys(type[1]).length === 0 &&
+ model.as.some(t => t[0] === "object")
+ ) {
+ attachInputToObject = true
+ continue
+ } else {
+ name = type[1].name ?? getInputName(name)
+ yield `@InputType("${name}")\n`
+ }
+ break
+
+ case "object":
+ if (attachInputToObject) {
+ yield `/** Input and object type for ${name} */\n`
+ yield `@InputType("${getInputName(name)}")\n`
+ }
+ yield `@ObjectType("${name}")\n`
+ break
+
+ case "args":
+ yield `@ArgsType()\n`
+ break
+
+ case "zod":
+ continue
+ }
+
+ yield `export class ${name} {`
+ for (const field of model.fields) {
+ const optional = field.optional || isPartialInput
+ yield "@Field("
+
+ yield `() => ${getReifiedType(field.type)},`
+ if (optional) {
+ yield "{ nullable: true },"
+ }
+ yield ")\n"
+ if (!field.defaultValue) {
+ yield "declare "
+ }
+ yield `${field.name}`
+ if (optional) {
+ yield "?"
+ }
+ yield ":"
+ yield getVirtualType(field.type)
+ if (isInput && field.defaultValue) {
+ yield ` = ${field.defaultValue}`
+ }
+ yield ";\n\n"
+ }
+
+ let constructorType = name
+ if (model.extra) {
+ const omits: string[] = []
+ for (const [name, type] of Object.entries(model.extra)) {
+ if (type.includes("=")) {
+ omits.push(name.replace(/\?$/, ""))
+ }
+ yield `${name}: ${type}\n`
+ }
+ constructorType = `Omit<${name}, ${omits.map(o => `"${o}"`).join(" | ")}>`
+ }
+
+ yield /* js */ `
+ /**
+ * Create an instance of ${name} from a plain object.
+ */
+ constructor(fields: ${constructorType}) {
+ Object.assign(this, fields);
+ }
+ `
+
+ // if (1 === 3) {
+ // yield "\n";
+ // yield `/** Zod schema for ${name} */\n`;
+ // yield "static zod = z.object({\n";
+ // for (const field of model.fields) {
+ // yield `${field.name}: ${getZodType(field.type)},\n`;
+ // }
+ // yield `}).strict();`;
+ // }
+
+ yield "}\n\n"
+ }
+ }
+ }
+
+ function* getEnums() {
+ for (const [name, values] of Object.entries(json.enums)) {
+ yield `export const ${name} = {`
+ for (const value of values) {
+ yield `${value}: "${value}",\n`
+ }
+ yield "} as const;\n"
+ yield
+ yield `export type ${name} = typeof ${name}[keyof typeof ${name}];\n`
+ yield
+ yield `export const ${camelCase(name)}s = [${values
+ .map(v => `"${v}"`)
+ .join(", ")}] as ${name}[];\n`
+ yield
+ }
+ }
+
+ await writeTS(resolve(folder, "models.generated.ts"), getModels, () =>
+ banners.concat(
+ importedEnums.size
+ ? `import { ${Array.from(importedEnums)
+ .sort()
+ .join(", ")} } from "./enums.generated";`
+ : [],
+ ),
+ )
+ await writeTS(resolve(folder, "enums.generated.ts"), getEnums, () => [])
+}
+
+async function writeTS(path: string, generator: () => Generate, banner: () => string[]) {
+ const code = Array.from(generator(), x => x ?? "\n").join("")
+ await writeFormatted(path, banner().join("\n") + "\n\n" + code)
+}
+
+if (require.main === module) {
+ Promise.resolve()
+ .then(() => main())
+ .catch(e => {
+ console.error(e)
+ process.exit(1)
+ })
+}
diff --git a/scripts/build-primer-ref.ts b/scripts/build-primer-ref.ts
new file mode 100755
index 0000000..8d44b2f
--- /dev/null
+++ b/scripts/build-primer-ref.ts
@@ -0,0 +1,17 @@
+#!/usr/bin/env -S node -r esbin
+import fs from "fs"
+import { resolve } from "path"
+
+const path = resolve(__dirname, "../dist/reference.html")
+const html = fs
+ .readFileSync(path, "utf8")
+ .replace(/`
+ })
+ .replace(//, (_, $1) => {
+ const css = fs.readFileSync(resolve(__dirname, "../dist", $1), "utf8")
+ return ``
+ })
+
+fs.writeFileSync(path.replace(".html", "-bundled.html"), html)
diff --git a/scripts/build-sass.ts b/scripts/build-sass.ts
new file mode 100755
index 0000000..ed47707
--- /dev/null
+++ b/scripts/build-sass.ts
@@ -0,0 +1,86 @@
+#!/usr/bin/env -S node -r esbin
+import fs from "fs"
+import { resolve } from "path"
+import * as esbuild from "esbuild"
+import { file } from "./utils"
+import { getDefaultTarget } from "./plugins/esbuild-browserslist"
+
+const outdir = resolve(__dirname, "../dist/vendor/sass")
+fs.rmSync(outdir, { recursive: true, force: true })
+
+const prefix = `
+ let window = globalThis;
+
+ let process = {
+ env: {},
+ stdout: {
+ write: console.log
+ },
+ stderr: {
+ write: console.error,
+ },
+ };
+`
+
+const sass = fs.readFileSync(
+ resolve(__dirname, "../node_modules", "sass/sass.dart.js"),
+ "utf-8",
+)
+
+const replaced: string = sass
+ .replaceAll(/typeof Buffer/g, '"undefined"')
+ .replaceAll("process.stdout.isTTY", "undefined")
+ .replaceAll("self.location", "window.location")
+ .replace(/require\("(chokidar|readline|fs|util)"\)/g, "{}")
+ .replace(
+ /(accept|accept\$1|add|call|toString|parse|write|scope\$1|parse[A-Z]\w+)\$(\d): function\(/g,
+ "$1$$$2(",
+ )
+ .replace(/\w+\.util\.inspect\.custom/g, "Symbol()")
+ .replace(/(\$eq|toString|get\$\w+|join\$0): function\(/g, "$1(")
+ .replace("if (dartNodeIsActuallyNode) {", "if (false) {")
+ // CSP
+ .replaceAll(
+ /new\s+self\.Function\(\s*("[^"\\]*(?:\\.[^"\\]*)*")\s*,\s*("[^"\\]*(?:\\.[^"\\]*)*")\s*\)/g,
+ (_, $1, $2) => `((${JSON.parse($1)}) => { ${JSON.parse($2)} })`,
+ )
+ .replaceAll(
+ /new\s+self\.Function\(\s*("[^"\\]*(?:\\.[^"\\]*)*")\s*,\s*('[^'\\]*(?:\\.[^'\\]*)*')\s*\)/g,
+ (_, $1, $2) =>
+ `((${JSON.parse($1)}) => { ${JSON.parse(
+ '"' + $2.slice(1, -1).replaceAll('"', '\\"') + '"',
+ )} })`,
+ )
+ .trim()
+
+const temporary = file.js(prefix + replaced)
+
+const entry = file.js(/* js */ `
+ import "${temporary.path}";
+ const sass = globalThis._cliPkgExports.pop();
+ sass.load({});
+
+ export default sass;
+`)
+
+try {
+ esbuild.buildSync({
+ entryPoints: [entry.path],
+ outfile: resolve(outdir, "index.js"),
+ bundle: true,
+ minify: true,
+ format: "esm",
+ sourcemap: "external",
+ target: getDefaultTarget(),
+ external: ["fs", "chokidar", "readline"],
+ banner: { js: "/* eslint-disable */" },
+ legalComments: "linked",
+ define: {
+ "process.env.NODE_ENV": '"production"',
+ "process.env.NODE_DEBUG": "undefined",
+ },
+ })
+} finally {
+ temporary.rm()
+ entry.rm()
+}
diff --git a/scripts/build-schema-file.ts b/scripts/build-schema-file.ts
new file mode 100755
index 0000000..afb768e
--- /dev/null
+++ b/scripts/build-schema-file.ts
@@ -0,0 +1,103 @@
+#!/usr/bin/env -S node -r esbin
+import fs from "fs"
+import { build } from "esbuild"
+import { printSchema } from "graphql"
+import type { Visitor } from "@babel/core"
+import { getBasicOptions } from "./build-apps"
+import { file } from "./utils"
+import { dependencies, devDependencies } from "../package.json"
+import type * as schema from "../src/background/graphql/schema"
+
+const output = file.js()
+
+const DEBUG = !!process.env.DEBUG
+
+const babelPlugin: Visitor<{ filename: string }> = {
+ ClassMethod({ node }) {
+ node.params = []
+ node.async = false
+ node.body.body = []
+ },
+ ClassPrivateMethod(path) {
+ path.remove()
+ },
+ ClassProperty({ node }) {
+ node.value = null
+ },
+ FunctionDeclaration({ node }, { filename }) {
+ if (!filename.includes("graphql")) {
+ node.body.body = []
+ }
+ },
+}
+
+export async function buildSchema() {
+ await build({
+ ...getBasicOptions({
+ entryPoints: ["src/background/graphql/schema.ts"],
+ babelPlugins: [() => ({ visitor: babelPlugin })],
+ plugins: [
+ {
+ name: "no-lib",
+ setup(build) {
+ const noop = require.resolve("lodash/noop")
+ const whitelist = new Set([
+ "graphql-type-json",
+ "reflect-metadata",
+ "tslib",
+ "lodash",
+ "@aet/gql-tools/marco",
+ "@aet/gql-tools/type-graphql",
+ ])
+ const noopRes = { path: noop, external: false }
+
+ build.onResolve({ filter: /.*/ }, ({ path }) => {
+ if (
+ path.includes("couchdb") ||
+ path.includes("idb") ||
+ path.includes("compiler") ||
+ path.includes("webextension")
+ ) {
+ return noopRes
+ }
+ if (/^(~|\.\.?)\//.test(path)) {
+ return null
+ }
+ if (whitelist.has(path)) {
+ return { path: require.resolve(path), external: true }
+ }
+ return noopRes
+ })
+ },
+ },
+ ],
+ }),
+ outfile: output.path,
+ target: "node20",
+ format: "cjs",
+ minify: !DEBUG,
+ keepNames: true,
+ legalComments: "none",
+ sourcemap: false,
+ splitting: false,
+ external: Object.keys(dependencies || {})
+ .concat(Object.keys(devDependencies))
+ .concat("@aet/gql-tools/type-graphql"),
+ })
+ .then(() => {
+ const { getSchema } = require("../" + output.path) as typeof schema
+ const result = printSchema(getSchema())
+ fs.writeFileSync("./src/generated/schema.gql", result)
+
+ return result
+ })
+ .finally(() => {
+ if (!DEBUG) {
+ output.rm()
+ }
+ })
+}
+
+if (require.main === module) {
+ void buildSchema()
+}
diff --git a/scripts/build-shims.js b/scripts/build-shims.js
new file mode 100755
index 0000000..393e8a2
--- /dev/null
+++ b/scripts/build-shims.js
@@ -0,0 +1,59 @@
+#!/usr/bin/env node
+/* eslint-disable spaced-comment */
+// @ts-check
+const fs = require("fs")
+const { resolve } = require("path")
+const pkg = require("../package.json")
+
+/**
+ * @param {TemplateStringsArray} args
+ */
+function _([source]) {
+ return {
+ "index.js": `module.exports = ${source};\n`,
+ "index.mjs": `export default ${source};\n`,
+ "package.json": JSON.stringify({ module: "index.mjs", version: "1.0.0" }),
+ }
+}
+
+const { entries, fromEntries } = Object
+
+/**
+ * @param {Record>} list
+ */
+function createShims(list) {
+ /** @type {Record} */
+ const resolutions = fromEntries(
+ entries(pkg.resolutions).filter(([, path]) => !path.startsWith("./shims")),
+ )
+
+ for (const [name, content] of entries(list)) {
+ const dir = resolve(__dirname, "../shims", name)
+ fs.mkdirSync(dir, { recursive: true })
+ content["package.json"] ??= "{}"
+
+ for (let [fileName, text] of entries(content)) {
+ if (fileName === "package.json") {
+ text = JSON.stringify({ name, ...JSON.parse(text) })
+ }
+ fs.writeFileSync(resolve(dir, fileName), text)
+ }
+
+ resolutions[name] = `./shims/${name}`
+ }
+
+ pkg.resolutions =
+ /** @type {any} */
+ (fromEntries(entries(resolutions).sort(([a], [b]) => a.localeCompare(b))))
+
+ fs.writeFileSync(resolve(__dirname, "../package.json"), JSON.stringify(pkg, null, 2))
+}
+
+createShims({
+ "cross-fetch": {
+ "index.js": /*js*/ `module.exports = fetch; const headers = Headers; module.exports.Headers = headers;`,
+ "index.mjs": /*js*/ `export default fetch; const headers = Headers; export { headers as Headers };`,
+ "package.json": JSON.stringify({ module: "index.mjs", version: "1.0.0" }),
+ },
+ "is-number": _/*js*/ `value => typeof value === "number"`,
+})
diff --git a/scripts/build-theme.tsx b/scripts/build-theme.tsx
new file mode 100755
index 0000000..fc5c0ba
--- /dev/null
+++ b/scripts/build-theme.tsx
@@ -0,0 +1,110 @@
+#!/usr/bin/env -S node -r esbin
+import { promises as fs } from "fs"
+import { resolve } from "path"
+import sass from "sass"
+import { kebabCase } from "lodash"
+import { tokenSource } from "~/shared/theme/tokens"
+
+const trim = (s: string) => s.trim()
+
+const [, outdir] = process.argv.slice(2)
+// This file is used to `make theme`.
+namespace primer {
+ // https://github.com/primer/github-vscode-theme/commit/5f08d0cc4de8abc33e13c3f63fe92288824a11cf
+ // prettier-ignore
+ const classic = {
+ black: "#1b1f23",
+ white: "#fff",
+ gray: ["#fafbfc", "#f6f8fa", "#e1e4e8", "#d1d5da", "#959da5", "#6a737d", "#586069", "#444d56", "#2f363d", "#24292e"],
+ blue: ["#f1f8ff", "#dbedff", "#c8e1ff", "#79b8ff", "#2188ff", "#0366d6", "#005cc5", "#044289", "#032f62", "#05264c"],
+ green: ["#f0fff4", "#dcffe4", "#bef5cb", "#85e89d", "#34d058", "#28a745", "#22863a", "#176f2c", "#165c26", "#144620"],
+ yellow: ["#fffdef", "#fffbdd", "#fff5b1", "#ffea7f", "#ffdf5d", "#ffd33d", "#f9c513", "#dbab09", "#b08800", "#735c0f"],
+ orange: ["#fff8f2", "#ffebda", "#ffd1ac", "#ffab70", "#fb8532", "#f66a0a", "#e36209", "#d15704", "#c24e00", "#a04100"],
+ red: ["#ffeef0", "#ffdce0", "#fdaeb7", "#f97583", "#ea4a5a", "#d73a49", "#cb2431", "#b31d28", "#9e1c23", "#86181d"],
+ purple: ["#f5f0ff", "#e6dcfd", "#d1bcf9", "#b392f0", "#8a63d2", "#6f42c1", "#5a32a3", "#4c2889", "#3a1d6e", "#29134e"],
+ pink: ["#ffeef8", "#fedbf0", "#f9b3dd", "#f692ce", "#ec6cb9", "#ea4aaa", "#d03592", "#b93a86", "#99306f", "#6d224f"]
+ };
+
+ function addClassic(css: string, dark: boolean) {
+ const r = (name: string, value?: string) =>
+ (css = css.replace(
+ RegExp(/(--color-NAME: )([^;]+);/.source.replace("NAME", name)),
+ (_, name, originalValue) => `${name}${value ?? originalValue};`,
+ ))
+
+ r("canvas-default", dark ? "#1f2428" : undefined)
+ return css
+ }
+
+ function sassCompile(code: string) {
+ return sass.compileString(code, {
+ loadPaths: [resolve(__dirname, "../node_modules")],
+ style: "compressed",
+ }).css
+ }
+
+ export async function main() {
+ const outputDir = resolve(__dirname, "../dist/vendor/primer")
+ await fs.mkdir(outputDir, { recursive: true })
+
+ const themes = {
+ dark: "dark-default",
+ dark_colorblind: undefined,
+ dark_dimmed: undefined,
+ dark_high_contrast: undefined,
+ dark_tritanopia: undefined,
+ light: "light-default",
+ light_colorblind: undefined,
+ light_high_contrast: undefined,
+ light_tritanopia: undefined,
+ }
+
+ const toRoot = (name: string, themeName = name) =>
+ sassCompile(/* scss */ `
+ @use "@primer/primitives/dist/scss/colors/_${name}.scss" as *;
+ :root[data-theme="github-${themeName}"] {
+ @include primer-colors-${name};
+ }
+ `)
+
+ await Promise.all([
+ ...Object.entries(themes).map(([source, name = source]) =>
+ fs.writeFile(resolve(outputDir, `github-${name}.css`), toRoot(source, name)),
+ ),
+ fs.writeFile(
+ resolve(outputDir, "github-dark.css"),
+ addClassic(toRoot("dark"), true),
+ ),
+ fs.writeFile(
+ resolve(outputDir, "github-light.css"),
+ addClassic(toRoot("light"), false),
+ ),
+ ])
+ }
+}
+
+async function tokens() {
+ const declarations = Object.entries(tokenSource).map(([name, value]) => {
+ const [light, dark] = value.trim().split(",").map(trim)
+ return { name, light, dark }
+ })
+
+ await fs.writeFile(
+ resolve(outdir, "tokens.generated.css"),
+ [
+ "body{",
+ ...declarations.map(({ name, light }) => `--${kebabCase(name)}:${light};`),
+ "}",
+ "body.dark{",
+ ...declarations.map(({ name, dark }) => `--${kebabCase(name)}:${dark};`),
+ "}",
+ ].join(""),
+ )
+}
+
+async function main() {
+ await tokens()
+ await primer.main()
+}
+
+main()
diff --git a/scripts/build.sh b/scripts/build.sh
new file mode 100755
index 0000000..49364cc
--- /dev/null
+++ b/scripts/build.sh
@@ -0,0 +1,29 @@
+#!/bin/sh
+set -e
+
+if [ "$1" = "monaco" ]; then
+ rm -rf "dist/vendor/vs"
+ path=$(dirname "$(node -p "require.resolve('monaco-editor/package.json')")")/min/vs
+ cp -r "$path" "dist/vendor/vs"
+ exit 0
+fi
+
+if [ -z "$1" ]; then
+ export NODE_ENV=production
+ make all
+ echo "✨ Downloading locales..."
+ # crowdin download
+ echo "✨ Building gql..."
+ ./scripts/build-gql.ts
+ echo "✨ Building apps..."
+ ./scripts/build-apps.ts -s
+ echo "✨ Building license..."
+ ./scripts/build-license.ts
+else
+ path=$(find ./scripts -type f -name "build-$1.*")
+ if [ -z "$path" ]; then
+ echo "Unknown task '$1'."
+ exit 1
+ fi
+ $path "$@"
+fi
diff --git a/scripts/plugins/babel-component-name.ts b/scripts/plugins/babel-component-name.ts
new file mode 100644
index 0000000..78082d2
--- /dev/null
+++ b/scripts/plugins/babel-component-name.ts
@@ -0,0 +1,37 @@
+import type { BabelPlugin } from "./esbuild-babel"
+
+export const componentName =
+ (): BabelPlugin =>
+ ({ types: t }) => ({
+ name: "babel-plugin-component-name",
+ visitor: {
+ ReturnStatement(path) {
+ if (!t.isJSXElement(path.node.argument)) return
+
+ const funcParent = path.getFunctionParent()
+ if (funcParent == null || !t.isArrowFunctionExpression(funcParent.node)) return
+
+ let id: string | undefined
+
+ if (
+ t.isCallExpression(funcParent.parent) &&
+ t.isIdentifier(funcParent.parent.callee) &&
+ t.isVariableDeclarator(funcParent.parentPath.parent) &&
+ t.isIdentifier(funcParent.parentPath.parent.id)
+ ) {
+ id = funcParent.parentPath.parent.id.name
+ } else if (
+ t.isVariableDeclarator(funcParent.parent) &&
+ t.isIdentifier(funcParent.parent.id)
+ ) {
+ id = funcParent.parent.id.name
+ }
+
+ if (id != null) {
+ path.node.argument.openingElement.attributes.unshift(
+ t.jsxAttribute(t.jsxIdentifier("data-component"), t.stringLiteral(id)),
+ )
+ }
+ },
+ },
+ })
diff --git a/scripts/plugins/babel-constant-element.ts b/scripts/plugins/babel-constant-element.ts
new file mode 100644
index 0000000..3f0306f
--- /dev/null
+++ b/scripts/plugins/babel-constant-element.ts
@@ -0,0 +1,100 @@
+// https://github.com/babel/babel/blob/c38bf12f010520ea7abe8a286f62922b2d1e1f1b/packages/babel-plugin-transform-react-constant-elements/src/index.ts
+import type { Visitor } from "@babel/core"
+import type { PluginObj, types as t } from "@babel/core"
+
+interface PluginState {
+ isImmutable: boolean
+ mutablePropsAllowed?: boolean
+}
+
+export default (allowMutablePropsOnTags?: string[]): PluginObj => {
+ const HOISTED = new WeakSet()
+
+ const immutabilityVisitor: Visitor = {
+ enter(path, state) {
+ const stop = () => {
+ state.isImmutable = false
+ path.stop()
+ }
+
+ if (path.isJSXClosingElement()) {
+ path.skip()
+ return
+ }
+
+ // Elements with refs are not safe to hoist.
+ if (
+ path.isJSXIdentifier({ name: "ref" }) &&
+ path.parentPath.isJSXAttribute({ name: path.node })
+ ) {
+ return stop()
+ }
+
+ // Ignore identifiers & JSX expressions.
+ if (path.isJSXIdentifier() || path.isIdentifier() || path.isJSXMemberExpression()) {
+ return
+ }
+
+ if (!path.isImmutable()) {
+ // If it's not immutable, it may still be a pure expression, such as string concatenation.
+ // It is still safe to hoist that, so long as its result is immutable.
+ // If not, it is not safe to replace as mutable values (like objects) could be mutated after render.
+ // https://github.com/facebook/react/issues/3226
+ if (path.isPure()) {
+ const { confident, value } = path.evaluate()
+ if (confident) {
+ // We know the result; check its mutability.
+ const isMutable =
+ (!state.mutablePropsAllowed && value && typeof value === "object") ||
+ typeof value === "function"
+ if (!isMutable) {
+ // It evaluated to an immutable value, so we can hoist it.
+ path.skip()
+ return
+ }
+ }
+ }
+ stop()
+ }
+ },
+ }
+
+ return {
+ name: "transform-react-constant-elements",
+
+ visitor: {
+ Program(program) {
+ program.traverse({
+ JSXElement(path) {
+ if (HOISTED.has(path.node)) return
+ HOISTED.add(path.node)
+
+ const state: PluginState = { isImmutable: true }
+
+ // This transform takes the option `allowMutablePropsOnTags`, which is an array
+ // of JSX tags to allow mutable props (such as objects, functions) on. Use sparingly
+ // and only on tags you know will never modify their own props.
+ if (allowMutablePropsOnTags != null) {
+ // Get the element's name. If it's a member expression, we use the last part of the path.
+ // So the option ["FormattedMessage"] would match "Intl.FormattedMessage".
+ let namePath = path.get("openingElement").get("name")
+ while (namePath.isJSXMemberExpression()) {
+ namePath = namePath.get("property")
+ }
+
+ const elementName = (namePath.node as t.JSXIdentifier).name
+ state.mutablePropsAllowed = allowMutablePropsOnTags.includes(elementName)
+ }
+
+ // Traverse all props passed to this element for immutability.
+ path.traverse(immutabilityVisitor, state)
+
+ if (state.isImmutable) {
+ path.hoist(path.scope)
+ }
+ },
+ })
+ },
+ },
+ }
+}
diff --git a/scripts/plugins/babel-dynamic-import.ts b/scripts/plugins/babel-dynamic-import.ts
new file mode 100644
index 0000000..64250f6
--- /dev/null
+++ b/scripts/plugins/babel-dynamic-import.ts
@@ -0,0 +1,54 @@
+import { dirname } from "path"
+import glob from "fast-glob"
+import type { types } from "@babel/core"
+import type { BabelPlugin } from "./esbuild-babel"
+
+const skip = new WeakSet()
+
+export const dynamicImport =
+ (filePath: string): BabelPlugin =>
+ ({ types: t }) => ({
+ name: "dynamic-import",
+ visitor: {
+ Import(path) {
+ if (
+ !t.isCallExpression(path.parent) ||
+ path.parent.arguments.length !== 1 ||
+ skip.has(path.parent)
+ ) {
+ return
+ }
+
+ const [arg] = path.parent.arguments
+ if (!t.isTemplateLiteral(arg)) {
+ return
+ }
+
+ const key = path.scope.generateDeclaredUidIdentifier("key")
+
+ const globText = arg.quasis.map(x => x.value.raw).join("*")
+ const globCandidates = glob.sync(globText, {
+ cwd: dirname(filePath),
+ })
+
+ const clone = t.cloneNode(path.parent, true)
+ skip.add(clone)
+
+ const cond = globCandidates.reduceRight(
+ (accum: types.Expression, cur) =>
+ t.conditionalExpression(
+ t.binaryExpression("===", key, t.stringLiteral(cur)),
+ t.callExpression(t.import(), [t.stringLiteral(cur)]),
+ accum,
+ ),
+ clone,
+ )
+
+ t.cloneNode(path.parent)
+
+ path.parentPath.replaceWith(
+ t.sequenceExpression([t.assignmentExpression("=", key, arg), cond]),
+ )
+ },
+ },
+ })
diff --git a/scripts/plugins/babel-filename.ts b/scripts/plugins/babel-filename.ts
new file mode 100644
index 0000000..677c480
--- /dev/null
+++ b/scripts/plugins/babel-filename.ts
@@ -0,0 +1,30 @@
+import { basename, dirname } from "path"
+import type { BabelPlugin } from "./esbuild-babel"
+
+export const fileName =
+ ({
+ hasFileName,
+ hasDirName,
+ path,
+ }: {
+ hasFileName: boolean
+ hasDirName: boolean
+ path: string
+ }): BabelPlugin =>
+ ({ types: t }) => ({
+ name: "__filename polyfill",
+ visitor: {
+ Program(program) {
+ const assign = (id: string, value: string) =>
+ t.variableDeclaration("var", [
+ t.variableDeclarator(t.identifier(id), t.stringLiteral(value)),
+ ])
+ if (hasFileName) {
+ program.node.body.unshift(assign("__filename", basename(path)))
+ }
+ if (hasDirName) {
+ program.node.body.unshift(assign("__dirname", dirname(path)))
+ }
+ },
+ },
+ })
diff --git a/scripts/plugins/babel-inline-css-vars.ts b/scripts/plugins/babel-inline-css-vars.ts
new file mode 100644
index 0000000..67d6c11
--- /dev/null
+++ b/scripts/plugins/babel-inline-css-vars.ts
@@ -0,0 +1,80 @@
+import hash from "@emotion/hash"
+import type { types } from "@babel/core"
+import { kebabCase } from "lodash"
+import type { BabelPlugin } from "./esbuild-babel"
+
+export const inlineCSSVariables =
+ (): BabelPlugin<{ styles: { id: string; light: string; dark: string }[] }> =>
+ ({ types: t }) => ({
+ name: "inline CSS variables",
+ visitor: {
+ Program: {
+ enter(_, state) {
+ state.styles = []
+ },
+ exit(path, { styles }) {
+ if (!styles.length) return
+
+ const css =
+ `body.light {${styles.map(s => `--${s.id}:${s.light}`).join(";")}}\n` +
+ `body.dark {${styles.map(s => `--${s.id}:${s.dark}`).join(";")}}`
+
+ path.node.body.unshift(
+ t.importDeclaration([], t.stringLiteral(`data:text/css,${encodeURI(css)}`)),
+ )
+ },
+ },
+
+ TaggedTemplateExpression(path, state) {
+ function join(exp: types.Node): string[] | undefined {
+ if (t.isIdentifier(exp)) return [exp.name]
+ if (!t.isMemberExpression(exp) || !t.isIdentifier(exp.property)) return
+ const prev = t.isIdentifier(exp.object) ? [exp.object.name] : join(exp.object)
+ return prev ? [...prev, exp.property.name] : undefined
+ }
+
+ const { expressions: exps } = path.node.quasi
+ for (const [i, exp] of exps.entries()) {
+ if (t.isIdentifier(exp)) {
+ if (exp.name === "DARK_MODE") {
+ exps[i] = t.stringLiteral("body.dark &")
+ } else if (exp.name === "LIGHT_MODE") {
+ exps[i] = t.stringLiteral("body.light &")
+ }
+ continue
+ }
+
+ if (
+ t.isCallExpression(exp) &&
+ t.isIdentifier(exp.callee, { name: "color" }) &&
+ exp.arguments.length === 2 &&
+ t.isStringLiteral(exp.arguments[0]) &&
+ t.isStringLiteral(exp.arguments[1])
+ ) {
+ const [light, dark] = (exp.arguments as babel.types.StringLiteral[]).map(
+ arg => arg.value,
+ )
+ const id = hash(`${light}-${dark}`)
+ state.styles.push({ id, light, dark })
+ exps[i] = t.stringLiteral(`var(--${id})`)
+ continue
+ }
+
+ let ids: string[] | undefined
+ if (
+ t.isMemberExpression(exp) &&
+ t.isIdentifier(exp.property) &&
+ (ids = join(exp))
+ ) {
+ const rest = ids.slice(1).join(".")
+ if (ids[0] === "vars") {
+ exps[i] = t.stringLiteral(`var(--${kebabCase(rest)})`)
+ }
+ if (ids[0] === "token") {
+ exps[i] = t.stringLiteral(`var(--color-${kebabCase(rest)})`)
+ }
+ }
+ }
+ },
+ },
+ })
diff --git a/scripts/plugins/babel-why-did-you-render.ts b/scripts/plugins/babel-why-did-you-render.ts
new file mode 100644
index 0000000..926f435
--- /dev/null
+++ b/scripts/plugins/babel-why-did-you-render.ts
@@ -0,0 +1,106 @@
+import type { NodePath, types } from "@babel/core"
+import type { Node } from "@babel/core"
+import type { BabelPlugin } from "./esbuild-babel"
+
+// useWhyDidYouUpdate
+export const whyDidYouRender =
+ ({
+ hookName,
+ hookPath,
+ ignoredHooks,
+ }: {
+ hookName: string
+ hookPath: string
+ ignoredHooks: string[]
+ }): BabelPlugin =>
+ ({ types: t }) => {
+ const ignored = new WeakSet()
+
+ function ignore(node: Node) {
+ ignored.add(node)
+ return node
+ }
+
+ return {
+ name: "why-did-you-render",
+ visitor: {
+ Program(path, state) {
+ const id = path.scope.generateUidIdentifier(hookName)
+ path.node.body.unshift(
+ t.importDeclaration(
+ [t.importSpecifier(id, t.identifier(hookName))], //
+ t.stringLiteral(hookPath),
+ ),
+ )
+ state.whyDidYouRenderId = id
+ },
+
+ VariableDeclaration(path, state) {
+ if (ignored.has(path.node)) return
+
+ const decls = path.node.declarations
+ if (decls.length !== 1) return
+
+ const [{ init, id }] = decls
+ if (
+ !t.isCallExpression(init) ||
+ !t.isIdentifier(init.callee) ||
+ !init.callee.name.startsWith("use") ||
+ init.callee.name.length <= 3
+ ) {
+ return
+ }
+
+ if (ignoredHooks.includes(init.callee.name)) {
+ return
+ }
+
+ const findParent = (
+ predicate: (node: types.Node) => node is T,
+ ) => path.findParent(path => predicate(path.node)) as NodePath | undefined
+
+ const parentId =
+ findParent(t.isFunctionDeclaration)?.node.id!.name ??
+ ((
+ (findParent(t.isArrowFunctionExpression)?.parent)
+ ?.id
+ ))?.name
+
+ if (!parentId || parentId.startsWith("use")) {
+ return
+ }
+
+ const callee = t.cloneNode(state.whyDidYouRenderId as types.Identifier)
+
+ if (t.isIdentifier(id)) {
+ path.insertAfter(
+ t.callExpression(callee, [
+ t.stringLiteral(parentId),
+ t.stringLiteral(init.callee.name),
+ id,
+ ]),
+ )
+ return
+ }
+
+ const temporaryId = path.scope.generateUidIdentifier(init.callee.name)
+
+ path.replaceWithMultiple([
+ ignore(
+ t.variableDeclaration(path.node.kind, [
+ t.variableDeclarator(temporaryId, init),
+ t.variableDeclarator(id, temporaryId),
+ ]),
+ ),
+ t.expressionStatement(
+ t.callExpression(callee, [
+ t.stringLiteral(parentId),
+ t.stringLiteral(init.callee.name),
+ temporaryId,
+ ]),
+ ),
+ ])
+ },
+ },
+ }
+ }
diff --git a/scripts/plugins/esbuild-alias.ts b/scripts/plugins/esbuild-alias.ts
new file mode 100644
index 0000000..5b833ed
--- /dev/null
+++ b/scripts/plugins/esbuild-alias.ts
@@ -0,0 +1,24 @@
+// https://github.com/igoradamenko/esbuild-plugin-alias/blob/master/index.js
+// MIT License. Copyright (c) 2021 Igor Adamenko
+import type { Plugin } from "esbuild"
+
+export function alias(options: Record): Plugin {
+ const aliases = Object.keys(options)
+ const re = new RegExp(`^(${aliases.map(x => escapeRegExp(x)).join("|")})$`)
+
+ return {
+ name: "alias",
+ setup(build) {
+ // we do not register 'file' namespace here, because the root file won't be processed
+ // https://github.com/evanw/esbuild/issues/791
+ build.onResolve({ filter: re }, args => ({
+ path: options[args.path],
+ }))
+ },
+ }
+}
+
+function escapeRegExp(string: string) {
+ // $& means the whole matched string
+ return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")
+}
diff --git a/scripts/plugins/esbuild-babel.ts b/scripts/plugins/esbuild-babel.ts
new file mode 100644
index 0000000..8910b55
--- /dev/null
+++ b/scripts/plugins/esbuild-babel.ts
@@ -0,0 +1,101 @@
+import fs from "fs"
+import { extname } from "path"
+import * as babel from "@babel/core"
+import type * as esbuild from "esbuild"
+import { fileName } from "./babel-filename"
+import { dynamicImport } from "./babel-dynamic-import"
+import { inlineCSSVariables } from "./babel-inline-css-vars"
+import { componentName } from "./babel-component-name"
+// import { whyDidYouRender } from "./babel-why-did-you-render";
+// import constantElement from "./babel-constant-element";
+
+const __PROD__ = process.env.NODE_ENV === "production"
+
+export type BabelPlugin = (
+ Babel: typeof babel,
+) => babel.PluginObj
+
+export interface BabelPluginData {
+ path: string
+}
+
+export const babelPlugin = (extraPlugins: babel.PluginItem[] = []): esbuild.Plugin => ({
+ name: "babel",
+ setup(build) {
+ function* getBabelPlugins(
+ path: string,
+ content: string,
+ ): Generator {
+ const hasFileName = content.includes("__filename")
+ const hasDirName = content.includes("__dirname")
+ if (hasFileName || hasDirName) {
+ yield fileName({ hasFileName, hasDirName, path })
+ }
+ if (!__PROD__ && /<\w/.test(content)) {
+ yield componentName()
+ }
+ // if (!__PROD__ && content.includes("use")) {
+ // yield whyDidYouRender({
+ // hookName: "useWhyDidYouUpdate",
+ // hookPath: resolve(__dirname, "../../src/shared/hooks/useWhy.ts"),
+ // ignoredHooks: ["useTreeContext"],
+ // });
+ // }
+ if (content.includes("vars.") || content.includes("token.")) {
+ yield inlineCSSVariables()
+ }
+ if (content.includes("await import(`")) {
+ yield dynamicImport(path)
+ }
+ if (content.includes('.macro"') || content.includes("/macro")) {
+ yield ["babel-plugin-macros", { typeGraphQL: { useParameterDecorator: true } }]
+ }
+ if (content.includes("@emotion")) {
+ yield [require("@emotion/babel-plugin"), { sourceMap: false }]
+ }
+
+ if (__PROD__ && content.includes("gql`")) {
+ yield [require("babel-plugin-transform-minify-gql-template-literals")]
+ }
+ }
+
+ build.onLoad({ filter: /\.tsx?$/ }, args => {
+ if (args.path.includes("node_modules/")) {
+ return null
+ }
+
+ const { path } = args
+ const file = fs.readFileSync(path, "utf-8")
+
+ const plugins: babel.PluginItem[] = Array.from(getBabelPlugins(path, file)).concat(
+ extraPlugins,
+ )
+
+ let code = file
+ const pluginData: BabelPluginData = { path }
+
+ if (plugins.length) {
+ const res = babel.transformSync(file, {
+ filename: path,
+ babelrc: false,
+ configFile: false,
+ parserOpts: {
+ plugins: ["typescript", "decorators-legacy", "jsx", "importAssertions"],
+ },
+ generatorOpts: { decoratorsBeforeExport: true },
+ plugins,
+ })!
+
+ code = res.code!
+ } else {
+ return null
+ }
+
+ return {
+ contents: code,
+ loader: extname(path).slice(1) as any,
+ pluginData,
+ }
+ })
+ },
+})
diff --git a/scripts/plugins/esbuild-browserslist.ts b/scripts/plugins/esbuild-browserslist.ts
new file mode 100644
index 0000000..ae5a893
--- /dev/null
+++ b/scripts/plugins/esbuild-browserslist.ts
@@ -0,0 +1,107 @@
+// https://github.com/nihalgonsalves/esbuild-plugin-browserslist
+// MIT License. Copyright (c) 2021 Nihal Gonsalves
+import { z } from "zod"
+import browserslist from "browserslist"
+
+export function getDefaultTarget() {
+ return getTarget(
+ ["Chrome", "Firefox", "Edge", "Safari"].map(browser => `last 2 ${browser} versions`),
+ )
+}
+
+enum BrowserslistKind {
+ Edge = "edge",
+ Firefox = "firefox",
+ Chrome = "chrome",
+ Safari = "safari",
+ iOS = "ios_saf",
+ Android = "android",
+ AndroidChrome = "and_chr",
+ AndroidFirefox = "and_ff",
+ AndroidUC = "and_uc",
+ AndroidQQ = "and_qq",
+ Samsung = "samsung",
+ Opera = "opera",
+ OperaMini = "op_mini",
+ OperaMobile = "op_mob",
+ IE = "ie",
+ IEMobile = "ie_mob",
+ BlackBerry = "bb",
+ Baidu = "baidu",
+ Kaios = "kaios",
+ Node = "node",
+}
+
+const enum EsbuildEngine {
+ Chrome = "chrome",
+ Edge = "edge",
+ ES = "es",
+ Firefox = "firefox",
+ Hermes = "hermes",
+ IE = "ie",
+ IOS = "ios",
+ Node = "node",
+ Opera = "opera",
+ Rhino = "rhino",
+ Safari = "safari",
+}
+
+const BrowserslistEsbuildMapping: Partial> = {
+ // exact map
+ [BrowserslistKind.Edge]: EsbuildEngine.Edge,
+ [BrowserslistKind.Firefox]: EsbuildEngine.Firefox,
+ [BrowserslistKind.Chrome]: EsbuildEngine.Chrome,
+ [BrowserslistKind.Safari]: EsbuildEngine.Safari,
+ [BrowserslistKind.iOS]: EsbuildEngine.IOS,
+ [BrowserslistKind.Node]: EsbuildEngine.Node,
+ [BrowserslistKind.IE]: EsbuildEngine.IE,
+ [BrowserslistKind.Opera]: EsbuildEngine.Opera,
+ // approximate mapping
+ [BrowserslistKind.Android]: EsbuildEngine.Chrome,
+ [BrowserslistKind.AndroidChrome]: EsbuildEngine.Chrome,
+ [BrowserslistKind.AndroidFirefox]: EsbuildEngine.Firefox,
+ // the rest have no equivalent for esbuild
+}
+
+const BrowserSchema = z.nativeEnum(BrowserslistKind)
+/** 123 or 123.456 or 123.456.789 */
+const VersionSchema = z.string().regex(/^(\d+\.\d+\.\d+|\d+\.\d+|\d+)$/)
+
+export function getTarget(targets: string[]): string[] {
+ const result = browserslist(targets)
+ .map(entry => {
+ const [rawBrowser, rawVersionOrRange] = entry.split(" ")
+
+ const rawVersionNormalized = rawVersionOrRange
+ // e.g. 13.4-13.7, take the lower range
+ ?.replace(/-[\d.]+$/, "")
+ // all => replace with 1
+ ?.replace("all", "1")
+
+ const browserResult = BrowserSchema.safeParse(rawBrowser)
+ const versionResult = VersionSchema.safeParse(rawVersionNormalized)
+
+ if (!browserResult.success || !versionResult.success) {
+ return
+ }
+
+ const { data: browser } = browserResult
+ const { data: version } = versionResult
+
+ const esbuildTarget = BrowserslistEsbuildMapping[browser]
+
+ if (!esbuildTarget) {
+ return
+ }
+
+ return { target: esbuildTarget, version }
+ })
+ .filter(Boolean)
+ .map(({ target, version }) => `${target}${version}`)
+
+ if (result.length === 0) {
+ throw new Error("Could not resolve any esbuild targets")
+ }
+
+ return result
+}
diff --git a/scripts/plugins/esbuild-css-extract.ts b/scripts/plugins/esbuild-css-extract.ts
new file mode 100644
index 0000000..f8b5bb6
--- /dev/null
+++ b/scripts/plugins/esbuild-css-extract.ts
@@ -0,0 +1,338 @@
+// import { relative, resolve } from "path";
+import type { PluginBuild } from "esbuild"
+import type * as babel from "@babel/core"
+import type { NodePath, types } from "@babel/core"
+import { expression } from "@babel/template"
+import hash from "@emotion/hash"
+import { compile, serialize, stringify } from "stylis"
+import { dropRightWhile } from "lodash"
+
+const NS = "extract-css"
+
+const runtimeArgs = ["Tag", "className", "vars"] as const
+// const root = resolve(__dirname, "../..");
+
+const shared = /* jsx */ `
+ ({ as = Tag, className: cls, style, ...rest }, ref) => {
+ return _jsx(as, {
+ ...rest,
+ ref,
+ style: vars != null ? getStyle({ ...style }, className, vars) : style,
+ className: cx([className, cls])
+ })
+ }
+`
+
+const runtime = /* jsx */ `
+ import { jsx } from "react/jsx-runtime";
+ import { forwardRef, memo } from "react";
+ import { cx } from "@emotion/css";
+
+ const supportsAs = new WeakSet();
+ const _jsx = jsx;
+
+ function getStyle(style, className, vars) {
+ for (let i = 0; i < vars.length; i++) {
+ const name = "--" + className + "-" + i;
+ const variable = vars[i];
+ if (variable !== null) {
+ style[name] = typeof variable === "function" ? variable(props) : variable;
+ }
+ }
+ return style;
+ }
+
+ export default function create(${runtimeArgs.join(", ")}) {
+ const Component = memo(
+ forwardRef(
+ supportsAs.has(Tag)
+ ? ${shared.replace("as, {", "Tag, { as,")}
+ : ${shared}
+ )
+ );
+
+ Component.withComponent = function (Tag) {
+ return create(${runtimeArgs.join(", ")});
+ };
+
+ supportsAs.add(Component);
+
+ return Component;
+ }
+`
+
+const flattenArgs = (args: { [key in (typeof runtimeArgs)[number]]: string }) =>
+ runtimeArgs.map(key => args[key]).join(", ")
+
+const styledComponent = expression({
+ // plugins: ["jsx"],
+ syntacticPlaceholders: true,
+})(
+ "%%create%%(" +
+ flattenArgs({
+ className: "%%className%%",
+ Tag: "%%tag%%",
+ vars: "%%vars%%",
+ }) +
+ ")",
+)
+
+const validParentTypes = new Set([
+ "ArrayExpression",
+ "BinaryExpression",
+ "CallExpression",
+ "JSXExpressionContainer",
+ "LogicalExpression",
+ "ObjectProperty",
+ "VariableDeclarator",
+])
+
+interface State extends babel.PluginPass {
+ styles: string[]
+ program: types.Program
+ runtimeHelper?: types.Identifier
+}
+
+export function extractCSS(build: PluginBuild, { className }: { className: string }) {
+ const RUNTIME = /^@extract-css\/runtime$/
+
+ build.onResolve({ filter: RUNTIME }, ({ path }) => ({ namespace: NS, path }))
+
+ build.onLoad({ filter: RUNTIME, namespace: NS }, () => ({
+ contents: runtime,
+ loader: "jsx",
+ resolveDir: __dirname,
+ }))
+
+ const plugin = ({ types: t }: typeof babel): babel.PluginObj => {
+ const classNameMap = new WeakMap()
+
+ function isImportedSpecifierFrom(path: NodePath, name: string, module: string) {
+ const declPath = path.scope.getBinding(name)!.path
+ return (
+ t.isImportSpecifier(declPath.node) &&
+ t.isImportDeclaration(declPath.parent) &&
+ declPath.parent.source.value === module
+ )
+ }
+
+ function isDefaultImportedFrom(path: NodePath, name: string, module: string) {
+ const binding = path.scope.getBinding(name)
+ if (!binding) return false
+ const declPath = binding.path
+ return (
+ t.isImportDefaultSpecifier(declPath.node) &&
+ t.isImportDeclaration(declPath.parent) &&
+ declPath.parent.source.value === module
+ )
+ }
+
+ function buildClassName(hash: string, componentName = "styled") {
+ return className.replaceAll("[hash]", hash).replaceAll("[name]", componentName)
+ }
+
+ function getComponentName(path: NodePath): string | undefined {
+ if (t.isVariableDeclarator(path.parent) && t.isIdentifier(path.parent.id)) {
+ return path.parent.id.name
+ }
+ }
+
+ const visitor: babel.Visitor = {
+ TaggedTemplateExpression(path, state) {
+ const { styles } = state
+ const quasiExps = path
+ .get("quasi")
+ .get("expressions") as NodePath[]
+
+ const { tag, quasi } = path.node
+
+ if (!validParentTypes.has(path.parent.type)) {
+ return
+ }
+
+ function extract(getPrefix: (className: string) => string) {
+ let bailout = false
+ const raws = quasi.quasis.map(q => q.value.raw)
+ const className = buildClassName(
+ hash(JSON.stringify(raws)),
+ getComponentName(path),
+ )
+ const skipInterpolations = new Set()
+
+ const cssText = raws
+ .map((left, i) => {
+ if (bailout) {
+ return null!
+ }
+
+ if (i === raws.length - 1) {
+ return left
+ }
+
+ const exp = quasi.expressions[i]
+ const evaluated = quasiExps[i].evaluate()
+ if (evaluated.confident) {
+ if (
+ typeof evaluated.value === "string" ||
+ typeof evaluated.value === "number"
+ ) {
+ skipInterpolations.add(i)
+ return left + String(evaluated.value)
+ }
+ }
+
+ if (t.isIdentifier(exp)) {
+ const binding = path.scope.getBinding(exp.name)
+ if (binding) {
+ const { node } = binding.path
+ if (t.isVariableDeclarator(node)) {
+ const cls = classNameMap.get(node.init!)
+ if (cls) {
+ skipInterpolations.add(i)
+ return left + cls
+ }
+ if (t.isStringLiteral(node.init)) {
+ skipInterpolations.add(i)
+ return left + node.init.value
+ }
+ }
+
+ bailout = true
+ }
+ } else if (t.isStringLiteral(exp)) {
+ skipInterpolations.add(i)
+ return left + exp.value
+ }
+
+ return `${left}var(--${className}-${i})`
+ })
+ .join("")
+
+ const compiled = compile(`${getPrefix(className)}{${cssText}}}`)
+
+ return {
+ className,
+ skipInterpolations,
+ bailout,
+ style: serialize(compiled, stringify),
+ }
+ }
+
+ function processStyled(tag: types.Expression) {
+ const { className, skipInterpolations, style, bailout } = extract(c => `.${c}`)
+ if (bailout) {
+ return
+ }
+
+ styles.push(style)
+
+ if (!state.runtimeHelper) {
+ state.runtimeHelper = path.scope.generateUidIdentifier("create")
+ state.program.body.unshift(
+ t.importDeclaration(
+ [t.importDefaultSpecifier(state.runtimeHelper)],
+ t.stringLiteral("@extract-css/runtime"),
+ ),
+ )
+ }
+
+ const fn = styledComponent({
+ create: state.runtimeHelper,
+ className: t.stringLiteral(className),
+ tag:
+ t.isIdentifier(tag) && /^[a-z]/.test(tag.name)
+ ? t.stringLiteral(tag.name)
+ : tag,
+ vars: quasi.expressions.length
+ ? t.arrayExpression(
+ dropRightWhile(
+ quasi.expressions.map((e, i) =>
+ skipInterpolations.has(i)
+ ? t.nullLiteral()
+ : (e as types.Expression),
+ ),
+ n => t.isNullLiteral(n),
+ ),
+ )
+ : t.nullLiteral(),
+ })
+ classNameMap.set(fn, className)
+ const [newPath] = path.replaceWith(fn)
+ newPath.addComment("leading", " @__PURE__ ")
+ }
+
+ if (t.isIdentifier(tag) && tag.name === "keyframes") {
+ if (!isImportedSpecifierFrom(path, tag.name, "@emotion/css")) {
+ return
+ }
+
+ const { className, style, bailout } = extract(c => `@keyframes ${c}`)
+ if (bailout) {
+ return
+ }
+ styles.push(style)
+ path.replaceWith(t.stringLiteral(className))
+ } else if (t.isIdentifier(tag) && tag.name === "css") {
+ if (!isImportedSpecifierFrom(path, tag.name, "@emotion/css")) {
+ return
+ }
+
+ const { className, style, bailout } = extract(c => `.${c}`)
+ if (bailout) {
+ return
+ }
+ styles.push(style)
+ path.replaceWith(t.stringLiteral(className))
+ } else if (
+ t.isMemberExpression(tag) &&
+ t.isIdentifier(tag.object, { name: "styled" }) &&
+ !t.isPrivateName(tag.property)
+ ) {
+ if (!isDefaultImportedFrom(path, tag.object.name, "@emotion/styled")) {
+ return
+ }
+ processStyled(tag.property)
+ } else if (
+ t.isCallExpression(tag) &&
+ t.isIdentifier(tag.callee, { name: "styled" }) &&
+ tag.arguments.length === 1 &&
+ t.isExpression(tag.arguments[0])
+ ) {
+ if (!isDefaultImportedFrom(path, tag.callee.name, "@emotion/styled")) {
+ return
+ }
+ processStyled(tag.arguments[0])
+ }
+ },
+ }
+
+ return {
+ name: "plugin",
+ visitor: {
+ Program: {
+ enter(program, state) {
+ state.styles = []
+ state.program = program.node
+ },
+ exit(program, state) {
+ program.traverse(visitor, state)
+
+ if (state.styles.length) {
+ const css =
+ // `/*./${relative(root, state.filename!)}*/` +
+ state.styles.join("\n")
+ program.node.body.unshift(
+ t.importDeclaration(
+ [],
+ t.stringLiteral(`data:text/css,${encodeURI(css)}`),
+ ),
+ )
+ }
+ },
+ },
+ },
+ }
+ }
+
+ return plugin
+}
diff --git a/scripts/plugins/esbuild-css-modules.ts b/scripts/plugins/esbuild-css-modules.ts
new file mode 100644
index 0000000..e876f9d
--- /dev/null
+++ b/scripts/plugins/esbuild-css-modules.ts
@@ -0,0 +1,92 @@
+import { relative, resolve } from "path"
+import { promises as fs } from "fs"
+import type { Plugin } from "esbuild"
+import postcss from "postcss"
+// @ts-expect-error
+import postcssSass from "@csstools/postcss-sass"
+import cssModules from "postcss-modules"
+
+type Options = Parameters[0]
+
+const PLUGIN_NAME = "esbuild-css-modules"
+
+async function buildCSSModule(cssFullPath: string, options: Options) {
+ options = {
+ localsConvention: "camelCaseOnly",
+ ...options,
+ }
+ const source = await fs.readFile(cssFullPath)
+
+ let classNames = {}
+ const { css } = await postcss([
+ postcssSass(),
+ cssModules({
+ getJSON(_, json) {
+ classNames = json
+ return classNames
+ },
+ ...options,
+ }),
+ ]).process(source, {
+ from: cssFullPath,
+ map: false,
+ })
+
+ return {
+ css,
+ classNames,
+ }
+}
+
+const srcDir = resolve(__dirname, "../../src")
+
+const plugin = (options: Options = {}): Plugin => ({
+ name: PLUGIN_NAME,
+ async setup(build) {
+ const memfs = new Map()
+ const FS_NAMESPACE = PLUGIN_NAME + "-fs"
+
+ build.onResolve({ filter: /\.modules?\.s?css$/, namespace: "file" }, async args => {
+ const res = await build.resolve(args.path, {
+ kind: "import-statement",
+ resolveDir: args.resolveDir,
+ })
+
+ // This is just the unique ID for this CSS module. We use a relative path to make it easier to debug.
+ const path = relative(srcDir, res.path)
+
+ return {
+ path,
+ namespace: PLUGIN_NAME,
+ pluginData: {
+ realPath: res.path,
+ },
+ }
+ })
+
+ build.onResolve({ filter: /^@css-modules\/.*/ }, ({ path }) => ({
+ path,
+ namespace: FS_NAMESPACE,
+ }))
+
+ build.onLoad({ filter: /./, namespace: FS_NAMESPACE }, ({ path }) => ({
+ contents: memfs.get(path)!,
+ loader: "css",
+ }))
+
+ build.onLoad({ filter: /./, namespace: PLUGIN_NAME }, async args => {
+ const tmpFilePath = "@css-modules/" + args.path
+ const { classNames, css } = await buildCSSModule(args.pluginData.realPath, options)
+ memfs.set(tmpFilePath, css)
+
+ return {
+ contents:
+ `import ${JSON.stringify(tmpFilePath)};\n` +
+ `module.exports = ${JSON.stringify(classNames)};`,
+ loader: "js",
+ }
+ })
+ },
+})
+
+export { plugin as cssModules }
diff --git a/scripts/plugins/esbuild-external-dep.ts b/scripts/plugins/esbuild-external-dep.ts
new file mode 100644
index 0000000..ce164c4
--- /dev/null
+++ b/scripts/plugins/esbuild-external-dep.ts
@@ -0,0 +1,14 @@
+import type * as esbuild from "esbuild"
+
+export const externalDep = (externals: string[]): esbuild.Plugin => ({
+ name: "externalDep",
+ setup(build) {
+ for (const module of externals) {
+ const resolved: esbuild.OnResolveResult = {
+ path: `/vendor/${module}/index.js`,
+ external: true,
+ }
+ build.onResolve({ filter: RegExp(`^${module}$`) }, () => resolved)
+ }
+ },
+})
diff --git a/scripts/plugins/esbuild-monaco-global.ts b/scripts/plugins/esbuild-monaco-global.ts
new file mode 100644
index 0000000..dd501ca
--- /dev/null
+++ b/scripts/plugins/esbuild-monaco-global.ts
@@ -0,0 +1 @@
+module.exports = globalThis.monaco
diff --git a/scripts/plugins/esbuild-string-import.ts b/scripts/plugins/esbuild-string-import.ts
new file mode 100644
index 0000000..1bac414
--- /dev/null
+++ b/scripts/plugins/esbuild-string-import.ts
@@ -0,0 +1,32 @@
+import { dirname } from "path"
+import { promises as fs } from "fs"
+import * as esbuild from "esbuild"
+
+export const stringImport = (): esbuild.Plugin => ({
+ name: "stringImport",
+ setup(build) {
+ build.onResolve({ filter: /\?string$/ }, async ({ path, importer }) => {
+ const resolved = await build.resolve(path.replace(/\?string$/, ""), {
+ kind: "import-statement",
+ importer,
+ resolveDir: dirname(importer),
+ })
+
+ return {
+ namespace: stringImport.name,
+ path: resolved.path,
+ }
+ })
+
+ build.onLoad({ filter: /.*/, namespace: stringImport.name }, async ({ path }) => {
+ let code = await fs.readFile(path, "utf-8")
+ if (build.initialOptions.minify && path.endsWith(".css")) {
+ ;({ code } = await esbuild.transform(code, { loader: "css", minify: true }))
+ }
+ return {
+ contents: code,
+ loader: "text",
+ }
+ })
+ },
+})
diff --git a/scripts/plugins/esbuild-yaml.ts b/scripts/plugins/esbuild-yaml.ts
new file mode 100644
index 0000000..5c7ce0f
--- /dev/null
+++ b/scripts/plugins/esbuild-yaml.ts
@@ -0,0 +1,42 @@
+// MIT License
+// Copyright (c) 2021 Marton Lederer
+// https://github.com/martonlederer/esbuild-plugin-yaml/tree/d8d14d18c999f6507e906a7015ace0c991b507b4
+import { isAbsolute, join } from "path"
+import { TextDecoder } from "util"
+import { promises as fs } from "fs"
+import type { Plugin } from "esbuild"
+import type { LoadOptions } from "js-yaml"
+import yaml from "js-yaml"
+
+interface YamlPluginOptions {
+ loadOptions?: LoadOptions
+}
+
+export const yamlPlugin = (options: YamlPluginOptions = {}): Plugin => ({
+ name: "yaml",
+ setup(build) {
+ // resolve .yaml and .yml files
+ build.onResolve({ filter: /\.(yml|yaml)$/ }, ({ path, resolveDir }) => {
+ if (resolveDir === "") return
+
+ return {
+ path: isAbsolute(path) ? path : join(resolveDir, path),
+ namespace: "yaml",
+ }
+ })
+
+ // load files with "yaml" namespace
+ build.onLoad({ filter: /.*/, namespace: "yaml" }, async ({ path }) => {
+ const yamlContent = await fs.readFile(path)
+ const parsed = yaml.load(
+ new TextDecoder().decode(yamlContent),
+ options?.loadOptions,
+ ) as any
+
+ return {
+ contents: JSON.stringify(parsed),
+ loader: "json",
+ }
+ })
+ },
+})
diff --git a/scripts/utils.ts b/scripts/utils.ts
new file mode 100644
index 0000000..335377d
--- /dev/null
+++ b/scripts/utils.ts
@@ -0,0 +1,89 @@
+import fs from "fs"
+import { extname } from "path"
+import { format } from "prettier"
+
+export function file(extension: string, content = "") {
+ const path = `./.${(Date.now() - 1677e9).toString(36)}${extension}`
+ fs.writeFileSync(path, content)
+
+ process.on("SIGINT", () => fs.unlinkSync(path))
+
+ return {
+ path,
+ rm: () => fs.unlinkSync(path),
+ }
+}
+
+file.js = (content?: string) => file(".js", content)
+
+export function map(list: T[], fn: (item: T, index: number) => Promise) {
+ return Promise.all(list.map(fn))
+}
+
+/**
+ * Write a file with Prettier formatting.
+ */
+export async function writeFormatted(path: string, content: string) {
+ const ext = extname(path)
+ const formatted = await format(content, {
+ parser: ext === ".ts" ? "babel-ts" : ext === ".js" ? "babel" : undefined,
+ })
+ return fs.promises.writeFile(path, formatted)
+}
+
+// https://github.com/nathanbabcock/picocolors-browser/tree/d98747d1e7dd58390044ff0696b6d10995a94de3
+// ISC License. Copyright (c) 2021 Alexey Raspopov, Kostiantyn Denysov, Anton Verinov
+export namespace c {
+ const enabled = !("NO_COLOR" in process.env)
+
+ const formatter = (open: string, close: string, replace = open) =>
+ enabled
+ ? (input: number | string) => {
+ const string = "" + input
+ const index = string.indexOf(close, open.length)
+ return index !== -1
+ ? open + replaceClose(string, close, replace, index) + close
+ : open + string + close
+ }
+ : String
+
+ function replaceClose(
+ string: string,
+ close: string,
+ replace: string,
+ index: number,
+ ): string {
+ const start = string.substring(0, index) + replace
+ const end = string.substring(index + close.length)
+ const nextIndex = end.indexOf(close)
+ return nextIndex !== -1
+ ? start + replaceClose(end, close, replace, nextIndex)
+ : start + end
+ }
+
+ export const reset = enabled ? (s: string) => `\x1b[0m${s}\x1b[0m` : String
+ export const bold = formatter("\x1b[1m", "\x1b[22m", "\x1b[22m\x1b[1m")
+ export const dim = formatter("\x1b[2m", "\x1b[22m", "\x1b[22m\x1b[2m")
+ export const italic = formatter("\x1b[3m", "\x1b[23m")
+ export const underline = formatter("\x1b[4m", "\x1b[24m")
+ export const inverse = formatter("\x1b[7m", "\x1b[27m")
+ export const hidden = formatter("\x1b[8m", "\x1b[28m")
+ export const strikethrough = formatter("\x1b[9m", "\x1b[29m")
+ export const black = formatter("\x1b[30m", "\x1b[39m")
+ export const red = formatter("\x1b[31m", "\x1b[39m")
+ export const green = formatter("\x1b[32m", "\x1b[39m")
+ export const yellow = formatter("\x1b[33m", "\x1b[39m")
+ export const blue = formatter("\x1b[34m", "\x1b[39m")
+ export const magenta = formatter("\x1b[35m", "\x1b[39m")
+ export const cyan = formatter("\x1b[36m", "\x1b[39m")
+ export const white = formatter("\x1b[37m", "\x1b[39m")
+ export const gray = formatter("\x1b[90m", "\x1b[39m")
+ export const bgBlack = formatter("\x1b[40m", "\x1b[49m")
+ export const bgRed = formatter("\x1b[41m", "\x1b[49m")
+ export const bgGreen = formatter("\x1b[42m", "\x1b[49m")
+ export const bgYellow = formatter("\x1b[43m", "\x1b[49m")
+ export const bgBlue = formatter("\x1b[44m", "\x1b[49m")
+ export const bgMagenta = formatter("\x1b[45m", "\x1b[49m")
+ export const bgCyan = formatter("\x1b[46m", "\x1b[49m")
+ export const bgWhite = formatter("\x1b[47m", "\x1b[49m")
+}
diff --git a/src/background/compiler.ts b/src/background/compiler.ts
new file mode 100644
index 0000000..41f19a1
--- /dev/null
+++ b/src/background/compiler.ts
@@ -0,0 +1,89 @@
+/* eslint-disable @typescript-eslint/require-await */
+/* eslint-disable @typescript-eslint/no-extraneous-class */
+/* eslint-disable class-methods-use-this */
+import sass, { type OutputStyle } from "sass"
+import UAParser from "ua-parser-js"
+import { expose } from "comlink"
+
+const parser = new UAParser(navigator.userAgent)
+const quote = JSON.stringify
+
+const modules = Object.entries({
+ navigator: () => /* scss */ `
+ $browser: ${quote(parser.getBrowser().name)};
+ $platform: ${quote(navigator.userAgentData?.platform)};
+ $userAgent: ${quote(navigator.userAgent)};
+ $language: ${quote(navigator.language)};
+ `,
+}).map(([key, value]) => ({
+ key,
+ url: new URL(`sass://${key}`),
+ module: {
+ syntax: "scss",
+ get contents() {
+ return value()
+ },
+ } as sass.ImporterResult,
+}))
+
+@expose
+export class Compiler {
+ static async compileSASS(data: string, outputStyle: OutputStyle): Promise {
+ try {
+ let { css } = sass.compileString(data, {
+ style: outputStyle,
+ importers: [
+ {
+ canonicalize: url => modules.find(m => m.key === url)?.url ?? null,
+ load: url => modules.find(m => m.url.href === url.href)?.module ?? null,
+ },
+ ],
+ })
+ // https://github.com/sass/dart-sass/issues/472
+ if (css.charCodeAt(0) === 0xfeff) {
+ css = css.slice(1)
+ }
+ return css
+ } catch (e) {
+ if (process.env.NODE_ENV === "development") {
+ console.log(data)
+ console.error(e.stack)
+ }
+ Object.defineProperty(e, "name", {
+ enumerable: true,
+ value: e.name || "Error",
+ })
+ throw clone(e)
+ }
+ }
+}
+
+function clone(e: any): any {
+ const keys = Reflect.ownKeys(e).concat(Reflect.ownKeys(Object.getPrototypeOf(e)))
+ return Object.fromEntries(
+ keys
+ .map(key => [key, e[key]])
+ .filter(([key, value]) => !key.startsWith("_") && typeof value !== "function")
+ .map(([key, value]) => [
+ key,
+ typeof value === "object" && value != null ? clone(value) : value,
+ ]),
+ )
+}
+
+interface Brand {
+ readonly brand: string
+ readonly version: string
+}
+
+interface NavigatorUAData {
+ readonly brands: Brand[]
+ readonly mobile: boolean
+ readonly platform: string
+}
+
+declare global {
+ interface Navigator {
+ readonly userAgentData: NavigatorUAData
+ }
+}
diff --git a/src/background/compilerBridge.ts b/src/background/compilerBridge.ts
new file mode 100644
index 0000000..6e2afa1
--- /dev/null
+++ b/src/background/compilerBridge.ts
@@ -0,0 +1,33 @@
+import { wrap } from "comlink"
+import { LRUCache } from "lru-cache"
+import type { OutputStyle } from "sass"
+import type { Compiler } from "./compiler"
+
+const worker = wrap(
+ new Worker(new URL("./compiler/compiler.js", import.meta.url).href, { type: "module" }),
+)
+
+const lru = new LRUCache({ max: 450 })
+
+export async function compileSASS(
+ source: string,
+ outputStyle: OutputStyle = "compressed",
+ insertCache = true,
+): Promise {
+ if (lru.has(source)) {
+ return lru.get(source)!
+ }
+
+ try {
+ const result = await worker.compileSASS(source, outputStyle)
+ if (insertCache) {
+ lru.set(source, result)
+ }
+ return result
+ } catch (e) {
+ if (process.env.NODE_ENV === "development") {
+ console.error(e.message)
+ }
+ throw e
+ }
+}
diff --git a/src/background/couchdb.ts b/src/background/couchdb.ts
new file mode 100644
index 0000000..16849fc
--- /dev/null
+++ b/src/background/couchdb.ts
@@ -0,0 +1,66 @@
+import PouchDB from "pouchdb-browser"
+import { LAST_SYNC, PASSWORD_KEY, USERNAME_KEY } from "~/shared/constants"
+import type { File } from "~/shared/models"
+
+export const localDb = new PouchDB("styles")
+export let remoteDb: PouchDB.Database | undefined
+let sync: PouchDB.Replication.Sync
+
+export function login(username: string, password: string) {
+ logout()
+
+ remoteDb = new PouchDB(process.env.NEXT_PUBLIC_SERVER_URL, {
+ auth: { username, password },
+ })
+ sync = localDb.sync(remoteDb, {
+ live: true,
+ retry: true,
+ })
+
+ void sync.on
+
+ void sync.on("change", () => {
+ localStorage.setItem(LAST_SYNC, new Date().toISOString())
+ })
+
+ return remoteDb
+}
+
+export function logout() {
+ if (remoteDb) {
+ sync!.cancel()
+ remoteDb = undefined
+ }
+}
+
+const username = localStorage.getItem(USERNAME_KEY)
+const password = localStorage.getItem(PASSWORD_KEY)
+
+if (username && password) {
+ void login(username, password)
+}
+
+export async function getDocs() {
+ const docs = await localDb.allDocs({ include_docs: true })
+ return docs.rows.map(row => row.doc!)
+}
+
+export async function deleteDoc(id: string) {
+ const doc = await localDb.get(id)
+ await localDb.remove(doc)
+}
+
+export async function exists(id: string) {
+ try {
+ await localDb.get(id)
+ return true
+ } catch (e) {
+ if ((e as Error).name === "not_found") {
+ return false
+ } else {
+ throw e
+ }
+ }
+}
+
+Object.assign(globalThis, { localDb, remoteDb })
diff --git a/src/background/graphql/.eslintrc b/src/background/graphql/.eslintrc
new file mode 100644
index 0000000..2a2773f
--- /dev/null
+++ b/src/background/graphql/.eslintrc
@@ -0,0 +1,7 @@
+{
+ "extends": "../../../.eslintrc",
+ "rules": {
+ "class-methods-use-this": "off",
+ "@typescript-eslint/consistent-type-imports": "off"
+ }
+}
diff --git a/src/background/graphql/api.ts b/src/background/graphql/api.ts
new file mode 100644
index 0000000..1ed53b5
--- /dev/null
+++ b/src/background/graphql/api.ts
@@ -0,0 +1,39 @@
+import type { TypedDocumentNode } from "@apollo/client"
+import { type DocumentNode, type ExecutionResult, execute, graphql } from "graphql"
+import { getSchema } from "./schema"
+
+const schema = getSchema()
+
+class GraphQLError extends Error {}
+
+export async function query>(
+ source: string,
+ variableValues: T extends TypedDocumentNode ? K : never = {} as any,
+): Promise ? K : never>> {
+ const result = await graphql({ schema, source, variableValues })
+ return result as any
+}
+
+async function executeNode(
+ document: DocumentNode,
+ variableValues: T extends TypedDocumentNode ? K : never = {} as any,
+): Promise ? K : never>> {
+ const result = await execute({ schema, document, variableValues })
+ return result as any
+}
+export { executeNode as execute }
+
+export async function queryOrThrow>(
+ source: string,
+ variableValues: T extends TypedDocumentNode ? K : never,
+): Promise ? K : never> {
+ const result = await graphql({ schema, source, variableValues })
+ if (result.data) {
+ return result.data as any
+ } else {
+ if (process.env.NODE_ENV === "development") {
+ console.error(result.errors)
+ }
+ throw new GraphQLError(result.errors?.[0].message)
+ }
+}
diff --git a/src/background/graphql/helpers.ts b/src/background/graphql/helpers.ts
new file mode 100644
index 0000000..b5c696b
--- /dev/null
+++ b/src/background/graphql/helpers.ts
@@ -0,0 +1,14 @@
+/* eslint-disable @typescript-eslint/no-unused-vars, class-methods-use-this, @typescript-eslint/consistent-type-imports */
+import type { ClassType } from "@aet/gql-tools/macro"
+import { AutoObjectType } from "@aet/gql-tools/macro"
+
+export function PaginatedResponse<_TItem extends object>(_TItem: ClassType<_TItem>) {
+ @AutoObjectType()
+ abstract class PaginatedResponseClass {
+ items!: _TItem[]
+ total!: number
+ hasMore!: boolean
+ }
+
+ return PaginatedResponseClass
+}
diff --git a/src/background/graphql/resolvers/CloudResolver.ts b/src/background/graphql/resolvers/CloudResolver.ts
new file mode 100644
index 0000000..d76495c
--- /dev/null
+++ b/src/background/graphql/resolvers/CloudResolver.ts
@@ -0,0 +1,64 @@
+import { Arg, AutoObjectType, Int, Mutation, Query, Resolver } from "@aet/gql-tools/macro"
+import { login, logout, remoteDb } from "../../couchdb"
+
+@AutoObjectType()
+class DatabaseInfo {
+ dbName!: string
+ diskFormatVersion?: Int
+ docCount!: Int
+ docDeleteCount?: Int
+ idbAttachmentFormat?: string
+ instantStartTime?: string
+ purgeSeq?: string
+ sizes?: DatabaseSize
+ sqlitePlugin?: boolean
+ updateSeq?: string
+}
+
+@AutoObjectType()
+class DatabaseSize {
+ active!: Int
+ external!: Int
+ file!: Int
+}
+
+@Resolver()
+export class CloudResolver {
+ @Query()
+ async remoteInfo(): Promise {
+ if (!remoteDb) return
+
+ try {
+ const info = await remoteDb.info()
+ return {
+ dbName: info.db_name,
+ diskFormatVersion: (info as any).disk_format_version,
+ docCount: info.doc_count,
+ docDeleteCount: (info as any).doc_del_count,
+ idbAttachmentFormat: info.idb_attachment_format,
+ instantStartTime: (info as any).instant_start_time,
+ purgeSeq: (info as any).purge_seq,
+ sizes: (info as any).sizes,
+ sqlitePlugin: info.sqlite_plugin,
+ updateSeq: String(info.update_seq),
+ }
+ } catch {}
+ }
+
+ @Mutation()
+ async login(@Arg() username: string, @Arg() password: string): Promise {
+ const db = login(username, password)
+ try {
+ await db.info()
+ return true
+ } catch {
+ return false
+ }
+ }
+
+ @Mutation()
+ logout(): boolean {
+ logout()
+ return true
+ }
+}
diff --git a/src/background/graphql/resolvers/DatabaseResolver.ts b/src/background/graphql/resolvers/DatabaseResolver.ts
new file mode 100644
index 0000000..0b89c2f
--- /dev/null
+++ b/src/background/graphql/resolvers/DatabaseResolver.ts
@@ -0,0 +1,64 @@
+import { Arg, Mutation, Query, Resolver } from "@aet/gql-tools/macro"
+import UAParser from "ua-parser-js"
+import { ClientMetadata, InputExportedV1 } from "~/shared/models/index"
+import { getDocs, localDb } from "../../couchdb"
+import { PreferencesCache } from "./PreferencesResolver"
+
+/**
+ * Handles exporting, importing and synchronizing the database and
+ * preferences.
+ */
+@Resolver()
+export class DatabaseResolver {
+ @Query()
+ async export(): Promise> {
+ const { clientName, ...preferences } = PreferencesCache.cache.get()
+ const files: InputExportedV1 = {
+ schema: 1,
+ files: await getDocs(),
+ source: clientName || getDefaultClientName(),
+ preferences,
+ }
+ return files
+ }
+
+ @Mutation()
+ async restore(@Arg() backup: InputExportedV1): Promise {
+ const { schema, files, preferences } = backup
+ switch (schema) {
+ case 1:
+ await Promise.all(
+ files.map(file =>
+ localDb.put({
+ _id: file.id,
+ ...file,
+ createdAt: new Date(file.createdAt).valueOf(),
+ updatedAt: new Date(file.updatedAt).valueOf(),
+ state: file.state ?? "None",
+ }),
+ ),
+ )
+ PreferencesCache.cache.set(preferences)
+ return true
+
+ default:
+ throw new Error("Unknown backup schema")
+ }
+ }
+
+ @Query()
+ clientMetadata(): ClientMetadata {
+ const parser = new UAParser(navigator.userAgent)
+ return {
+ browser: parser.getBrowser().name || "Unknown",
+ os: parser.getOS().name || "Unknown",
+ }
+ }
+}
+
+function getDefaultClientName() {
+ const parser = new UAParser(navigator.userAgent)
+ const browser = parser.getBrowser().name || "Unknown"
+ const os = parser.getOS().name || "Unknown"
+ return `${os} ${browser}`
+}
diff --git a/src/background/graphql/resolvers/FileResolver.ts b/src/background/graphql/resolvers/FileResolver.ts
new file mode 100644
index 0000000..fc5a69a
--- /dev/null
+++ b/src/background/graphql/resolvers/FileResolver.ts
@@ -0,0 +1,226 @@
+import {
+ Arg,
+ Args,
+ FieldResolver,
+ ID,
+ Int,
+ Mutation,
+ Query,
+ Resolver,
+ Root,
+} from "@aet/gql-tools/macro"
+import browser from "webextension-polyfill"
+import { customAlphabet } from "nanoid/non-secure"
+import { File, FileFilter, FindFilterArgs, PartialFileInput } from "~/shared/models/index"
+import { FileSortBy, FileState, fileMatches } from "~/shared/models/utils"
+import { statistics } from "../../idb"
+import { deleteDoc, exists, getDocs, localDb } from "../../couchdb"
+import { GLOBAL_STYLE_ID, isGlobalStyle } from "~/shared"
+import { broadcast } from "../utils"
+import { guessFileLanguage } from "../utils/guessLanguage"
+import { PreferencesCache } from "./PreferencesResolver"
+import { isFileLoggingDisabled } from "./StatisticsResolver"
+
+@Resolver(() => File)
+export class FileResolver {
+ private readonly nanoId = customAlphabet("1234567890abcdef", 24)
+
+ @Query()
+ async file(@Arg() id: ID): Promise {
+ return await localDb.get(id)
+ }
+
+ private static fileMatches(file: File, filter: FileFilter) {
+ // To add a filter: (filterExists && !filterMatchesFile) ||
+ return !(
+ (filter.enabled != null && file.enabled !== filter.enabled) ||
+ (filter.tags && !filter.tags.some(tag => file.tags.includes(tag))) ||
+ (filter.url != null && !fileMatches(file, filter.url)) ||
+ (filter.id?.length && !filter.id.includes(file.id)) ||
+ (filter.state != null && file.state !== filter.state) ||
+ (filter.isGlobal != null && isGlobalStyle(file) !== filter.isGlobal)
+ )
+ }
+
+ @Query()
+ async files(
+ @Args() { filter, take, sortBy, logQuery }: FindFilterArgs,
+ ): Promise {
+ let files = await getDocs()
+
+ if (filter) {
+ files = files.filter(file => FileResolver.fileMatches(file, filter))
+ }
+
+ if (take) {
+ files = files.slice(0, take)
+ }
+
+ switch (sortBy) {
+ case FileSortBy.Name:
+ files = files.sort((a, b) => a.name.localeCompare(b.name))
+ break
+ case FileSortBy.UpdatedAt:
+ files = files.sort((a, b) => b.updatedAt - a.updatedAt)
+ break
+
+ default:
+ // noop;
+ }
+
+ if (PreferencesCache.cache.get().recordUsageData && logQuery) {
+ files
+ .filter(file => !isFileLoggingDisabled(file.id))
+ .forEach(file => {
+ void statistics.set(file.id, { lastRequested: new Date() })
+ })
+ }
+
+ return files
+ }
+
+ async #newFile(input: PartialFileInput): Promise {
+ const id = this.nanoId()
+ const created = new Date()
+ const file = new File({
+ id,
+ name: input.name! || browser.i18n.getMessage("untitled"),
+ mimeType: "text/x-scss",
+ enabled: true,
+ tags: [],
+ createdAt: created,
+ updatedAt: created,
+ rules: [],
+ hidden: false,
+ state: FileState.None,
+ sections: [
+ {
+ id: this.nanoId(),
+ name: "",
+ code: "",
+ enabled: true,
+ },
+ ],
+ ...input,
+ })
+ await localDb.put({
+ _id: id,
+ ...file,
+ })
+ return file
+ }
+
+ @Mutation()
+ async newFile(@Arg() input: PartialFileInput): Promise {
+ const file = await this.#newFile(input)
+ void broadcast()
+ return file
+ }
+
+ @Mutation()
+ async createGlobalStyle(): Promise {
+ if (await exists(GLOBAL_STYLE_ID)) {
+ throw new Error("Global style already exists")
+ }
+
+ const created = new Date()
+ const file = new File({
+ id: GLOBAL_STYLE_ID,
+ name: "__global__",
+ enabled: true,
+ mimeType: "text/x-scss",
+ tags: ["global"],
+ createdAt: created,
+ updatedAt: created,
+ rules: [],
+ hidden: false,
+ state: FileState.None,
+ sections: [
+ {
+ id: this.nanoId(),
+ name: "",
+ code: "",
+ enabled: true,
+ },
+ ],
+ })
+ await localDb.put({
+ _id: GLOBAL_STYLE_ID,
+ ...file,
+ })
+ void broadcast()
+ return file
+ }
+
+ @Mutation()
+ async newFiles(@Arg() inputs: PartialFileInput[]): Promise {
+ const files = await Promise.all(inputs.map(input => this.newFile(input)))
+ void broadcast()
+ return files
+ }
+
+ @Mutation()
+ async deleteFile(@Arg() id: ID) {
+ await deleteDoc(id)
+ void broadcast()
+ return true
+ }
+
+ @Mutation()
+ async deleteFiles(@Arg() ids: ID[]) {
+ await Promise.all(ids.map(id => deleteDoc(id)))
+ void broadcast()
+ return true
+ }
+
+ @Mutation()
+ async setFile(@Arg() id: ID, @Arg() input: PartialFileInput): Promise {
+ const file = await setFile(id, input)
+ void broadcast()
+ return file
+ }
+
+ @Mutation()
+ async setFiles(@Arg() ids: ID[], @Arg() input: PartialFileInput): Promise {
+ const files = await Promise.all(ids.map(fileId => setFile(fileId, input)))
+ void broadcast()
+ return files
+ }
+
+ @Mutation()
+ async deleteAllFiles() {
+ await localDb.destroy()
+ void broadcast()
+ return true
+ }
+
+ @FieldResolver()
+ nameLanguage(@Root() file: File): string | undefined {
+ return guessFileLanguage(file)
+ }
+
+ @FieldResolver()
+ lastRequestedAt(@Root() file: File): Date | undefined {
+ return statistics.get(file.id)?.lastRequested
+ }
+
+ @FieldResolver()
+ size(@Root() file: File): Int {
+ return file.sections.reduce((acc, section) => acc + section.code.length, 0)
+ }
+}
+
+export async function setFile(id: ID, input: PartialFileInput): Promise {
+ const existing = await localDb.get(id)!
+ const now = new Date()
+
+ const file = new File({
+ ...existing,
+ ...(input as Partial),
+ updatedAt: now,
+ })
+
+ await localDb.put(file)
+
+ return file
+}
diff --git a/src/background/graphql/resolvers/FindResolver.ts b/src/background/graphql/resolvers/FindResolver.ts
new file mode 100644
index 0000000..17ca4ba
--- /dev/null
+++ b/src/background/graphql/resolvers/FindResolver.ts
@@ -0,0 +1,108 @@
+import { Arg, Query, Resolver } from "@aet/gql-tools/macro"
+import { Match } from "~/shared/models/index"
+import { getDocs } from "~/background/couchdb"
+
+@Resolver()
+export class FindResolver {
+ @Query()
+ async search(
+ @Arg() query: string,
+ @Arg() caseSensitive = false,
+ @Arg() regExp: boolean,
+ ): Promise {
+ if (!query) {
+ return []
+ }
+
+ if (regExp) {
+ return searchRegExp(query)
+ }
+
+ const files = await getDocs()
+ const matches: Match[] = []
+
+ const searchText = caseSensitive ? query : query.toLocaleUpperCase()
+
+ for (const file of files) {
+ const content = file.sections[0].code
+ let prevIndex: number | null | undefined
+
+ // https://stackoverflow.com/questions/69060325
+ const searchFrom = caseSensitive ? content : content.toLocaleUpperCase()
+
+ while (prevIndex !== null) {
+ if (matches.length > 100) {
+ return matches
+ }
+
+ const index = stripInvalid(
+ searchFrom.indexOf(searchText, prevIndex ? prevIndex + 1 : 0),
+ )
+ prevIndex = index
+ if (index == null) continue
+
+ const { line, start } = getLineAround(content, index)
+
+ matches.push({
+ file,
+ line,
+ index,
+ submatch: {
+ match: content.slice(index, index + searchText.length),
+ start: index - start,
+ end: index - start + query.length,
+ },
+ })
+ await (0 as any)
+ }
+ }
+
+ return matches
+ }
+}
+
+function stripInvalid(index: number) {
+ return index === -1 ? null : index
+}
+
+function getLineAround(text: string, index: number) {
+ const start = stripInvalid(text.lastIndexOf("\n", index)) ?? 0
+ const end = stripInvalid(text.indexOf("\n", index)) ?? text.length
+ return {
+ start,
+ line: text.substring(start, end),
+ }
+}
+
+async function searchRegExp(query: string): Promise {
+ const files = await getDocs()
+ const matches: Match[] = []
+ const regexp = new RegExp(query, "g")
+
+ for (const file of files) {
+ const content = file.sections[0].code
+ const prevIndex: number | null = null
+
+ while (prevIndex != null) {
+ for (const matched of content.matchAll(regexp)) {
+ if (matched.index == null) continue
+ const { index } = matched
+
+ const { line, start } = getLineAround(content, index)
+ matches.push({
+ file,
+ line,
+ index,
+ submatch: {
+ match: matched[0],
+ start: index - start,
+ end: index - start + matched[0].length,
+ },
+ })
+ }
+ await (0 as any)
+ }
+ }
+
+ return matches
+}
diff --git a/src/background/graphql/resolvers/PreferencesResolver.ts b/src/background/graphql/resolvers/PreferencesResolver.ts
new file mode 100644
index 0000000..7ec0e6a
--- /dev/null
+++ b/src/background/graphql/resolvers/PreferencesResolver.ts
@@ -0,0 +1,63 @@
+import { Arg, Mutation, Query, Resolver } from "@aet/gql-tools/macro"
+import { InputPreferences, Preferences, defaultPreferences } from "~/shared/models/index"
+import { broadcast } from "../utils"
+
+const PREFS_KEY = "preferences"
+
+@Resolver(() => Preferences)
+export class PreferencesResolver {
+ @Query()
+ preferences(): Preferences {
+ return PreferencesCache.cache.get()
+ }
+
+ @Mutation()
+ setPreferences(@Arg() preferences: InputPreferences): Preferences {
+ return PreferencesCache.cache.set(preferences)
+ }
+}
+
+export class PreferencesCache {
+ private data: Preferences
+ private static _instance: PreferencesCache
+
+ static get cache(): PreferencesCache {
+ return (this._instance ??= new PreferencesCache())
+ }
+
+ constructor() {
+ const text = localStorage.getItem(PREFS_KEY)!
+ const prefs = new Preferences({ ...defaultPreferences })
+ Object.assign(prefs, JSON.parse(text))
+ this.data = prefs
+ }
+
+ get(): Preferences {
+ return this.data
+ }
+
+ set(preferences: Partial): Preferences {
+ Object.assign(this.data, stripUndefined(preferences))
+ if ("enabled" in preferences) {
+ broadcast()
+ }
+ localStorage.setItem(PREFS_KEY, JSON.stringify(this.data))
+ return this.data
+ }
+}
+
+export function getPreference(
+ key: K,
+): Preferences[K] | undefined {
+ try {
+ const text = localStorage.getItem(PREFS_KEY)!
+ const prefs = JSON.parse(text)
+ return prefs[key]
+ } catch {}
+}
+
+function stripUndefined(obj: T): Partial {
+ return Object.fromEntries(
+ Object.entries(obj).filter(([, value]) => value !== undefined),
+ ) as T
+}
diff --git a/src/background/graphql/resolvers/SectionResolver.ts b/src/background/graphql/resolvers/SectionResolver.ts
new file mode 100644
index 0000000..0b1bc10
--- /dev/null
+++ b/src/background/graphql/resolvers/SectionResolver.ts
@@ -0,0 +1,117 @@
+import {
+ Arg,
+ Args,
+ ArgsType,
+ Field,
+ FieldResolver,
+ Query,
+ Resolver,
+ Root,
+} from "@aet/gql-tools/macro"
+import { GraphQLError } from "graphql"
+import { Section } from "~/shared/models/index"
+import { compileSASS } from "../../compilerBridge"
+import { GLOBAL_STYLE_ID } from "~/shared"
+import { localDb } from "~/background/couchdb"
+
+@ArgsType()
+class CompileCode {
+ @Field() code!: string
+ @Field() includeGlobal!: boolean
+ @Field() compressed!: boolean
+ @Field() cache!: boolean
+}
+
+@Resolver(() => Section)
+export class SectionResolver {
+ @FieldResolver()
+ async compiledCode(@Root() section: Section, @Arg() cache = true): Promise {
+ return this.compileCode({
+ code: section.code,
+ includeGlobal: true,
+ compressed: true,
+ cache,
+ })
+ }
+
+ @Query()
+ async compileCode(
+ @Args() { code, includeGlobal, compressed, cache }: CompileCode,
+ ): Promise {
+ let prefix = ""
+ if (includeGlobal) {
+ const style = await localDb.get(GLOBAL_STYLE_ID)
+ const globalStyle =
+ style?.state === null && style?.enabled && style?.sections[0].code
+ prefix = globalStyle ? globalStyle + "\n" : ""
+ }
+
+ const source = prefix + code
+ try {
+ return await compileSASS(source, compressed ? "compressed" : "expanded", cache)
+ } catch (e) {
+ if (e?.name !== "Error") {
+ throw e
+ }
+
+ throw new GraphQLError(e.message, {
+ extensions: getErrorExtension(e as SassException),
+ })
+ }
+ }
+}
+
+export type ErrorExtension = ReturnType
+
+function getErrorExtension(e: SassException) {
+ return {
+ code: "BAD_USER_INPUT" as const,
+ span: {
+ start: {
+ line: e.span.start.line,
+ column: e.span.start.column,
+ offset: e.span.start.offset,
+ },
+ end: {
+ line: e.span.end.line,
+ column: e.span.end.column,
+ offset: e.span.end.offset,
+ },
+ },
+ }
+}
+
+interface SourceFile {
+ url: null
+ _cachedLine: null
+ _decodedChars: Uint32Array
+ _lineStarts: number[]
+}
+
+interface FileLocation {
+ file: SourceFile
+ offset: number
+ column: number
+ line: number
+}
+
+interface FileSpan {
+ _end: number
+ _file$_start: number
+ context: string
+ end: FileLocation
+ file: SourceFile
+ start: FileLocation
+ text: string
+ url: null
+}
+
+interface SassException extends Error {
+ _dartException: {
+ _span: FileSpan
+ _span_exception$_message: string
+ }
+ sassMessage: string
+ sassStack: string
+ span: FileSpan
+}
diff --git a/src/background/graphql/resolvers/StatisticsResolver.ts b/src/background/graphql/resolvers/StatisticsResolver.ts
new file mode 100644
index 0000000..8c43fa2
--- /dev/null
+++ b/src/background/graphql/resolvers/StatisticsResolver.ts
@@ -0,0 +1,31 @@
+import { Arg, FieldResolver, ID, Mutation, Resolver, Root } from "@aet/gql-tools/macro"
+import { statistics } from "../../idb"
+import { File } from "~/shared/models"
+
+@Resolver(() => File)
+export class StatisticsResolver {
+ @Mutation()
+ async toggleDisableLogging(@Arg() fileId: ID, @Arg() value: boolean) {
+ await statistics.update(fileId, data => ({ ...data, disableLogging: value }))
+ return true
+ }
+
+ @Mutation()
+ async resetUsageData(@Arg() fileId?: ID) {
+ if (fileId == null) {
+ await statistics.clear()
+ } else {
+ await statistics.update(fileId, data => ({ ...data, lastRequested: undefined }))
+ }
+ return true
+ }
+
+ @FieldResolver()
+ disabledLogging(@Root() file: File): boolean {
+ return isFileLoggingDisabled(file.id)
+ }
+}
+
+export function isFileLoggingDisabled(fileId: ID) {
+ return statistics.get(fileId)?.disableLogging || false
+}
diff --git a/src/background/graphql/resolvers/TagResolver.ts b/src/background/graphql/resolvers/TagResolver.ts
new file mode 100644
index 0000000..3ae453f
--- /dev/null
+++ b/src/background/graphql/resolvers/TagResolver.ts
@@ -0,0 +1,37 @@
+import { Arg, Mutation, Query, Resolver } from "@aet/gql-tools/macro"
+import { File } from "~/shared/models/index"
+import { getDocs } from "../../couchdb"
+import { setFile } from "./FileResolver"
+
+@Resolver()
+export class TagResolver {
+ @Query()
+ async tags(): Promise {
+ const files = await getDocs()
+ return Array.from(new Set(files.flatMap(s => s.tags)))
+ }
+
+ @Mutation()
+ async deleteTag(@Arg() tag: string): Promise {
+ return Promise.all(
+ (await getDocs())
+ .filter(file => file.tags.includes(tag))
+ .map(file => {
+ const tags = file.tags.filter(t => t !== tag)
+ return setFile(file.id, { tags })
+ }),
+ )
+ }
+
+ @Mutation()
+ async renameTag(@Arg() oldTag: string, @Arg() newTag: string): Promise {
+ return Promise.all(
+ (await getDocs())
+ .filter(file => file.tags.includes(oldTag))
+ .map(file => {
+ const tags = file.tags.map(tag => (tag === oldTag ? newTag : tag))
+ return setFile(file.id, { tags })
+ }),
+ )
+ }
+}
diff --git a/src/background/graphql/schema.ts b/src/background/graphql/schema.ts
new file mode 100644
index 0000000..ae149c2
--- /dev/null
+++ b/src/background/graphql/schema.ts
@@ -0,0 +1,28 @@
+import "reflect-metadata"
+import type { GraphQLSchema } from "graphql"
+import { buildSchema } from "@aet/gql-tools/macro"
+import { FileResolver } from "./resolvers/FileResolver"
+import { SectionResolver } from "./resolvers/SectionResolver"
+import { FindResolver } from "./resolvers/FindResolver"
+import { PreferencesResolver } from "./resolvers/PreferencesResolver"
+import { DatabaseResolver } from "./resolvers/DatabaseResolver"
+import { TagResolver } from "./resolvers/TagResolver"
+import { StatisticsResolver } from "./resolvers/StatisticsResolver"
+import { CloudResolver } from "./resolvers/CloudResolver"
+
+export function getSchema(): GraphQLSchema {
+ return buildSchema({
+ validate: process.env.NODE_ENV !== "production",
+ disableInferringDefaultValues: true,
+ resolvers: [
+ DatabaseResolver,
+ FindResolver,
+ PreferencesResolver,
+ SectionResolver,
+ FileResolver,
+ TagResolver,
+ StatisticsResolver,
+ CloudResolver,
+ ],
+ })
+}
diff --git a/src/background/graphql/utils.ts b/src/background/graphql/utils.ts
new file mode 100644
index 0000000..337854c
--- /dev/null
+++ b/src/background/graphql/utils.ts
@@ -0,0 +1,12 @@
+import browser from "webextension-polyfill"
+import { debounce, flatMap } from "lodash"
+import { updateTabIcons } from "../update"
+
+export const broadcast = debounce(async () => {
+ const tabs = flatMap(
+ await browser.windows.getAll({ populate: true }),
+ window => window.tabs!,
+ )
+ tabs.forEach(tab => updateTabIcons({ ...tab, tabId: tab.id! }))
+ tabs.forEach(tab => browser.tabs.sendMessage(tab.id!, { method: "fileUpdated" }))
+}, 100)
diff --git a/src/background/graphql/utils/guessLanguage.ts b/src/background/graphql/utils/guessLanguage.ts
new file mode 100644
index 0000000..b352894
--- /dev/null
+++ b/src/background/graphql/utils/guessLanguage.ts
@@ -0,0 +1,71 @@
+import sc from "./lang-sc.json" assert { type: "json" }
+import shin from "./lang-shin.json" assert { type: "json" }
+import type { Rule } from "~/shared/models"
+import { RuleType } from "~/shared/models/enums.generated"
+
+const AZ = /^[A-Za-zÀ-ÖØ-öø-ÿ\d ]+$/
+
+// Handles Han unification font problems
+export function guessFileLanguage({ name, rules }: { name: string; rules: Rule[] }) {
+ const chars = name.split("")
+
+ // Fast path
+ if (AZ.test(name)) {
+ return
+ }
+
+ // Check if the name contains Japanese kana characters
+ if (
+ /\p{Script_Extensions=Kana}/u.test(name) ||
+ /\p{Script_Extensions=Hira}/u.test(name) ||
+ chars.some(c => shin.includes(c))
+ ) {
+ return "ja"
+ }
+
+ // Check if the name contains Korean hangul
+ if (/\p{Script_Extensions=Hang}/u.test(name)) {
+ return "ko"
+ }
+
+ // Check if the name contains Simplified Chinese characters
+ if (chars.some(c => sc.includes(c))) {
+ return "zh-CN"
+ }
+
+ const domains = rules
+ .map(r => {
+ try {
+ return r.type === RuleType.Domain
+ ? r.value
+ : r.type === RuleType.URL
+ ? new URL(r.value).hostname
+ : r.type === RuleType.URLPrefix
+ ? new URL(r.value).hostname
+ : null
+ } catch {
+ return null
+ }
+ })
+ .filter(Boolean)
+
+ // Check the domains for TLDs that correspond to a specific language
+ for (const domain of domains) {
+ if (domain.endsWith(".cn")) {
+ return "zh-CN"
+ }
+ if (domain.endsWith(".hk")) {
+ return "zh-HK"
+ }
+ if (domain.endsWith(".tw")) {
+ return "zh-TW"
+ }
+ if (domain.endsWith(".jp")) {
+ return "ja"
+ }
+ }
+
+ if (/\p{Script_Extensions=Hani}/u.test(name)) {
+ return "zh-TW"
+ }
+}
diff --git a/src/background/graphql/utils/lang-sc.json b/src/background/graphql/utils/lang-sc.json
new file mode 100644
index 0000000..44be8ab
--- /dev/null
+++ b/src/background/graphql/utils/lang-sc.json
@@ -0,0 +1,1634 @@
+[
+ "匀",
+ "吊",
+ "户",
+ "册",
+ "泛",
+ "丢",
+ "亘",
+ "凶",
+ "夫",
+ "咤",
+ "污",
+ "伫",
+ "别",
+ "占",
+ "吴",
+ "删",
+ "吕",
+ "兑",
+ "囱",
+ "夹",
+ "妆",
+ "决",
+ "冲",
+ "秃",
+ "灾",
+ "贝",
+ "车",
+ "迤",
+ "见",
+ "两",
+ "并",
+ "并",
+ "仑",
+ "亚",
+ "协",
+ "儿",
+ "恤",
+ "姗",
+ "佛",
+ "冈",
+ "东",
+ "抛",
+ "殁",
+ "况",
+ "卧",
+ "珏",
+ "纠",
+ "芈",
+ "轧",
+ "系",
+ "兖",
+ "侠",
+ "长",
+ "门",
+ "侣",
+ "克",
+ "则",
+ "劲",
+ "侄",
+ "奸",
+ "奂",
+ "尸",
+ "帅",
+ "后",
+ "拐",
+ "汹",
+ "为",
+ "栅",
+ "抵",
+ "杯",
+ "纣",
+ "红",
+ "纪",
+ "纫",
+ "纥",
+ "约",
+ "苎",
+ "计",
+ "订",
+ "讣",
+ "贞",
+ "负",
+ "军",
+ "轨",
+ "俩",
+ "页",
+ "风",
+ "飞",
+ "们",
+ "伥",
+ "闩",
+ "仿",
+ "个",
+ "韦",
+ "幸",
+ "伦",
+ "仓",
+ "冻",
+ "刚",
+ "员",
+ "娱",
+ "剥",
+ "孙",
+ "岛",
+ "师",
+ "宫",
+ "库",
+ "耻",
+ "书",
+ "气",
+ "时",
+ "乌",
+ "泾",
+ "狈",
+ "疱",
+ "佩",
+ "亩",
+ "纷",
+ "纺",
+ "纱",
+ "纹",
+ "纯",
+ "纽",
+ "纰",
+ "级",
+ "纭",
+ "胁",
+ "纳",
+ "纸",
+ "脉",
+ "兹",
+ "刍",
+ "荆",
+ "记",
+ "讦",
+ "讨",
+ "讧",
+ "讪",
+ "讯",
+ "托",
+ "训",
+ "讫",
+ "岂",
+ "财",
+ "贡",
+ "钉",
+ "针",
+ "轩",
+ "钊",
+ "轫",
+ "闪",
+ "阵",
+ "乃",
+ "陕",
+ "回",
+ "只",
+ "饥",
+ "马",
+ "斗",
+ "干",
+ "咱",
+ "伪",
+ "伟",
+ "侦",
+ "侧",
+ "哑",
+ "坚",
+ "垩",
+ "务",
+ "动",
+ "问",
+ "执",
+ "念",
+ "够",
+ "娄",
+ "衔",
+ "妇",
+ "张",
+ "强",
+ "峥",
+ "昆",
+ "雕",
+ "仑",
+ "从",
+ "带",
+ "帐",
+ "专",
+ "屉",
+ "凄",
+ "怅",
+ "舍",
+ "扫",
+ "败",
+ "挂",
+ "启",
+ "扪",
+ "抡",
+ "斩",
+ "挣",
+ "采",
+ "卷",
+ "弃",
+ "栀",
+ "勖",
+ "枭",
+ "杀",
+ "氢",
+ "杆",
+ "凉",
+ "渊",
+ "捆",
+ "凄",
+ "泪",
+ "狰",
+ "沦",
+ "净",
+ "现",
+ "璃",
+ "众",
+ "产",
+ "牵",
+ "朱",
+ "毕",
+ "异",
+ "细",
+ "绅",
+ "组",
+ "终",
+ "钵",
+ "荚",
+ "习",
+ "绊",
+ "弦",
+ "统",
+ "庄",
+ "扎",
+ "绍",
+ "唇",
+ "绋",
+ "绌",
+ "贫",
+ "处",
+ "觅",
+ "规",
+ "访",
+ "轭",
+ "讶",
+ "软",
+ "诀",
+ "这",
+ "讷",
+ "许",
+ "设",
+ "讼",
+ "连",
+ "讹",
+ "术",
+ "衮",
+ "贩",
+ "迳",
+ "责",
+ "贯",
+ "货",
+ "贪",
+ "伧",
+ "伞",
+ "凯",
+ "顶",
+ "剀",
+ "顷",
+ "创",
+ "钗",
+ "鱼",
+ "扣",
+ "鸟",
+ "劳",
+ "钓",
+ "胜",
+ "钏",
+ "勋",
+ "闭",
+ "家",
+ "陈",
+ "陆",
+ "阴",
+ "备",
+ "杰",
+ "围",
+ "尧",
+ "丧",
+ "场",
+ "寻",
+ "报",
+ "岚",
+ "单",
+ "壶",
+ "帧",
+ "哟",
+ "几",
+ "唤",
+ "厕",
+ "乔",
+ "厢",
+ "复",
+ "换",
+ "恶",
+ "扬",
+ "闷",
+ "拣",
+ "惬",
+ "恻",
+ "恼",
+ "挥",
+ "涌",
+ "凑",
+ "减",
+ "枣",
+ "钦",
+ "栋",
+ "壳",
+ "栈",
+ "涡",
+ "汤",
+ "栖",
+ "测",
+ "珐",
+ "发",
+ "浑",
+ "涣",
+ "困",
+ "无",
+ "苏",
+ "砚",
+ "秆",
+ "犹",
+ "痉",
+ "丝",
+ "络",
+ "烟",
+ "给",
+ "绚",
+ "笔",
+ "肃",
+ "华",
+ "笋",
+ "庵",
+ "莱",
+ "肾",
+ "绞",
+ "胀",
+ "结",
+ "绒",
+ "绝",
+ "评",
+ "贵",
+ "词",
+ "买",
+ "证",
+ "贬",
+ "诂",
+ "贸",
+ "诏",
+ "贷",
+ "诅",
+ "诈",
+ "诋",
+ "诉",
+ "诊",
+ "贮",
+ "贴",
+ "贰",
+ "贻",
+ "视",
+ "贲",
+ "轲",
+ "注",
+ "费",
+ "轴",
+ "咏",
+ "贺",
+ "轶",
+ "闵",
+ "闰",
+ "开",
+ "周",
+ "闲",
+ "间",
+ "进",
+ "闲",
+ "队",
+ "邮",
+ "阶",
+ "乡",
+ "阳",
+ "钞",
+ "钙",
+ "钮",
+ "钠",
+ "钧",
+ "钝",
+ "隽",
+ "钤",
+ "云",
+ "韧",
+ "项",
+ "顺",
+ "须",
+ "饪",
+ "饭",
+ "饨",
+ "饮",
+ "饬",
+ "冯",
+ "驭",
+ "佣",
+ "债",
+ "涂",
+ "冢",
+ "传",
+ "吗",
+ "仅",
+ "倾",
+ "啬",
+ "伤",
+ "块",
+ "坞",
+ "偬",
+ "呜",
+ "铲",
+ "呛",
+ "剿",
+ "妈",
+ "园",
+ "媪",
+ "势",
+ "圆",
+ "汇",
+ "损",
+ "抢",
+ "栗",
+ "摇",
+ "干",
+ "愠",
+ "捣",
+ "忾",
+ "厦",
+ "怆",
+ "汇",
+ "彷",
+ "晖",
+ "榨",
+ "晕",
+ "业",
+ "爱",
+ "极",
+ "烦",
+ "炼",
+ "杨",
+ "沟",
+ "桢",
+ "灭",
+ "炀",
+ "枫",
+ "焕",
+ "爷",
+ "岁",
+ "毁",
+ "准",
+ "狮",
+ "沧",
+ "琅",
+ "烟",
+ "珲",
+ "睐",
+ "棱",
+ "睁",
+ "禀",
+ "痹",
+ "节",
+ "盏",
+ "粤",
+ "经",
+ "绢",
+ "莴",
+ "捆",
+ "脚",
+ "绑",
+ "肿",
+ "绥",
+ "虏",
+ "脑",
+ "义",
+ "羡",
+ "荤",
+ "圣",
+ "苇",
+ "蜕",
+ "叶",
+ "肠",
+ "话",
+ "诛",
+ "补",
+ "诡",
+ "询",
+ "诠",
+ "里",
+ "诟",
+ "袅",
+ "较",
+ "载",
+ "诧",
+ "轼",
+ "该",
+ "贼",
+ "轾",
+ "详",
+ "资",
+ "试",
+ "贾",
+ "农",
+ "诗",
+ "贿",
+ "运",
+ "诘",
+ "赀",
+ "游",
+ "夸",
+ "赁",
+ "诙",
+ "赂",
+ "诣",
+ "赅",
+ "达",
+ "诚",
+ "迹",
+ "违",
+ "铀",
+ "铅",
+ "刨",
+ "钩",
+ "过",
+ "铂",
+ "铃",
+ "闸",
+ "邹",
+ "陨",
+ "电",
+ "钴",
+ "钳",
+ "钹",
+ "钚",
+ "钾",
+ "预",
+ "顽",
+ "顿",
+ "顼",
+ "颁",
+ "颂",
+ "饲",
+ "饴",
+ "饱",
+ "饰",
+ "驰",
+ "驮",
+ "驯",
+ "鸠",
+ "呕",
+ "伙",
+ "侥",
+ "叹",
+ "梦",
+ "喽",
+ "夺",
+ "奁",
+ "仆",
+ "啧",
+ "侨",
+ "雇",
+ "妪",
+ "团",
+ "图",
+ "划",
+ "尘",
+ "匮",
+ "厌",
+ "宁",
+ "垫",
+ "堑",
+ "尝",
+ "实",
+ "殷",
+ "态",
+ "对",
+ "畅",
+ "屡",
+ "惯",
+ "崭",
+ "恸",
+ "岖",
+ "惭",
+ "币",
+ "荣",
+ "帼",
+ "杠",
+ "构",
+ "搂",
+ "别",
+ "折",
+ "掴",
+ "彻",
+ "枪",
+ "渐",
+ "涨",
+ "氲",
+ "涟",
+ "滚",
+ "沪",
+ "渔",
+ "渗",
+ "渍",
+ "涤",
+ "汉",
+ "满",
+ "尔",
+ "荦",
+ "狱",
+ "琐",
+ "玛",
+ "疟",
+ "疡",
+ "疯",
+ "愈",
+ "痪",
+ "监",
+ "笺",
+ "筝",
+ "硕",
+ "祯",
+ "绽",
+ "祸",
+ "绾",
+ "种",
+ "综",
+ "绰",
+ "洼",
+ "绫",
+ "窝",
+ "绿",
+ "紧",
+ "缀",
+ "网",
+ "纲",
+ "绮",
+ "绸",
+ "绵",
+ "彩",
+ "纶",
+ "维",
+ "绪",
+ "缁",
+ "罚",
+ "闻",
+ "搜",
+ "苍",
+ "席",
+ "蚀",
+ "莅",
+ "盖",
+ "制",
+ "荪",
+ "诵",
+ "志",
+ "语",
+ "诬",
+ "认",
+ "诫",
+ "误",
+ "说",
+ "诰",
+ "诲",
+ "诱",
+ "诳",
+ "狸",
+ "宾",
+ "赈",
+ "赊",
+ "铰",
+ "赵",
+ "铐",
+ "赶",
+ "银",
+ "局",
+ "铜",
+ "辅",
+ "铭",
+ "辄",
+ "铢",
+ "轻",
+ "铬",
+ "挽",
+ "铨",
+ "衔",
+ "远",
+ "阂",
+ "闺",
+ "逊",
+ "闽",
+ "阁",
+ "阀",
+ "递",
+ "合",
+ "际",
+ "颇",
+ "领",
+ "飒",
+ "饺",
+ "饼",
+ "饵",
+ "饷",
+ "驳",
+ "肮",
+ "鸣",
+ "鸢",
+ "厉",
+ "凤",
+ "唠",
+ "么",
+ "齐",
+ "亿",
+ "哗",
+ "仪",
+ "嘘",
+ "价",
+ "喷",
+ "侬",
+ "侩",
+ "啸",
+ "俭",
+ "叽",
+ "凛",
+ "剧",
+ "刘",
+ "坟",
+ "剑",
+ "坠",
+ "娴",
+ "婵",
+ "妩",
+ "娇",
+ "宽",
+ "审",
+ "层",
+ "帜",
+ "废",
+ "厨",
+ "庙",
+ "厮",
+ "广",
+ "厂",
+ "弹",
+ "惮",
+ "抚",
+ "愤",
+ "捻",
+ "征",
+ "敌",
+ "庆",
+ "挚",
+ "虑",
+ "暂",
+ "扑",
+ "忧",
+ "捞",
+ "样",
+ "戚",
+ "撑",
+ "椁",
+ "怂",
+ "拨",
+ "桩",
+ "欲",
+ "挠",
+ "标",
+ "怜",
+ "悯",
+ "桨",
+ "乐",
+ "溃",
+ "枞",
+ "润",
+ "疮",
+ "涧",
+ "皑",
+ "殇",
+ "皱",
+ "盘",
+ "浆",
+ "热",
+ "眯",
+ "泼",
+ "牦",
+ "奖",
+ "洁",
+ "确",
+ "浇",
+ "莹",
+ "码",
+ "纬",
+ "肤",
+ "致",
+ "缄",
+ "谷",
+ "缅",
+ "缉",
+ "莲",
+ "编",
+ "缘",
+ "荫",
+ "窑",
+ "缐",
+ "穷",
+ "缎",
+ "缓",
+ "蒋",
+ "缍",
+ "范",
+ "骂",
+ "卜",
+ "罢",
+ "葱",
+ "缔",
+ "练",
+ "胶",
+ "虾",
+ "课",
+ "蜗",
+ "诿",
+ "虱",
+ "谄",
+ "调",
+ "谁",
+ "论",
+ "卫",
+ "诤",
+ "冲",
+ "竖",
+ "复",
+ "赔",
+ "赏",
+ "谊",
+ "赋",
+ "谅",
+ "贱",
+ "谈",
+ "账",
+ "谆",
+ "赌",
+ "诞",
+ "贤",
+ "请",
+ "卖",
+ "诸",
+ "赐",
+ "质",
+ "碰",
+ "辉",
+ "辆",
+ "辍",
+ "辈",
+ "辇",
+ "轮",
+ "辎",
+ "适",
+ "锐",
+ "锉",
+ "锋",
+ "闾",
+ "迁",
+ "阅",
+ "邻",
+ "郑",
+ "邓",
+ "腌",
+ "巩",
+ "锌",
+ "颉",
+ "锑",
+ "刮",
+ "销",
+ "养",
+ "铺",
+ "饿",
+ "锄",
+ "馁",
+ "铝",
+ "驼",
+ "驻",
+ "驷",
+ "驶",
+ "驽",
+ "驾",
+ "驹",
+ "驸",
+ "发",
+ "闹",
+ "鱿",
+ "鲁",
+ "鸩",
+ "鸦",
+ "麸",
+ "齿",
+ "俦",
+ "傧",
+ "剂",
+ "吨",
+ "惫",
+ "懔",
+ "哝",
+ "忆",
+ "嗳",
+ "战",
+ "垦",
+ "坛",
+ "拥",
+ "挡",
+ "奋",
+ "挞",
+ "袅",
+ "据",
+ "掳",
+ "导",
+ "择",
+ "宪",
+ "凭",
+ "捡",
+ "机",
+ "历",
+ "烫",
+ "历",
+ "焖",
+ "晓",
+ "淀",
+ "焰",
+ "浓",
+ "朴",
+ "泽",
+ "桦",
+ "浊",
+ "玑",
+ "瓯",
+ "树",
+ "炽",
+ "卢",
+ "椭",
+ "炖",
+ "磷",
+ "桥",
+ "烧",
+ "瞒",
+ "缣",
+ "砖",
+ "萦",
+ "缚",
+ "御",
+ "县",
+ "积",
+ "颖",
+ "稣",
+ "窥",
+ "腻",
+ "蓑",
+ "筑",
+ "笃",
+ "兴",
+ "箬",
+ "舱",
+ "筛",
+ "缢",
+ "荡",
+ "萧",
+ "芜",
+ "蚂",
+ "萤",
+ "裤",
+ "亲",
+ "觎",
+ "谛",
+ "谚",
+ "谏",
+ "讳",
+ "辐",
+ "谋",
+ "辑",
+ "谍",
+ "输",
+ "谐",
+ "谘",
+ "办",
+ "诺",
+ "谒",
+ "谓",
+ "选",
+ "讽",
+ "迟",
+ "谕",
+ "辽",
+ "遗",
+ "猫",
+ "赖",
+ "锭",
+ "表",
+ "锯",
+ "踊",
+ "锰",
+ "错",
+ "钱",
+ "钢",
+ "锡",
+ "录",
+ "铮",
+ "锥",
+ "锦",
+ "阎",
+ "险",
+ "沾",
+ "䩄",
+ "颊",
+ "哄",
+ "颈",
+ "鲍",
+ "频",
+ "鸵",
+ "颔",
+ "鸪",
+ "头",
+ "鸯",
+ "颓",
+ "鸭",
+ "颐",
+ "鸰",
+ "鸳",
+ "馆",
+ "饯",
+ "馄",
+ "龙",
+ "馅",
+ "龟",
+ "骇",
+ "骈",
+ "优",
+ "骆",
+ "偿",
+ "储",
+ "咛",
+ "尝",
+ "吓",
+ "压",
+ "婴",
+ "嫔",
+ "嬷",
+ "尴",
+ "屿",
+ "岭",
+ "帮",
+ "档",
+ "应",
+ "恳",
+ "检",
+ "桧",
+ "戏",
+ "栉",
+ "殓",
+ "泞",
+ "击",
+ "滨",
+ "济",
+ "挤",
+ "拧",
+ "蒙",
+ "涛",
+ "拟",
+ "滥",
+ "搁",
+ "敛",
+ "涩",
+ "毙",
+ "浚",
+ "暧",
+ "营",
+ "灿",
+ "烛",
+ "毁",
+ "烩",
+ "墙",
+ "狞",
+ "获",
+ "环",
+ "瑷",
+ "痨",
+ "疗",
+ "荡",
+ "粪",
+ "了",
+ "矫",
+ "缩",
+ "绩",
+ "缪",
+ "缕",
+ "矶",
+ "缧",
+ "绷",
+ "缝",
+ "总",
+ "纵",
+ "缫",
+ "篓",
+ "聪",
+ "联",
+ "耸",
+ "脓",
+ "脸",
+ "脍",
+ "临",
+ "举",
+ "艰",
+ "姜",
+ "褛",
+ "蔷",
+ "觊",
+ "谜",
+ "谤",
+ "谦",
+ "亏",
+ "讲",
+ "谎",
+ "谣",
+ "谢",
+ "誊",
+ "溪",
+ "蝼",
+ "赚",
+ "赛",
+ "蝈",
+ "购",
+ "趋",
+ "亵",
+ "辖",
+ "辗",
+ " ",
+ "辕",
+ "舆",
+ "还",
+ "迈",
+ "酝",
+ "丑",
+ "镀",
+ "镁",
+ "虽",
+ "锚",
+ "键",
+ "炼",
+ "锲",
+ "韩",
+ "锅",
+ "颗",
+ "锤",
+ "飓",
+ "钟",
+ "喂",
+ "锺",
+ "骋",
+ "锹",
+ "骏",
+ "锻",
+ "鲜",
+ "锾",
+ "鲛",
+ "阔",
+ "鲔",
+ "阕",
+ "鸿",
+ "阑",
+ "鸽",
+ "闱",
+ "板",
+ "隐",
+ "隶",
+ "斋",
+ "丛",
+ "噜",
+ "向",
+ "圹",
+ "垒",
+ "婶",
+ "懑",
+ "扩",
+ "掷",
+ "扰",
+ "撵",
+ "摆",
+ "擞",
+ "熏",
+ "犷",
+ "猎",
+ "槟",
+ "瓮",
+ "柜",
+ "槛",
+ "疠",
+ "柠",
+ "愈",
+ "棹",
+ "欤",
+ "归",
+ "殡",
+ "础",
+ "泻",
+ "沈",
+ "穑",
+ "滤",
+ "秽",
+ "渎",
+ "窜",
+ "溅",
+ "窍",
+ "箫",
+ "浏",
+ "箪",
+ "篑",
+ "简",
+ "粮",
+ "织",
+ "缮",
+ "绕",
+ "缭",
+ "绣",
+ "坛",
+ "翘",
+ "职",
+ "聂",
+ "脐",
+ "膑",
+ "萨",
+ "踪",
+ "蓝",
+ "躯",
+ "转",
+ "借",
+ "辙",
+ "迩",
+ "蛲",
+ "蝉",
+ "酱",
+ "厘",
+ "镕",
+ "觐",
+ "镑",
+ "觞",
+ "锁",
+ "谟",
+ "钨",
+ "谨",
+ "镍",
+ "谬",
+ "镇",
+ "丰",
+ "阖",
+ "赘",
+ "闯",
+ "阗",
+ "蹒",
+ "杂",
+ "雏",
+ "鸡",
+ "秋",
+ "额",
+ "颜",
+ "题",
+ "颚",
+ "颛",
+ "飏",
+ "馏",
+ "馊",
+ "馈",
+ "骑",
+ "松",
+ "鲨",
+ "怀",
+ "鲤",
+ "懒",
+ "鲫",
+ "鹃",
+ "鹅",
+ "拢",
+ "鹄",
+ "旷",
+ "冬",
+ "橱",
+ "椟",
+ "榈",
+ "咽",
+ "橹",
+ "咙",
+ "坏",
+ "潇",
+ "垄",
+ "濑",
+ "坜",
+ "宠",
+ "沥",
+ "庞",
+ "濒",
+ "庐",
+ "惩",
+ "烁",
+ "牍",
+ "犊",
+ "兽",
+ "獭",
+ "玺",
+ "琼",
+ "畴",
+ "蒙",
+ "碍",
+ "祷",
+ "获",
+ "稳",
+ "帘",
+ "签",
+ "檐",
+ "系",
+ "茧",
+ "裆",
+ "绎",
+ "绳",
+ "袄",
+ "绘",
+ "哗",
+ "罗",
+ "谱",
+ "膻",
+ "识",
+ "证",
+ "谭",
+ "腊",
+ "谲",
+ "讥",
+ "艺",
+ "赠",
+ "薮",
+ "赞",
+ "药",
+ "蚁",
+ "蝇",
+ "蝎",
+ "跷",
+ "辚",
+ "轿",
+ "边",
+ "镜",
+ "镝",
+ "铲",
+ "镞",
+ "链",
+ "镗",
+ "镘",
+ "镖",
+ "镙",
+ "锵",
+ "镂",
+ "铿",
+ "关",
+ "陇",
+ "离",
+ "鹊",
+ "难",
+ "鹌",
+ "鹏",
+ "雾",
+ "丽",
+ "韬",
+ "韵",
+ "麹",
+ "类",
+ "愿",
+ "劝",
+ "颠",
+ "飕",
+ "嘤",
+ "馒",
+ "严",
+ "骛",
+ "骗",
+ "胡",
+ "鲸",
+ "鲳",
+ "鹑",
+ "悬",
+ "鹉",
+ "忏",
+ "拦",
+ "搀",
+ "胧",
+ "澜",
+ "牺",
+ "珑",
+ "痒",
+ "症",
+ "矿",
+ "砺",
+ "矾",
+ "砾",
+ "窦",
+ "竞",
+ "筹",
+ "蕴",
+ "篮",
+ "蚝",
+ "褴",
+ "辫",
+ "觉",
+ "缤",
+ "继",
+ "议",
+ "胪",
+ "译",
+ "舰",
+ "赢",
+ "赡",
+ "蔼",
+ "趸",
+ "蔺",
+ "芦",
+ "跶",
+ "苹",
+ "释",
+ "锈",
+ "阐",
+ "飘",
+ "饶",
+ "饥",
+ "骞",
+ "腾",
+ "骚",
+ "鳃",
+ "鳅",
+ "咸",
+ "面",
+ "龃",
+ "出",
+ "龄",
+ "苏",
+ "钟",
+ "铙",
+ "俪",
+ "嗫",
+ "续",
+ "啭",
+ "嚣",
+ "兰",
+ "藓",
+ "蛎",
+ "惧",
+ "慑",
+ "蜡",
+ "摄",
+ "袜",
+ "携",
+ "览",
+ "樱",
+ "谴",
+ "栏",
+ "护",
+ "歼",
+ "赃",
+ "烂",
+ "踌",
+ "癞",
+ "跃",
+ "眬",
+ "轰",
+ "藤",
+ "辩",
+ "缠",
+ "镰",
+ "镭",
+ "铁",
+ "铛",
+ "铎",
+ "镯",
+ "辟",
+ "响",
+ "顾",
+ "驱",
+ "骠",
+ "蓦",
+ "骡",
+ "髅",
+ "鳍",
+ "鳏",
+ "莺",
+ "鹤",
+ "鹞",
+ "龇",
+ "龈",
+ "俨",
+ "呓",
+ "啰",
+ "孪",
+ "巅",
+ "峦",
+ "弯",
+ "摊",
+ "踯",
+ "权",
+ "辔",
+ "欢",
+ "铸",
+ "洒",
+ "鉴",
+ "滩",
+ "鉴",
+ "猡",
+ "霁",
+ "叠",
+ "瘾",
+ "鞑",
+ "癣",
+ "缰",
+ "笼",
+ "颤",
+ "籁",
+ "骄",
+ "聋",
+ "须",
+ "听",
+ "鳖",
+ "脏",
+ "鲢",
+ "袭",
+ "鳔",
+ "衬",
+ "鳗",
+ "读",
+ "鹧",
+ "赎",
+ "鸥",
+ "赝",
+ "鼹",
+ "龉",
+ "龊",
+ "龚",
+ "苏",
+ "岩",
+ "挛",
+ "搅",
+ "签",
+ "缨",
+ "纤",
+ "萝",
+ "蛊",
+ "变",
+ "逦",
+ "镳",
+ "铄",
+ "靥",
+ "显",
+ "餍",
+ "惊",
+ "驿",
+ "验",
+ "脏",
+ "鳝",
+ "鳞",
+ "鳜",
+ "鸶",
+ "霉",
+ null,
+ "坝",
+ "揽",
+ "瘫",
+ "癫",
+ "羁",
+ "让",
+ "谗",
+ "谶",
+ "赣",
+ "酿",
+ "雳",
+ "灵",
+ "霭",
+ "鳄",
+ "鲈",
+ "黩",
+ "艳",
+ "凿",
+ "鹦",
+ "骊",
+ "郁",
+ "鸾",
+ "吁",
+ "颦",
+ "骤",
+ "鬓",
+ "魇",
+ "鹰",
+ "鹭",
+ "硷",
+ "盐",
+ "鳌",
+ "龌",
+ "龋",
+ "厅",
+ "榄",
+ "篱",
+ "箩",
+ "蹑",
+ "衅",
+ "镶",
+ "钥",
+ "颅",
+ "馋",
+ "滦",
+ "瞩",
+ "赞",
+ "驴",
+ "骥",
+ "缆",
+ "躏",
+ "钻",
+ "銮",
+ "锣"
+]
diff --git a/src/background/graphql/utils/lang-shin.json b/src/background/graphql/utils/lang-shin.json
new file mode 100644
index 0000000..bdd0f4e
--- /dev/null
+++ b/src/background/graphql/utils/lang-shin.json
@@ -0,0 +1,327 @@
+[
+ "亜",
+ "悪",
+ "圧",
+ "囲",
+ "為",
+ "壱",
+ "逸",
+ "飲",
+ "隠",
+ "羽",
+ "栄",
+ "営",
+ "鋭",
+ "衛",
+ "益",
+ "駅",
+ "謁",
+ "閲",
+ "円",
+ "塩",
+ "縁",
+ "艶",
+ "応",
+ "桜",
+ "穏",
+ "仮",
+ "価",
+ "禍",
+ "悔",
+ "海",
+ "絵",
+ "壊",
+ "懐",
+ "慨",
+ "概",
+ "拡",
+ "殻",
+ "覚",
+ "楽",
+ "喝",
+ "渇",
+ "褐",
+ "鎌",
+ "缶",
+ "巻",
+ "陥",
+ "間",
+ "勧",
+ "寛",
+ "漢",
+ "関",
+ "歓",
+ "館",
+ "観",
+ "顔",
+ "巌",
+ "気",
+ "祈",
+ "既",
+ "既",
+ "帰",
+ "亀",
+ "器",
+ "偽",
+ "戯",
+ "犠",
+ "拠",
+ "挙",
+ "強",
+ "教",
+ "郷",
+ "響",
+ "尭",
+ "暁",
+ "勤",
+ "謹",
+ "駆",
+ "勲",
+ "薫",
+ "契",
+ "恵",
+ "掲",
+ "渓",
+ "経",
+ "蛍",
+ "軽",
+ "継",
+ "鶏",
+ "芸",
+ "撃",
+ "欠",
+ "研",
+ "県",
+ "倹",
+ "剣",
+ "険",
+ "圏",
+ "検",
+ "権",
+ "顕",
+ "験",
+ "厳",
+ "戸",
+ "呉",
+ "娯",
+ "広",
+ "効",
+ "鉱",
+ "告",
+ "黒",
+ "穀",
+ "砕",
+ "済",
+ "斎",
+ "歳",
+ "剤",
+ "冊",
+ "殺",
+ "雑",
+ "桟",
+ "産",
+ "賛",
+ "糸",
+ "祉",
+ "視",
+ "歯",
+ "飼",
+ "児",
+ "実",
+ "社",
+ "舎",
+ "者",
+ "煮",
+ "釈",
+ "収",
+ "臭",
+ "従",
+ "渋",
+ "獣",
+ "縦",
+ "祝",
+ "粛",
+ "処",
+ "渚",
+ "暑",
+ "署",
+ "緒",
+ "諸",
+ "尚",
+ "祥",
+ "渉",
+ "焼",
+ "証",
+ "奨",
+ "乗",
+ "浄",
+ "剰",
+ "畳",
+ "縄",
+ "壌",
+ "嬢",
+ "穣",
+ "譲",
+ "醸",
+ "神",
+ "真",
+ "慎",
+ "図",
+ "粋",
+ "酔",
+ "穂",
+ "髄",
+ "瀬",
+ "青",
+ "斉",
+ "清",
+ "晴",
+ "靖",
+ "精",
+ "摂",
+ "節",
+ "説",
+ "絶",
+ "専",
+ "戦",
+ "銭",
+ "繊",
+ "祖",
+ "荘",
+ "捜",
+ "挿",
+ "巣",
+ "曽",
+ "痩",
+ "僧",
+ "層",
+ "総",
+ "聡",
+ "騒",
+ "増",
+ "憎",
+ "蔵",
+ "贈",
+ "臓",
+ "即",
+ "続",
+ "対",
+ "帯",
+ "滝",
+ "択",
+ "沢",
+ "琢",
+ "単",
+ "嘆",
+ "団",
+ "弾",
+ "遅",
+ "痴",
+ "鋳",
+ "著",
+ "庁",
+ "徴",
+ "聴",
+ "懲",
+ "勅",
+ "鎮",
+ "塚",
+ "禎",
+ "逓",
+ "鉄",
+ "転",
+ "伝",
+ "都",
+ "稲",
+ "闘",
+ "闘",
+ "徳",
+ "読",
+ "突",
+ "難",
+ "弐",
+ "悩",
+ "脳",
+ "覇",
+ "拝",
+ "廃",
+ "売",
+ "梅",
+ "発",
+ "髪",
+ "抜",
+ "飯",
+ "繁",
+ "晩",
+ "卑",
+ "秘",
+ "碑",
+ "姫",
+ "浜",
+ "賓",
+ "頻",
+ "敏",
+ "瓶",
+ "侮",
+ "福",
+ "払",
+ "仏",
+ "併",
+ "並",
+ "塀",
+ "餅",
+ "辺",
+ "変",
+ "弁",
+ "弁",
+ "弁",
+ "勉",
+ "歩",
+ "舗",
+ "豊",
+ "褒",
+ "墨",
+ "翻",
+ "槙",
+ "毎",
+ "満",
+ "免",
+ "麺",
+ "黙",
+ "訳",
+ "薬",
+ "祐",
+ "予",
+ "揺",
+ "様",
+ "謡",
+ "頼",
+ "覧",
+ "欄",
+ "竜",
+ "隆",
+ "旅",
+ "虜",
+ "両",
+ "猟",
+ "緑",
+ "隣",
+ "涙",
+ "塁",
+ "類",
+ "戻",
+ "霊",
+ "隷",
+ "齢",
+ "暦",
+ "歴",
+ "廉",
+ "練",
+ "錬",
+ "労",
+ "郎",
+ "朗",
+ "廊",
+ "録",
+ ""
+]
diff --git a/src/background/idb.ts b/src/background/idb.ts
new file mode 100644
index 0000000..337b005
--- /dev/null
+++ b/src/background/idb.ts
@@ -0,0 +1,6 @@
+import { Storage } from "~/shared/idb"
+
+export const statistics = await Storage.of<{
+ lastRequested?: Date
+ disableLogging?: boolean
+}>("statistics", "statistics-store")
diff --git a/src/background/index.ts b/src/background/index.ts
new file mode 100644
index 0000000..d76ea13
--- /dev/null
+++ b/src/background/index.ts
@@ -0,0 +1,47 @@
+import { flatMap } from "lodash"
+import browser from "webextension-polyfill"
+import { query } from "./graphql/api"
+import { updateTabIcons } from "./update"
+
+function replaceFiles({ tabId, frameId }: { tabId: number; frameId: number }) {
+ void browser.tabs.sendMessage(tabId, { method: "fileUpdated" }, { frameId })
+}
+
+browser.runtime.onMessage.addListener((msg, _sender, sendResponse) => {
+ const { method, body } = msg
+ if (method === "gql") {
+ query(body.query, body.variables)
+ .then(result => {
+ if (process.env.NODE_ENV === "development") {
+ console.log({ ...body, result })
+ }
+ // @ts-expect-error wrong type
+ sendResponse(result)
+ })
+ .catch(console.error)
+ return true
+ }
+})
+
+browser.webNavigation.onCommitted.addListener(updateTabIcons)
+browser.webNavigation.onHistoryStateUpdated.addListener(info => {
+ void updateTabIcons(info)
+ replaceFiles(info)
+})
+browser.webNavigation.onBeforeNavigate.addListener(updateTabIcons)
+
+browser.tabs.onUpdated.addListener((tabId, info) => {
+ void updateTabIcons({ ...info, tabId, url: info.url, frameId: 0 })
+ if (info.status === "loading") {
+ replaceFiles({ tabId, frameId: 0 })
+ }
+})
+
+const tabs = flatMap(
+ await browser.windows.getAll({ populate: true }),
+ window => window.tabs!,
+)
+
+await Promise.all(
+ tabs.map(tab => updateTabIcons({ tabId: tab.id!, url: tab.url, frameId: 0 })),
+)
diff --git a/src/background/update.ts b/src/background/update.ts
new file mode 100644
index 0000000..5b4d76e
--- /dev/null
+++ b/src/background/update.ts
@@ -0,0 +1,85 @@
+import browser from "webextension-polyfill"
+import type { BackgroundQueryDocument } from "~/generated/graphql"
+import { queryOrThrow } from "./graphql/api"
+
+const gql = String.raw
+
+const BACKGROUND_QUERY = gql`
+ query BackgroundQuery($url: String!) {
+ preferences {
+ enabled
+ }
+ files(filter: { url: $url, enabled: true }) {
+ id
+ }
+ }
+`
+
+export async function updateTabIcons({
+ frameId,
+ tabId,
+ url,
+ status,
+}: {
+ frameId?: number
+ tabId: number
+ url?: string
+ status?: string
+}) {
+ if (
+ !url ||
+ url.startsWith("chrome-error://") ||
+ url.startsWith("chrome-extension://") ||
+ url.startsWith("chrome://newtab/")
+ ) {
+ return
+ }
+
+ const {
+ preferences: { enabled },
+ files,
+ } = await queryOrThrow(BACKGROUND_QUERY, { url })
+
+ await browser.browserAction.setBadgeBackgroundColor({
+ color: enabled ? [251, 43, 105, 255] : [170, 170, 170, 255],
+ })
+
+ if (frameId && frameId !== 0) {
+ return
+ }
+
+ const count = files.length
+
+ try {
+ if (url === "chrome://newtab/" && status && status !== "complete") return
+
+ if (!(await tabExists(tabId))) return
+
+ const postfix = enabled ? "" : "w"
+
+ await browser.browserAction.setIcon({
+ tabId,
+ path: {
+ 16: `assets/images/16${postfix}.png`,
+ 32: `assets/images/32${postfix}.png`,
+ 19: `assets/images/19${postfix}.png`,
+ 38: `assets/images/38${postfix}.png`,
+ },
+ })
+
+ if (count) {
+ await browser.browserAction.setBadgeText({
+ text: `${count}`,
+ tabId,
+ })
+ }
+ } catch {}
+}
+
+async function tabExists(id?: number) {
+ try {
+ return Boolean(id != null && (await browser.tabs.get(id)))
+ } catch {
+ return false
+ }
+}
diff --git a/src/context/index.ts b/src/context/index.ts
new file mode 100644
index 0000000..314713a
--- /dev/null
+++ b/src/context/index.ts
@@ -0,0 +1,181 @@
+// import "./picker";
+import browser from "webextension-polyfill"
+import type { GetCompiledStyleDocument } from "../generated/graphql"
+import { graphql } from "~/shared/messaging"
+
+const BLACKLIST = ["docs.google.com"]
+const REAPPLY = ["wikia.com"]
+const PREVENT_REMOVAL = ["tanstack.com"]
+
+const gql = String.raw
+const isFirefox = navigator.userAgent.includes("Gecko/")
+
+// Global states
+let isExtensionEnabled = false
+let lastIDs = new Set()
+const styleNodes = new WeakSet()
+const styleNodesMap = new Map()
+
+const isXMLViewer = () => document.head?.firstElementChild?.id === "xml-viewer-style"
+
+function toggleEnableStyles(state: boolean) {
+ if (state === isExtensionEnabled) return
+
+ isExtensionEnabled = state
+
+ Array.from(document.styleSheets)
+ .filter(({ ownerNode }) => styleNodes.has(ownerNode as Element))
+ .forEach(stylesheet => {
+ stylesheet.disabled = !isExtensionEnabled
+ })
+}
+
+function applyStyles(enabled: boolean, files: { id: string; code: string }[]) {
+ toggleEnableStyles(enabled)
+ if (!enabled) return
+
+ const ids = new Set(files.map(_ => _.id))
+ for (const id of lastIDs) {
+ if (!ids.has(id)) {
+ const node = styleNodesMap.get(id)
+ styleNodesMap.delete(id)
+ node?.remove()
+ }
+ }
+
+ lastIDs = ids
+
+ for (const { id, code } of files) {
+ applyStyle(id, code)
+ }
+
+ if (styleNodesMap.size) {
+ if (!isXMLViewer() && !isFirefox) {
+ function migrate() {
+ // Move before all the attached styles so they can take precedence.
+ const style = Array.from(
+ document.documentElement.querySelectorAll(`:scope > style`),
+ ).find(style => styleNodes.has(style))
+ if (!style) return
+ if (document.body) {
+ document.documentElement.insertBefore(document.body, style)
+ } else {
+ setTimeout(migrate, 1000)
+ }
+ }
+ document.addEventListener("DOMContentLoaded", migrate)
+ }
+ }
+}
+
+function applyStyle(styleId: string, code: string) {
+ const current = styleNodesMap.get(styleId)
+ if (current) {
+ ;(current.childNodes[0] as Text).textContent = code
+ return
+ }
+
+ const namespace = document.documentElement.namespaceURI
+ const node: HTMLStyleElement = document.createElementNS(namespace, "style") as any
+ if (isPatched) {
+ node.dataset.keep = ""
+ }
+ node.appendChild(document.createTextNode(code))
+
+ node.disabled = !isExtensionEnabled
+
+ const clonedNode = document.adoptNode(node)
+ styleNodes.add(clonedNode)
+ if (isFirefox) {
+ setTimeout(() => {
+ document.body.appendChild(clonedNode)
+ }, 29)
+ } else if (isXMLViewer()) {
+ /**
+ * When site response is `application/xml`, Chrome displays our style elements
+ * under document.documentElement as plain text so we need to move them into
+ * (which already is auto-generated at this moment for the XML response).
+ */
+ document.head.appendChild(clonedNode)
+ } else {
+ document.documentElement.appendChild(clonedNode)
+ }
+
+ styleNodes.add(node)
+ styleNodesMap.set(String(styleId), node)
+}
+
+const GET_COMPILED_STYLE = gql`
+ query GetCompiledStyle($url: String!) {
+ preferences {
+ enabled
+ }
+ files(
+ filter: { url: $url, enabled: true, state: None, isGlobal: false }
+ logQuery: true
+ ) {
+ id
+ sections {
+ compiledCode
+ }
+ }
+ }
+` as any as GetCompiledStyleDocument
+
+async function applyCompiledStyle() {
+ const {
+ data: { preferences, files },
+ } = await graphql(GET_COMPILED_STYLE, { url: location.href })
+
+ applyStyles(
+ preferences.enabled ?? true,
+ files.map(file => ({
+ id: file.id,
+ code: file.sections.map(section => section.compiledCode).join("\n"),
+ })),
+ )
+}
+
+function endsWith(text: string, list: string[]) {
+ return list.some(item => text.endsWith(item))
+}
+
+if (!endsWith(location.hostname, BLACKLIST)) {
+ void applyCompiledStyle()
+
+ browser.runtime.onMessage.addListener(req => {
+ if (req.method === "fileUpdated") {
+ void applyCompiledStyle()
+ }
+ })
+}
+
+const isPatched = endsWith(location.hostname, PREVENT_REMOVAL)
+
+// Some React sites remove