diff --git a/.gitignore b/.gitignore index a32634ee..778bd3e4 100644 --- a/.gitignore +++ b/.gitignore @@ -126,4 +126,6 @@ lib */.output e2e/esmCompatibility/.output src/e2e/esmCompatibility/.output -**/0x \ No newline at end of file +**/0x + +**/*.db \ No newline at end of file diff --git a/README.md b/README.md index aab11c3e..f5c8bd66 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ Check also my blog articles on Emmett: - [Testing Event Sourcing, Emmett edition](https://event-driven.io/en/testing_event_sourcing_emmett_edition/) - [Event Sourcing on PostgreSQL in Node.js just became possible with Emmett](https://event-driven.io/en/emmett_postgresql_event_store/) - [Writing and testing event-driven projections with Emmett, Pongo and PostgreSQL](https://event-driven.io/en/emmett_projections_testing/) -- [Using event metadata in event-driven projections](https://event-driven.io/en/projections_and_event_metadata/)= +- [Using event metadata in event-driven projections](https://event-driven.io/en/projections_and_event_metadata/) ## FAQ diff --git a/samples/webApi/expressjs-with-esdb/package-lock.json b/samples/webApi/expressjs-with-esdb/package-lock.json index e9954183..6a1192ac 100644 --- a/samples/webApi/expressjs-with-esdb/package-lock.json +++ b/samples/webApi/expressjs-with-esdb/package-lock.json @@ -9,10 +9,10 @@ "version": "1.0.0", "license": "MIT", "dependencies": { - "@event-driven-io/emmett": "0.23.0-alpha.12", - "@event-driven-io/emmett-esdb": "0.23.0-alpha.12", - "@event-driven-io/emmett-expressjs": "0.23.0-alpha.12", - "@event-driven-io/emmett-testcontainers": "0.23.0-alpha.12" + "@event-driven-io/emmett": "0.30.0", + "@event-driven-io/emmett-esdb": "0.30.0", + "@event-driven-io/emmett-expressjs": "0.30.0", + "@event-driven-io/emmett-testcontainers": "0.30.0" }, "devDependencies": { "@types/node": "20.11.30", @@ -513,9 +513,9 @@ } }, "node_modules/@event-driven-io/emmett": { - "version": "0.23.0-alpha.12", - "resolved": "https://registry.npmjs.org/@event-driven-io/emmett/-/emmett-0.23.0-alpha.12.tgz", - "integrity": "sha512-P31Rm9QGE+uxWKoXEQ8y0TtKTLwvCUioQr6HckFmUxb0RF7aN/Zw5/SUVXWdT1qPLU1t3suD/+lzeU3S+HeT6A==", + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/@event-driven-io/emmett/-/emmett-0.30.0.tgz", + "integrity": "sha512-HWNoJ8iDQKGZNtCDniFd9NcYZmUQIxvmIndef+9oVGGjqg2X120ImrSy9N9cl/m4ZAeN+gy0hJc1mKXRNooLwA==", "bin": { "emmett": "dist/cli.js" }, @@ -530,20 +530,20 @@ } }, "node_modules/@event-driven-io/emmett-esdb": { - "version": "0.23.0-alpha.12", - "resolved": "https://registry.npmjs.org/@event-driven-io/emmett-esdb/-/emmett-esdb-0.23.0-alpha.12.tgz", - "integrity": "sha512-jzKXoWPvu3tAbyQe7Al5bYFqjlgN7PmaBBHKUzD2NcMP8hk0DjWugi1brDKHfj5H+/yGdGqdYRw3s0AsMfePEw==", + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/@event-driven-io/emmett-esdb/-/emmett-esdb-0.30.0.tgz", + "integrity": "sha512-FDe9oAz6xOPKLV++ukXURIM3kqxH3qTP8xj2Aq+L1UGXWHEQ7J3LUaQUavTNVf/YhXmtGgNwY8AJJLFw9sk/4g==", "peerDependencies": { - "@event-driven-io/emmett": "0.23.0-alpha.12", + "@event-driven-io/emmett": "0.30.0", "@eventstore/db-client": "^6.2.1" } }, "node_modules/@event-driven-io/emmett-expressjs": { - "version": "0.23.0-alpha.12", - "resolved": "https://registry.npmjs.org/@event-driven-io/emmett-expressjs/-/emmett-expressjs-0.23.0-alpha.12.tgz", - "integrity": "sha512-czraNb7l2CmjPH1bpGxV9TfAfRo0JFpflabWECv9V6HAFOL96GVbdAJB+XvEvfQZcxElJyi8mQSUYwQRVhjWZA==", + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/@event-driven-io/emmett-expressjs/-/emmett-expressjs-0.30.0.tgz", + "integrity": "sha512-JEhPPglShpTZmyYE1aC+fkfBqDZBPs9Gjfgn7I4mmw9t8LxTuDAK7M/H2y65bxgG23Xd33ICPUpbGdRMcdItbw==", "peerDependencies": { - "@event-driven-io/emmett": "0.23.0-alpha.12", + "@event-driven-io/emmett": "0.30.0", "@types/express": "^4.17.21", "@types/supertest": "^6.0.2", "express": "^4.19.2", @@ -553,11 +553,11 @@ } }, "node_modules/@event-driven-io/emmett-testcontainers": { - "version": "0.23.0-alpha.12", - "resolved": "https://registry.npmjs.org/@event-driven-io/emmett-testcontainers/-/emmett-testcontainers-0.23.0-alpha.12.tgz", - "integrity": "sha512-m9QflY4Q6/rW4NsjutWiqnj2SzOm9VwGfNRnqBJrD0/wX1EigG/ayeDWilj+Mq4/DMWvRV1yXrc/HYP8J/KryQ==", + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/@event-driven-io/emmett-testcontainers/-/emmett-testcontainers-0.30.0.tgz", + "integrity": "sha512-kZeVvR/Cu3QSKJwg9Vfo3d2+awdiO92QEHLkN+RvBi6gYahOqfA0gN/dkgGYl+rFIk1XYcdu32kkNVGZuLGoDw==", "dependencies": { - "@event-driven-io/emmett": "0.23.0-alpha.12", + "@event-driven-io/emmett": "0.30.0", "testcontainers": "^10.12.0" } }, diff --git a/samples/webApi/expressjs-with-esdb/package.json b/samples/webApi/expressjs-with-esdb/package.json index b8e1f257..fedc3fb6 100644 --- a/samples/webApi/expressjs-with-esdb/package.json +++ b/samples/webApi/expressjs-with-esdb/package.json @@ -38,10 +38,10 @@ }, "homepage": "https://github.com/event-driven-io/emmett#readme", "dependencies": { - "@event-driven-io/emmett": "0.23.0-alpha.12", - "@event-driven-io/emmett-esdb": "0.23.0-alpha.12", - "@event-driven-io/emmett-expressjs": "0.23.0-alpha.12", - "@event-driven-io/emmett-testcontainers": "0.23.0-alpha.12" + "@event-driven-io/emmett": "0.30.0", + "@event-driven-io/emmett-esdb": "0.30.0", + "@event-driven-io/emmett-expressjs": "0.30.0", + "@event-driven-io/emmett-testcontainers": "0.30.0" }, "devDependencies": { "@types/node": "20.11.30", diff --git a/samples/webApi/expressjs-with-mongodb/package-lock.json b/samples/webApi/expressjs-with-mongodb/package-lock.json index 6119cc7a..94f0c8b6 100644 --- a/samples/webApi/expressjs-with-mongodb/package-lock.json +++ b/samples/webApi/expressjs-with-mongodb/package-lock.json @@ -9,9 +9,9 @@ "version": "1.0.0", "license": "MIT", "dependencies": { - "@event-driven-io/emmett": "0.23.0-alpha.12", - "@event-driven-io/emmett-expressjs": "0.23.0-alpha.12", - "@event-driven-io/emmett-mongodb": "0.23.0-alpha.12" + "@event-driven-io/emmett": "0.30.0", + "@event-driven-io/emmett-expressjs": "0.30.0", + "@event-driven-io/emmett-mongodb": "0.30.0" }, "devDependencies": { "@testcontainers/mongodb": "^10.10.3", @@ -506,9 +506,9 @@ } }, "node_modules/@event-driven-io/emmett": { - "version": "0.23.0-alpha.12", - "resolved": "https://registry.npmjs.org/@event-driven-io/emmett/-/emmett-0.23.0-alpha.12.tgz", - "integrity": "sha512-P31Rm9QGE+uxWKoXEQ8y0TtKTLwvCUioQr6HckFmUxb0RF7aN/Zw5/SUVXWdT1qPLU1t3suD/+lzeU3S+HeT6A==", + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/@event-driven-io/emmett/-/emmett-0.30.0.tgz", + "integrity": "sha512-HWNoJ8iDQKGZNtCDniFd9NcYZmUQIxvmIndef+9oVGGjqg2X120ImrSy9N9cl/m4ZAeN+gy0hJc1mKXRNooLwA==", "bin": { "emmett": "dist/cli.js" }, @@ -523,11 +523,11 @@ } }, "node_modules/@event-driven-io/emmett-expressjs": { - "version": "0.23.0-alpha.12", - "resolved": "https://registry.npmjs.org/@event-driven-io/emmett-expressjs/-/emmett-expressjs-0.23.0-alpha.12.tgz", - "integrity": "sha512-czraNb7l2CmjPH1bpGxV9TfAfRo0JFpflabWECv9V6HAFOL96GVbdAJB+XvEvfQZcxElJyi8mQSUYwQRVhjWZA==", + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/@event-driven-io/emmett-expressjs/-/emmett-expressjs-0.30.0.tgz", + "integrity": "sha512-JEhPPglShpTZmyYE1aC+fkfBqDZBPs9Gjfgn7I4mmw9t8LxTuDAK7M/H2y65bxgG23Xd33ICPUpbGdRMcdItbw==", "peerDependencies": { - "@event-driven-io/emmett": "0.23.0-alpha.12", + "@event-driven-io/emmett": "0.30.0", "@types/express": "^4.17.21", "@types/supertest": "^6.0.2", "express": "^4.19.2", @@ -537,11 +537,11 @@ } }, "node_modules/@event-driven-io/emmett-mongodb": { - "version": "0.23.0-alpha.12", - "resolved": "https://registry.npmjs.org/@event-driven-io/emmett-mongodb/-/emmett-mongodb-0.23.0-alpha.12.tgz", - "integrity": "sha512-XXKPWl8ZamD+HEJF8NQmRuRDUTUccO/XdfR2u95dQt0z9IKrPpX6q1C4Vg8uZH65cUjtrWN2poA6HS5UbX2qvw==", + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/@event-driven-io/emmett-mongodb/-/emmett-mongodb-0.30.0.tgz", + "integrity": "sha512-EqHof0svLTOmXF44RjgXlbCBayr613IPpsZ+sZ2i9aq0QTMgHqvUeN3CMZ1sdcAw6znGu8hvaxkMRNiYeObCzg==", "peerDependencies": { - "@event-driven-io/emmett": "0.23.0-alpha.12", + "@event-driven-io/emmett": "0.30.0", "mongodb": "^6.10.0" } }, diff --git a/samples/webApi/expressjs-with-mongodb/package.json b/samples/webApi/expressjs-with-mongodb/package.json index 2d409a4a..5d4c70e0 100644 --- a/samples/webApi/expressjs-with-mongodb/package.json +++ b/samples/webApi/expressjs-with-mongodb/package.json @@ -38,9 +38,9 @@ }, "homepage": "https://github.com/event-driven-io/emmett#readme", "dependencies": { - "@event-driven-io/emmett": "0.23.0-alpha.12", - "@event-driven-io/emmett-expressjs": "0.23.0-alpha.12", - "@event-driven-io/emmett-mongodb": "0.23.0-alpha.12" + "@event-driven-io/emmett": "0.30.0", + "@event-driven-io/emmett-expressjs": "0.30.0", + "@event-driven-io/emmett-mongodb": "0.30.0" }, "devDependencies": { "@testcontainers/mongodb": "^10.10.3", diff --git a/samples/webApi/expressjs-with-postgresql/docker-compose.yml b/samples/webApi/expressjs-with-postgresql/docker-compose.yml index 3e5e785e..4794c7b8 100644 --- a/samples/webApi/expressjs-with-postgresql/docker-compose.yml +++ b/samples/webApi/expressjs-with-postgresql/docker-compose.yml @@ -1,5 +1,3 @@ -version: '3.5' - services: app: build: diff --git a/samples/webApi/expressjs-with-postgresql/package-lock.json b/samples/webApi/expressjs-with-postgresql/package-lock.json index 5e513f56..bd767e8e 100644 --- a/samples/webApi/expressjs-with-postgresql/package-lock.json +++ b/samples/webApi/expressjs-with-postgresql/package-lock.json @@ -9,9 +9,9 @@ "version": "1.0.0", "license": "MIT", "dependencies": { - "@event-driven-io/emmett": "0.26.0", - "@event-driven-io/emmett-expressjs": "0.26.0", - "@event-driven-io/emmett-postgresql": "0.26.0" + "@event-driven-io/emmett": "0.30.0", + "@event-driven-io/emmett-expressjs": "0.30.0", + "@event-driven-io/emmett-postgresql": "0.30.0" }, "devDependencies": { "@testcontainers/postgresql": "^10.10.3", @@ -528,9 +528,9 @@ } }, "node_modules/@event-driven-io/emmett": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@event-driven-io/emmett/-/emmett-0.26.0.tgz", - "integrity": "sha512-Jr052b5I9cnTc+cvaLoYmuKVB7IaWAyk5MfJ7pmQ5cSg4k7ueMDCznhwMgad4ArNManwZ2MMuNvnNbvAOkKQ2w==", + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/@event-driven-io/emmett/-/emmett-0.30.0.tgz", + "integrity": "sha512-HWNoJ8iDQKGZNtCDniFd9NcYZmUQIxvmIndef+9oVGGjqg2X120ImrSy9N9cl/m4ZAeN+gy0hJc1mKXRNooLwA==", "bin": { "emmett": "dist/cli.js" }, @@ -545,11 +545,11 @@ } }, "node_modules/@event-driven-io/emmett-expressjs": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@event-driven-io/emmett-expressjs/-/emmett-expressjs-0.26.0.tgz", - "integrity": "sha512-u9v35z8XJRJHnnpiT+Jx8ogQIi1zk/R6UWsiCGDOolkoiUhPEGO+HXuDvFiVgHFNOc+N+vPSoN66Aj4Iy5IZfw==", + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/@event-driven-io/emmett-expressjs/-/emmett-expressjs-0.30.0.tgz", + "integrity": "sha512-JEhPPglShpTZmyYE1aC+fkfBqDZBPs9Gjfgn7I4mmw9t8LxTuDAK7M/H2y65bxgG23Xd33ICPUpbGdRMcdItbw==", "peerDependencies": { - "@event-driven-io/emmett": "0.26.0", + "@event-driven-io/emmett": "0.30.0", "@types/express": "^4.17.21", "@types/supertest": "^6.0.2", "express": "^4.19.2", @@ -559,11 +559,11 @@ } }, "node_modules/@event-driven-io/emmett-postgresql": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@event-driven-io/emmett-postgresql/-/emmett-postgresql-0.26.0.tgz", - "integrity": "sha512-av5cMuPKBi4ORy//p7uzQPFT8m/Dyg4sbEZPj83Ywxnn9VoXp/MpS4fioAJnSI4MAtj0116OYtKfzVnaQ2k6Ew==", + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/@event-driven-io/emmett-postgresql/-/emmett-postgresql-0.30.0.tgz", + "integrity": "sha512-UsdiJb4tA9JQn+F0uBjW8aMrODqoykEdunaLydzxz6w4jbbURBwZyurmkt5U3Il8ae/eL+cPjD6ah109FdSURw==", "peerDependencies": { - "@event-driven-io/emmett": "0.26.0", + "@event-driven-io/emmett": "0.30.0", "@event-driven-io/pongo": "0.16.4" } }, diff --git a/samples/webApi/expressjs-with-postgresql/package.json b/samples/webApi/expressjs-with-postgresql/package.json index d6cf6fd2..356c54be 100644 --- a/samples/webApi/expressjs-with-postgresql/package.json +++ b/samples/webApi/expressjs-with-postgresql/package.json @@ -38,9 +38,9 @@ }, "homepage": "https://github.com/event-driven-io/emmett#readme", "dependencies": { - "@event-driven-io/emmett": "0.26.0", - "@event-driven-io/emmett-expressjs": "0.26.0", - "@event-driven-io/emmett-postgresql": "0.26.0" + "@event-driven-io/emmett": "0.30.0", + "@event-driven-io/emmett-expressjs": "0.30.0", + "@event-driven-io/emmett-postgresql": "0.30.0" }, "devDependencies": { "@testcontainers/postgresql": "^10.10.3", diff --git a/src/docs/.vitepress/config.mts b/src/docs/.vitepress/config.mts index 35a9aeeb..e2921b93 100644 --- a/src/docs/.vitepress/config.mts +++ b/src/docs/.vitepress/config.mts @@ -12,7 +12,14 @@ export default defineConfig({ logo: '/logo.png', // https://vitepress.dev/reference/default-theme-config nav: [ - { text: 'Getting Started', link: '/getting-started' }, + { + text: 'Documentation', + items: [ + { text: 'Overview', link: '/overview' }, + { text: 'Getting started', link: '/getting-started' }, + { text: 'API reference', link: '/api-docs' }, + ], + }, { text: '🧑‍💻 Join Discord Server', link: 'https://discord.gg/fTpqUTMmVa' }, { text: 'Release Notes', @@ -27,7 +34,11 @@ export default defineConfig({ sidebar: [ { text: 'Documentation', - items: [{ text: 'Getting Started', link: '/getting-started' }], + items: [ + { text: 'Overview', link: '/overview' }, + { text: 'Getting Started', link: '/getting-started' }, + { text: 'API reference', link: '/api-docs' }, + ], }, ], diff --git a/src/docs/api-docs.md b/src/docs/api-docs.md index 5b201d04..f1e90da2 100644 --- a/src/docs/api-docs.md +++ b/src/docs/api-docs.md @@ -2,7 +2,7 @@ outline: deep --- -# API docs +# API reference ## Event diff --git a/src/docs/overview.md b/src/docs/overview.md new file mode 100644 index 00000000..2ea489cb --- /dev/null +++ b/src/docs/overview.md @@ -0,0 +1,54 @@ +# Overview + +Everything you need to know about Emmett and Event Sourcing. + +## First steps + +If you are new to Emmett or Event Sourcing, no problem. + +The [Getting Started](/getting-started) guide will help you with your first Emmett project. + +## Getting help + +If you need help or got stuck, feel free to ask on the [Emmett Community Discord Server](https://discord.gg/fTpqUTMmVa). + +## API reference + +The [API reference](/api-docs) provides you with definitions and insights of Emmetts core building blocks: + +- **Events** are the centerpiece of event-sourced systems. They represent both critical points of the business process but are also used as the state. +- **Commands** represent the intent to perform a business operation. +- **Event Store** for recording events +- **Command Handlers** are responsible for handling business logic. They read events from the event store for specific events and build a decision model. Then, check business rules and perform the intended business operation, resulting in one or more events to record the change. + +## How the documenantation is organized + +Currently documentation for Emmett is spread across several places: This website, the [Emmett Discord](https://discord.gg/fTpqUTMmVa) and [quite a few blog articles](/overview#further-reading). +At the moment we are in the process of consolidating and refactoring these into a single documentation on this website. + +Our aim is that each part of the documenation roughly falls into one of these four categories: + +- **Tutorials** are lessons that take you by the hand, guiding you step-by-step towards building your own applications with Emmett. Start here if you are new to Emmett, Event Sourcing or writing applications with Typescript. Our [Getting Started](/getting-started) guide is a good place to look at. +- **Topic guides** discuss key topics and concepts at a fairly high level and provide useful background information and explanation. +- **Reference guides** contain technical reference for APIs and other aspects of Emmett. They describe how it works and how to use it, but assume that you have a basic understanding of key concepts. +- **How-to guides** are recipes. They guide you through the steps involved in addressing key problems and use-cases. They are more advanced than tutorials and assume some knowledge of how Emmett works. + +In fact, we aim at using [Diataxis](https://diataxis.fr) and its [workflow](https://diataxis.fr/how-to-use-diataxis/) as a systematic, user-centric approach to documentation. + +## Further reading + +### Blog articles about Emmett + +- [Announcing Emmett! Take your event-driven applications back to the future!](https://event-driven.io/en/introducing_emmett/) +- [Event Sourcing on PostgreSQL in Node.js just became possible with Emmett](https://event-driven.io/en/emmett_postgresql_event_store/) +- [Writing and testing event-driven projections with Emmett, Pongo and PostgreSQL](https://event-driven.io/en/emmett_projections_testing/) +- [Event Sourcing with Emmett: Reducing the Entry Barrier](https://medium.com/@mbneto/event-sourcing-with-emmett-how-to-reduce-the-entry-barrier-bf2d638c0437) +- [Testing Event Sourcing, Emmett edition](https://event-driven.io/en/testing_event_sourcing_emmett_edition/) +- [Using event metadata in event-driven projections](https://event-driven.io/en/projections_and_event_metadata/) +- [How to configure a custom Test Container on the EventStoreDB example](https://event-driven.io/en/custom_test_container_on_esdb_example/) + +### Related Blogs + +- [How TypeScript can help in modelling business workflows](https://event-driven.io/en/how_to_have_fun_with_typescript_and_workflow/) +- [How to build an in-memory Message Bus in TypeScript](https://event-driven.io/en/inmemory_message_bus_in_typescript/) +- [How to tackle compatibility issues in ECMA Script modules (and in general)](https://event-driven.io/en/how_to_tackle_esmodules_compatibility_issues/) diff --git a/src/package-lock.json b/src/package-lock.json index da911a7b..9c2f2ee2 100644 --- a/src/package-lock.json +++ b/src/package-lock.json @@ -1,12 +1,12 @@ { "name": "@event-driven-io/core", - "version": "0.26.0", + "version": "0.34.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@event-driven-io/core", - "version": "0.26.0", + "version": "0.34.0", "workspaces": [ "packages/emmett-shims", "packages/emmett", @@ -62,8 +62,9 @@ }, "node_modules/@algolia/autocomplete-core": { "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.7.tgz", + "integrity": "sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==", "dev": true, - "license": "MIT", "dependencies": { "@algolia/autocomplete-plugin-algolia-insights": "1.17.7", "@algolia/autocomplete-shared": "1.17.7" @@ -71,8 +72,9 @@ }, "node_modules/@algolia/autocomplete-plugin-algolia-insights": { "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.7.tgz", + "integrity": "sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==", "dev": true, - "license": "MIT", "dependencies": { "@algolia/autocomplete-shared": "1.17.7" }, @@ -82,8 +84,9 @@ }, "node_modules/@algolia/autocomplete-preset-algolia": { "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.7.tgz", + "integrity": "sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==", "dev": true, - "license": "MIT", "dependencies": { "@algolia/autocomplete-shared": "1.17.7" }, @@ -94,175 +97,189 @@ }, "node_modules/@algolia/autocomplete-shared": { "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.7.tgz", + "integrity": "sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==", "dev": true, - "license": "MIT", "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", "algoliasearch": ">= 4.9.1 < 6" } }, "node_modules/@algolia/client-abtesting": { - "version": "5.18.0", + "version": "5.20.2", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.20.2.tgz", + "integrity": "sha512-IS8JSFsDD33haaKIIFaL7qj3bEIG9GldZfb3ILW0QF3at7TcrIJYy58hrDvFee5T3p3E2aH/+wqIr0eha8jB/w==", "dev": true, - "license": "MIT", "dependencies": { - "@algolia/client-common": "5.18.0", - "@algolia/requester-browser-xhr": "5.18.0", - "@algolia/requester-fetch": "5.18.0", - "@algolia/requester-node-http": "5.18.0" + "@algolia/client-common": "5.20.2", + "@algolia/requester-browser-xhr": "5.20.2", + "@algolia/requester-fetch": "5.20.2", + "@algolia/requester-node-http": "5.20.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-analytics": { - "version": "5.18.0", + "version": "5.20.2", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.20.2.tgz", + "integrity": "sha512-k0KxCfcX/HZySqPasKy6GkiiDuebaMh2v/nE0HHg1PbsyeyagLapDi6Ktjkxhz8NlUq6eTJR+ddGJegippKQtQ==", "dev": true, - "license": "MIT", "dependencies": { - "@algolia/client-common": "5.18.0", - "@algolia/requester-browser-xhr": "5.18.0", - "@algolia/requester-fetch": "5.18.0", - "@algolia/requester-node-http": "5.18.0" + "@algolia/client-common": "5.20.2", + "@algolia/requester-browser-xhr": "5.20.2", + "@algolia/requester-fetch": "5.20.2", + "@algolia/requester-node-http": "5.20.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-common": { - "version": "5.18.0", + "version": "5.20.2", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.20.2.tgz", + "integrity": "sha512-xoZcL/Uu49KYDb3feu2n06gALD17p5CslO8Zk3mZ7+uTurK3lgjLws7LNetZ172Ap/GpzPCRXI83d2iDoYQD6Q==", "dev": true, - "license": "MIT", "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-insights": { - "version": "5.18.0", + "version": "5.20.2", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.20.2.tgz", + "integrity": "sha512-fy7aCbo9y7WHt/9G03EYc471Dd5kIaM8PNP4z6AEQYr9a9X8c4inwNs6tePxAEfRHwVQi0CZ7kuVdn6/MjWx1A==", "dev": true, - "license": "MIT", "dependencies": { - "@algolia/client-common": "5.18.0", - "@algolia/requester-browser-xhr": "5.18.0", - "@algolia/requester-fetch": "5.18.0", - "@algolia/requester-node-http": "5.18.0" + "@algolia/client-common": "5.20.2", + "@algolia/requester-browser-xhr": "5.20.2", + "@algolia/requester-fetch": "5.20.2", + "@algolia/requester-node-http": "5.20.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-personalization": { - "version": "5.18.0", + "version": "5.20.2", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.20.2.tgz", + "integrity": "sha512-ocL1ZXulfuXzJAwsKw2kMscKMD0rs/f4CFYu6Gjh4mK4um6rGfa1a6u1MSc4swFqRQer0wNP9Pi+kVfKhuKt5A==", "dev": true, - "license": "MIT", "dependencies": { - "@algolia/client-common": "5.18.0", - "@algolia/requester-browser-xhr": "5.18.0", - "@algolia/requester-fetch": "5.18.0", - "@algolia/requester-node-http": "5.18.0" + "@algolia/client-common": "5.20.2", + "@algolia/requester-browser-xhr": "5.20.2", + "@algolia/requester-fetch": "5.20.2", + "@algolia/requester-node-http": "5.20.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-query-suggestions": { - "version": "5.18.0", + "version": "5.20.2", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.20.2.tgz", + "integrity": "sha512-Xjs4Tj1zkLCnmq1ys8RRhLQPy002I6GuT/nbHVdSQmQu4yKCI0gOFbwxHdM6yYPEuE3cJx7A4wSQjCH21mUKsg==", "dev": true, - "license": "MIT", "dependencies": { - "@algolia/client-common": "5.18.0", - "@algolia/requester-browser-xhr": "5.18.0", - "@algolia/requester-fetch": "5.18.0", - "@algolia/requester-node-http": "5.18.0" + "@algolia/client-common": "5.20.2", + "@algolia/requester-browser-xhr": "5.20.2", + "@algolia/requester-fetch": "5.20.2", + "@algolia/requester-node-http": "5.20.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-search": { - "version": "5.18.0", + "version": "5.20.2", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.20.2.tgz", + "integrity": "sha512-2cD3RGB5byusLS0DAX1Nvl5MLiv7OoGgQrRs+94dTalqjvK8lGKzxxJhXoVojgx2qcROyIUAIDXFdTqv6NIHaA==", "dev": true, - "license": "MIT", "dependencies": { - "@algolia/client-common": "5.18.0", - "@algolia/requester-browser-xhr": "5.18.0", - "@algolia/requester-fetch": "5.18.0", - "@algolia/requester-node-http": "5.18.0" + "@algolia/client-common": "5.20.2", + "@algolia/requester-browser-xhr": "5.20.2", + "@algolia/requester-fetch": "5.20.2", + "@algolia/requester-node-http": "5.20.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/ingestion": { - "version": "1.18.0", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.20.2.tgz", + "integrity": "sha512-S593Kmhc98+5zdzGet4GrZEBEBGl4vVtqg/MPfW8dCRf9qDRNYSkhBsIzlhQe9JWiohe9oB9LW5meibwOgRmww==", "dev": true, - "license": "MIT", "dependencies": { - "@algolia/client-common": "5.18.0", - "@algolia/requester-browser-xhr": "5.18.0", - "@algolia/requester-fetch": "5.18.0", - "@algolia/requester-node-http": "5.18.0" + "@algolia/client-common": "5.20.2", + "@algolia/requester-browser-xhr": "5.20.2", + "@algolia/requester-fetch": "5.20.2", + "@algolia/requester-node-http": "5.20.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/monitoring": { - "version": "1.18.0", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.20.2.tgz", + "integrity": "sha512-bW41aWLYgBv/coJUIT85mkN3kk1VBKsM8tlwB5S/s446Mgc7r8t5TX7kA8kCR2UbwDedOK51i/85/x/rM0ZXbg==", "dev": true, - "license": "MIT", "dependencies": { - "@algolia/client-common": "5.18.0", - "@algolia/requester-browser-xhr": "5.18.0", - "@algolia/requester-fetch": "5.18.0", - "@algolia/requester-node-http": "5.18.0" + "@algolia/client-common": "5.20.2", + "@algolia/requester-browser-xhr": "5.20.2", + "@algolia/requester-fetch": "5.20.2", + "@algolia/requester-node-http": "5.20.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/recommend": { - "version": "5.18.0", + "version": "5.20.2", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.20.2.tgz", + "integrity": "sha512-wBMf3J1L5ogvU8p8ifHkknDXWn1zdZ2epkqpt2MkUaZynE3G77rrFU9frcO+Pu1FQJQ5xCDTKcYUUcJCDD00rg==", "dev": true, - "license": "MIT", "dependencies": { - "@algolia/client-common": "5.18.0", - "@algolia/requester-browser-xhr": "5.18.0", - "@algolia/requester-fetch": "5.18.0", - "@algolia/requester-node-http": "5.18.0" + "@algolia/client-common": "5.20.2", + "@algolia/requester-browser-xhr": "5.20.2", + "@algolia/requester-fetch": "5.20.2", + "@algolia/requester-node-http": "5.20.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "5.18.0", + "version": "5.20.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.20.2.tgz", + "integrity": "sha512-w+VMzOkIq2XDGg6Ybzr74RlBZvJQnuIdKpVusQSXCXknvxwAwbO457LmoavhZWl06Lcsk9YDx1X2k0zb+iJQmw==", "dev": true, - "license": "MIT", "dependencies": { - "@algolia/client-common": "5.18.0" + "@algolia/client-common": "5.20.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-fetch": { - "version": "5.18.0", + "version": "5.20.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.20.2.tgz", + "integrity": "sha512-wpjnbvbi3A13b0DvijE45DRYDvwcP5Ttz7RTMkPWTkF1s6AHuo6O2UcwGyaogMAGa1QOOzFYfp5u4YQwMOQx5g==", "dev": true, - "license": "MIT", "dependencies": { - "@algolia/client-common": "5.18.0" + "@algolia/client-common": "5.20.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-node-http": { - "version": "5.18.0", + "version": "5.20.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.20.2.tgz", + "integrity": "sha512-YuSSdtgUt1dFBTNYUb+2TA5j0Hd0eDXE0bVISjUvTCqmoaGsGLwW+rKI7p1eLQ1r7RESwBAvUwcY1qP2Wl3Lyw==", "dev": true, - "license": "MIT", "dependencies": { - "@algolia/client-common": "5.18.0" + "@algolia/client-common": "5.20.2" }, "engines": { "node": ">= 14.0.0" @@ -270,26 +287,29 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.3", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.8.tgz", + "integrity": "sha512-TZIQ25pkSoaKEYYaHbbxkfL36GNsQ6iFiBbeuzAkLnXayKR1yP1zFe+NxuZWWsUyvt8icPU9CCq0sgWGXR1GEw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.26.3" + "@babel/types": "^7.26.8" }, "bin": { "parser": "bin/babel-parser.js" @@ -299,9 +319,10 @@ } }, "node_modules/@babel/types": { - "version": "7.26.3", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.8.tgz", + "integrity": "sha512-eUuWapzEGWFEpHFxgEaBG8e3n6S8L3MSu0oda755rOfabWPnh0Our1AozNFVUxGFIhbKgd1ksprsoDGMinTOTA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" @@ -312,11 +333,13 @@ }, "node_modules/@balena/dockerignore": { "version": "1.0.2", - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/@balena/dockerignore/-/dockerignore-1.0.2.tgz", + "integrity": "sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==" }, "node_modules/@colors/colors": { "version": "1.5.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "optional": true, "peer": true, "engines": { @@ -325,7 +348,8 @@ }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -335,13 +359,15 @@ }, "node_modules/@docsearch/css": { "version": "3.8.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.8.2.tgz", + "integrity": "sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==", + "dev": true }, "node_modules/@docsearch/js": { "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.8.2.tgz", + "integrity": "sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ==", "dev": true, - "license": "MIT", "dependencies": { "@docsearch/react": "3.8.2", "preact": "^10.0.0" @@ -349,8 +375,9 @@ }, "node_modules/@docsearch/react": { "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.8.2.tgz", + "integrity": "sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg==", "dev": true, - "license": "MIT", "dependencies": { "@algolia/autocomplete-core": "1.17.7", "@algolia/autocomplete-preset-algolia": "1.17.7", @@ -378,1207 +405,1975 @@ } } }, - "node_modules/@esbuild/linux-x64": { + "node_modules/@esbuild/aix-ppc64": { "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", "cpu": [ - "x64" + "ppc64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ - "linux" + "aix" ], "engines": { "node": ">=18" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.1", + "node_modules/@esbuild/android-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", + "cpu": [ + "arm" + ], "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "node": ">=18" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", + "node_modules/@esbuild/android-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=18" } }, - "node_modules/@eslint/config-array": { - "version": "0.19.1", + "node_modules/@esbuild/android-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", + "cpu": [ + "x64" + ], "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.5", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=18" } }, - "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.11", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.2", + "node_modules/@esbuild/darwin-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", + "cpu": [ + "x64" + ], "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "*" + "node": ">=18" } }, - "node_modules/@eslint/core": { - "version": "0.9.1", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=18" } }, - "node_modules/@eslint/eslintrc": { - "version": "3.2.0", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=18" } }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", + "node_modules/@esbuild/linux-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", + "cpu": [ + "arm" + ], "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", + "node_modules/@esbuild/linux-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "*" + "node": ">=18" } }, - "node_modules/@eslint/js": { - "version": "9.17.0", + "node_modules/@esbuild/linux-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", + "cpu": [ + "ia32" + ], "dev": true, - "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=18" } }, - "node_modules/@eslint/object-schema": { - "version": "2.1.5", + "node_modules/@esbuild/linux-loong64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", + "cpu": [ + "loong64" + ], "dev": true, - "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=18" } }, - "node_modules/@eslint/plugin-kit": { - "version": "0.2.4", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", + "cpu": [ + "mips64el" + ], "dev": true, - "license": "Apache-2.0", - "dependencies": { - "levn": "^0.4.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=18" } }, - "node_modules/@event-driven-io/dumbo": { - "version": "0.12.1", - "peer": true, - "peerDependencies": { - "@types/pg": "^8.11.6", - "@types/uuid": "^10.0.0", - "pg": "^8.12.0", - "pg-connection-string": "^2.6.4", - "uuid": "^10.0.0" + "node_modules/@esbuild/linux-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@event-driven-io/emmett": { - "resolved": "packages/emmett", - "link": true + "node_modules/@esbuild/linux-riscv64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@event-driven-io/emmett-esdb": { - "resolved": "packages/emmett-esdb", - "link": true + "node_modules/@esbuild/linux-s390x": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@event-driven-io/emmett-expressjs": { - "resolved": "packages/emmett-expressjs", - "link": true - }, - "node_modules/@event-driven-io/emmett-fastify": { - "resolved": "packages/emmett-fastify", - "link": true - }, - "node_modules/@event-driven-io/emmett-mongodb": { - "resolved": "packages/emmett-mongodb", - "link": true - }, - "node_modules/@event-driven-io/emmett-postgresql": { - "resolved": "packages/emmett-postgresql", - "link": true - }, - "node_modules/@event-driven-io/emmett-shims": { - "resolved": "packages/emmett-shims", - "link": true - }, - "node_modules/@event-driven-io/emmett-sqlite": { - "resolved": "packages/emmett-sqlite", - "link": true - }, - "node_modules/@event-driven-io/emmett-testcontainers": { - "resolved": "packages/emmett-testcontainers", - "link": true + "node_modules/@esbuild/linux-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@event-driven-io/emmett-tests": { - "resolved": "packages/emmett-tests", - "link": true + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@event-driven-io/pongo": { - "version": "0.16.4", - "peer": true, - "bin": { - "pongo": "dist/cli.js" - }, - "peerDependencies": { - "@event-driven-io/dumbo": "0.12.1", - "@types/mongodb": "^4.0.7", - "@types/pg": "^8.11.6", - "@types/uuid": "^10.0.0", - "ansis": "^3.3.2", - "cli-table3": "^0.6.5", - "commander": "^12.1.0", - "pg": "^8.12.0", - "pg-connection-string": "^2.6.4", - "uuid": "^10.0.0" + "node_modules/@esbuild/netbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@eventstore/db-client": { - "version": "6.2.1", - "license": "Apache-2.0", - "dependencies": { - "@grpc/grpc-js": "^1.9.12", - "@types/debug": "^4.1.12", - "@types/google-protobuf": "^3.15.12", - "@types/node": "^16.18.67", - "debug": "^4.3.2", - "google-protobuf": "^3.21.2", - "uuid": "^8.3.2" - }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": "^12.18.3 || >=14" + "node": ">=18" } }, - "node_modules/@eventstore/db-client/node_modules/@types/node": { - "version": "16.18.123", - "license": "MIT" + "node_modules/@esbuild/openbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@eventstore/db-client/node_modules/uuid": { - "version": "8.3.2", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" + "node_modules/@esbuild/sunos-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@faker-js/faker": { - "version": "8.4.1", + "node_modules/@esbuild/win32-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", + "cpu": [ + "arm64" + ], "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/fakerjs" - } + "optional": true, + "os": [ + "win32" ], - "license": "MIT", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=6.14.13" + "node": ">=18" } }, - "node_modules/@fastify/accept-negotiator": { - "version": "1.1.0", - "license": "MIT", - "peer": true, + "node_modules/@esbuild/win32-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=14" + "node": ">=18" } }, - "node_modules/@fastify/ajv-compiler": { - "version": "3.6.0", - "license": "MIT", - "peer": true, - "dependencies": { - "ajv": "^8.11.0", - "ajv-formats": "^2.1.1", - "fast-uri": "^2.0.0" + "node_modules/@esbuild/win32-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@fastify/ajv-compiler/node_modules/ajv": { - "version": "8.17.1", - "license": "MIT", - "peer": true, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@fastify/ajv-compiler/node_modules/ajv/node_modules/fast-uri": { - "version": "3.0.3", - "license": "BSD-3-Clause", - "peer": true - }, - "node_modules/@fastify/ajv-compiler/node_modules/json-schema-traverse": { - "version": "1.0.0", - "license": "MIT", - "peer": true - }, - "node_modules/@fastify/busboy": { - "version": "2.1.1", - "license": "MIT", + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, "engines": { - "node": ">=14" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@fastify/compress": { - "version": "7.0.3", - "license": "MIT", - "peer": true, + "node_modules/@eslint/config-array": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz", + "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==", + "dev": true, "dependencies": { - "@fastify/accept-negotiator": "^1.1.0", - "fastify-plugin": "^4.5.0", - "mime-db": "^1.52.0", - "minipass": "^7.0.2", - "peek-stream": "^1.1.3", - "pump": "^3.0.0", - "pumpify": "^2.0.1", - "readable-stream": "^4.5.2" + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@fastify/compress/node_modules/buffer": { - "version": "6.0.3", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "peer": true, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@fastify/compress/node_modules/duplexify": { - "version": "4.1.3", - "license": "MIT", - "peer": true, - "dependencies": { - "end-of-stream": "^1.4.1", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1", - "stream-shift": "^1.0.2" - } - }, - "node_modules/@fastify/compress/node_modules/duplexify/node_modules/readable-stream": { - "version": "3.6.2", - "license": "MIT", - "peer": true, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/@fastify/compress/node_modules/events": { - "version": "3.3.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/@fastify/compress/node_modules/pumpify": { - "version": "2.0.1", - "license": "MIT", - "peer": true, - "dependencies": { - "duplexify": "^4.1.1", - "inherits": "^2.0.3", - "pump": "^3.0.0" + "node": "*" } }, - "node_modules/@fastify/compress/node_modules/readable-stream": { - "version": "4.6.0", - "license": "MIT", - "peer": true, + "node_modules/@eslint/core": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.11.0.tgz", + "integrity": "sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==", + "dev": true, "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" + "@types/json-schema": "^7.0.15" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@fastify/error": { - "version": "3.4.1", - "license": "MIT", - "peer": true - }, - "node_modules/@fastify/etag": { - "version": "5.2.0", - "license": "MIT", - "peer": true, - "dependencies": { - "fastify-plugin": "^4.0.0" - } - }, - "node_modules/@fastify/fast-json-stringify-compiler": { - "version": "4.3.0", - "license": "MIT", - "peer": true, - "dependencies": { - "fast-json-stringify": "^5.7.0" - } - }, - "node_modules/@fastify/formbody": { - "version": "7.4.0", - "license": "MIT", - "peer": true, - "dependencies": { - "fast-querystring": "^1.0.0", - "fastify-plugin": "^4.0.0" - } - }, - "node_modules/@fastify/merge-json-schemas": { - "version": "0.1.1", - "license": "MIT", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/@grpc/grpc-js": { - "version": "1.12.5", - "license": "Apache-2.0", + "node_modules/@eslint/eslintrc": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", + "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", + "dev": true, "dependencies": { - "@grpc/proto-loader": "^0.7.13", - "@js-sdsl/ordered-map": "^4.4.2" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": ">=12.10.0" - } - }, - "node_modules/@grpc/proto-loader": { - "version": "0.7.13", - "license": "Apache-2.0", - "dependencies": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.2.5", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "engines": { - "node": ">=6" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@humanfs/core": { - "version": "0.19.1", + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@humanfs/node": { - "version": "0.16.6", + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "node": "*" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", + "node_modules/@eslint/js": { + "version": "9.20.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.20.0.tgz", + "integrity": "sha512-iZA07H9io9Wn836aVTytRaNqh00Sad+EamwOVJT12GTLw1VGMFV/4JaME+JjLtr9fiGaoWgYnS54wrfWsSs4oQ==", "dev": true, - "license": "Apache-2.0", "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.1", + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", "dev": true, - "license": "Apache-2.0", "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@iconify-json/simple-icons": { - "version": "1.2.18", - "dev": true, - "license": "CC0-1.0", - "dependencies": { - "@iconify/types": "*" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@iconify/types": { - "version": "2.0.0", + "node_modules/@eslint/plugin-kit": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.5.tgz", + "integrity": "sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==", "dev": true, - "license": "MIT" - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "license": "MIT", "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "@eslint/core": "^0.10.0", + "levn": "^0.4.1" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", + "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.10.0.tgz", + "integrity": "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==", "dev": true, - "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" + "@types/json-schema": "^7.0.15" }, "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "license": "MIT", - "engines": { - "node": ">=6.0.0" + "node_modules/@event-driven-io/dumbo": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/@event-driven-io/dumbo/-/dumbo-0.12.1.tgz", + "integrity": "sha512-8VedrRpH+NDoiLR0HkILf+8Wt/IIoP64VJBOvF9mmex0pJhKy2OmIEQUTgzf8t62nUZNgB/iktr23UW0VIfanQ==", + "peer": true, + "peerDependencies": { + "@types/pg": "^8.11.6", + "@types/uuid": "^10.0.0", + "pg": "^8.12.0", + "pg-connection-string": "^2.6.4", + "uuid": "^10.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } + "node_modules/@event-driven-io/emmett": { + "resolved": "packages/emmett", + "link": true }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "license": "MIT" + "node_modules/@event-driven-io/emmett-esdb": { + "resolved": "packages/emmett-esdb", + "link": true }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } + "node_modules/@event-driven-io/emmett-expressjs": { + "resolved": "packages/emmett-expressjs", + "link": true }, - "node_modules/@js-sdsl/ordered-map": { - "version": "4.4.2", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } + "node_modules/@event-driven-io/emmett-fastify": { + "resolved": "packages/emmett-fastify", + "link": true }, - "node_modules/@mongodb-js/saslprep": { - "version": "1.1.9", - "license": "MIT", + "node_modules/@event-driven-io/emmett-mongodb": { + "resolved": "packages/emmett-mongodb", + "link": true + }, + "node_modules/@event-driven-io/emmett-postgresql": { + "resolved": "packages/emmett-postgresql", + "link": true + }, + "node_modules/@event-driven-io/emmett-shims": { + "resolved": "packages/emmett-shims", + "link": true + }, + "node_modules/@event-driven-io/emmett-sqlite": { + "resolved": "packages/emmett-sqlite", + "link": true + }, + "node_modules/@event-driven-io/emmett-testcontainers": { + "resolved": "packages/emmett-testcontainers", + "link": true + }, + "node_modules/@event-driven-io/emmett-tests": { + "resolved": "packages/emmett-tests", + "link": true + }, + "node_modules/@event-driven-io/pongo": { + "version": "0.16.4", + "resolved": "https://registry.npmjs.org/@event-driven-io/pongo/-/pongo-0.16.4.tgz", + "integrity": "sha512-ZaWZCTo5Y4lFHY7HgqtZlPv0PhlhTDPY9Bqr/3me46n7CikXq9G+GLaKFyi12/iqPTHB9TwS62r+8fDpUYKjnQ==", "peer": true, - "dependencies": { - "sparse-bitfield": "^3.0.3" + "bin": { + "pongo": "dist/cli.js" + }, + "peerDependencies": { + "@event-driven-io/dumbo": "0.12.1", + "@types/mongodb": "^4.0.7", + "@types/pg": "^8.11.6", + "@types/uuid": "^10.0.0", + "ansis": "^3.3.2", + "cli-table3": "^0.6.5", + "commander": "^12.1.0", + "pg": "^8.12.0", + "pg-connection-string": "^2.6.4", + "uuid": "^10.0.0" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "dev": true, - "license": "MIT", + "node_modules/@eventstore/db-client": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@eventstore/db-client/-/db-client-6.2.1.tgz", + "integrity": "sha512-utUkIO3Ns9TzTHOTDg+eVTm2Z/Jj5X3VT/otZEWwgmOm7CgSnrWdOxEsAN1jfMht7oVBRB5iGHYFGA3IiQm/Ng==", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@grpc/grpc-js": "^1.9.12", + "@types/debug": "^4.1.12", + "@types/google-protobuf": "^3.15.12", + "@types/node": "^16.18.67", + "debug": "^4.3.2", + "google-protobuf": "^3.21.2", + "uuid": "^8.3.2" }, "engines": { - "node": ">= 8" + "node": "^12.18.3 || >=14" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", + "node_modules/@eventstore/db-client/node_modules/@types/node": { + "version": "16.18.126", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.126.tgz", + "integrity": "sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==" + }, + "node_modules/@eventstore/db-client/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@faker-js/faker": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-8.4.1.tgz", + "integrity": "sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg==", "dev": true, - "license": "MIT", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/fakerjs" + } + ], "engines": { - "node": ">= 8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0", + "npm": ">=6.14.13" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, + "node_modules/@fastify/accept-negotiator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@fastify/accept-negotiator/-/accept-negotiator-1.1.0.tgz", + "integrity": "sha512-OIHZrb2ImZ7XG85HXOONLcJWGosv7sIvM2ifAPQVhg9Lv7qdmMBNVaai4QTdyuaqbKM5eO6sLSQOYI7wEQeCJQ==", + "peer": true, "engines": { - "node": ">= 8" + "node": ">=14" } }, - "node_modules/@npmcli/fs": { - "version": "1.1.1", - "license": "ISC", - "optional": true, + "node_modules/@fastify/ajv-compiler": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-3.6.0.tgz", + "integrity": "sha512-LwdXQJjmMD+GwLOkP7TVC68qa+pSSogeWWmznRJ/coyTcfe9qA05AHFSe1eZFwK6q+xVRpChnvFUkf1iYaSZsQ==", "peer": true, "dependencies": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" + "ajv": "^8.11.0", + "ajv-formats": "^2.1.1", + "fast-uri": "^2.0.0" } }, - "node_modules/@npmcli/move-file": { - "version": "1.1.2", - "license": "MIT", - "optional": true, + "node_modules/@fastify/ajv-compiler/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "peer": true, "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, - "engines": { - "node": ">=10" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "license": "MIT", - "optional": true, + "node_modules/@fastify/ajv-compiler/node_modules/ajv/node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "peer": true + }, + "node_modules/@fastify/ajv-compiler/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "peer": true + }, + "node_modules/@fastify/busboy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", "engines": { "node": ">=14" } }, - "node_modules/@pkgr/core": { - "version": "0.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" + "node_modules/@fastify/compress": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@fastify/compress/-/compress-7.0.3.tgz", + "integrity": "sha512-xa9fo5/DgK1s0bkS6xrYgNn8HmofO5tJvbCDk8QuXshSgLd2cFZANv1ox/Qv7zswS7JroHwTlCVv/XGTVO98tg==", + "peer": true, + "dependencies": { + "@fastify/accept-negotiator": "^1.1.0", + "fastify-plugin": "^4.5.0", + "mime-db": "^1.52.0", + "minipass": "^7.0.2", + "peek-stream": "^1.1.3", + "pump": "^3.0.0", + "pumpify": "^2.0.1", + "readable-stream": "^4.5.2" } }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "license": "BSD-3-Clause", + "node_modules/@fastify/compress/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peer": true, "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "license": "BSD-3-Clause" + "node_modules/@fastify/compress/node_modules/duplexify": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", + "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", + "peer": true, + "dependencies": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.2" + } }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "license": "BSD-3-Clause" - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.29.1", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.29.1", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@shikijs/core": { - "version": "1.26.0", - "dev": true, - "license": "MIT", + "node_modules/@fastify/compress/node_modules/duplexify/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "peer": true, "dependencies": { - "@shikijs/engine-javascript": "1.26.0", - "@shikijs/engine-oniguruma": "1.26.0", - "@shikijs/types": "1.26.0", - "@shikijs/vscode-textmate": "^10.0.1", - "@types/hast": "^3.0.4", - "hast-util-to-html": "^9.0.4" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/@shikijs/engine-javascript": { - "version": "1.26.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/types": "1.26.0", - "@shikijs/vscode-textmate": "^10.0.1", - "oniguruma-to-es": "0.10.0" + "node_modules/@fastify/compress/node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "peer": true, + "engines": { + "node": ">=0.8.x" } }, - "node_modules/@shikijs/engine-oniguruma": { - "version": "1.26.0", - "dev": true, - "license": "MIT", + "node_modules/@fastify/compress/node_modules/pumpify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-2.0.1.tgz", + "integrity": "sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==", + "peer": true, "dependencies": { - "@shikijs/types": "1.26.0", - "@shikijs/vscode-textmate": "^10.0.1" + "duplexify": "^4.1.1", + "inherits": "^2.0.3", + "pump": "^3.0.0" } }, - "node_modules/@shikijs/langs": { - "version": "1.26.0", - "dev": true, - "license": "MIT", + "node_modules/@fastify/compress/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "peer": true, "dependencies": { - "@shikijs/types": "1.26.0" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@shikijs/themes": { - "version": "1.26.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/types": "1.26.0" - } + "node_modules/@fastify/error": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.4.1.tgz", + "integrity": "sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==", + "peer": true }, - "node_modules/@shikijs/transformers": { - "version": "1.26.0", - "dev": true, - "license": "MIT", + "node_modules/@fastify/etag": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@fastify/etag/-/etag-5.2.0.tgz", + "integrity": "sha512-8uFpxgMCH2Q91j6Ty5aMOTdfEy2azu+elLR9leMlYWrk5pN+NbM30riVjgr42jj0Mm6VOvtXhSMVLL7zVxaRXQ==", + "peer": true, "dependencies": { - "shiki": "1.26.0" + "fastify-plugin": "^4.0.0" } }, - "node_modules/@shikijs/types": { - "version": "1.26.0", - "dev": true, - "license": "MIT", + "node_modules/@fastify/fast-json-stringify-compiler": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.3.0.tgz", + "integrity": "sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==", + "peer": true, "dependencies": { - "@shikijs/vscode-textmate": "^10.0.1", - "@types/hast": "^3.0.4" + "fast-json-stringify": "^5.7.0" } }, - "node_modules/@shikijs/vscode-textmate": { - "version": "10.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@testcontainers/mongodb": { - "version": "10.16.0", - "license": "MIT", + "node_modules/@fastify/formbody": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@fastify/formbody/-/formbody-7.4.0.tgz", + "integrity": "sha512-H3C6h1GN56/SMrZS8N2vCT2cZr7mIHzBHzOBa5OPpjfB/D6FzP9mMpE02ZzrFX0ANeh0BAJdoXKOF2e7IbV+Og==", + "peer": true, "dependencies": { - "testcontainers": "^10.16.0" + "fast-querystring": "^1.0.0", + "fastify-plugin": "^4.0.0" } }, - "node_modules/@testcontainers/postgresql": { - "version": "10.16.0", - "license": "MIT", + "node_modules/@fastify/merge-json-schemas": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.1.1.tgz", + "integrity": "sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==", + "peer": true, "dependencies": { - "testcontainers": "^10.16.0" + "fast-deep-equal": "^3.1.3" } }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "license": "MIT", + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", "optional": true, - "peer": true, + "peer": true + }, + "node_modules/@grpc/grpc-js": { + "version": "1.12.6", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.12.6.tgz", + "integrity": "sha512-JXUj6PI0oqqzTGvKtzOkxtpsyPRNsrmhh41TtIz/zEB6J+AUiZZ0dxWzcMwO9Ns5rmSPuMdghlTbUuqIM48d3Q==", + "dependencies": { + "@grpc/proto-loader": "^0.7.13", + "@js-sdsl/ordered-map": "^4.4.2" + }, "engines": { - "node": ">= 6" + "node": ">=12.10.0" } }, - "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "license": "MIT" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "license": "MIT" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "license": "MIT" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "license": "MIT" - }, - "node_modules/@types/async-retry": { - "version": "1.4.9", - "license": "MIT", - "peer": true, + "node_modules/@grpc/proto-loader": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", + "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", "dependencies": { - "@types/retry": "*" + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" } }, - "node_modules/@types/benchmark": { - "version": "2.1.5", - "license": "MIT" - }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/connect": "*", - "@types/node": "*" + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "engines": { + "node": ">=18.18.0" } }, - "node_modules/@types/connect": { - "version": "3.4.38", - "license": "MIT", - "peer": true, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, "dependencies": { - "@types/node": "*" + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" } }, - "node_modules/@types/cookiejar": { - "version": "2.1.5", - "license": "MIT", - "peer": true + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } }, - "node_modules/@types/debug": { - "version": "4.1.12", - "license": "MIT", - "dependencies": { - "@types/ms": "*" + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@types/docker-modem": { - "version": "3.0.6", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/ssh2": "*" + "node_modules/@humanwhocodes/retry": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", + "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", + "dev": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@types/dockerode": { - "version": "3.3.33", - "license": "MIT", + "node_modules/@iconify-json/simple-icons": { + "version": "1.2.24", + "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.24.tgz", + "integrity": "sha512-06ZWXZx3PHCE+02zn+iIGOKKNgE3kyPd0Yh7IUEIa0bCYI6UmGlsYYghRx8As9TnTNYMCEiy5V0zI4Jb6EY6XA==", + "dev": true, "dependencies": { - "@types/docker-modem": "*", - "@types/node": "*", - "@types/ssh2": "*" + "@iconify/types": "*" } }, - "node_modules/@types/estree": { - "version": "1.0.6", - "dev": true, - "license": "MIT" + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "dev": true }, - "node_modules/@types/express": { - "version": "4.17.21", - "license": "MIT", - "peer": true, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" } }, - "node_modules/@types/express-serve-static-core": { - "version": "4.19.6", - "license": "MIT", - "peer": true, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@types/google-protobuf": { - "version": "3.15.12", - "license": "MIT" - }, - "node_modules/@types/hast": { - "version": "3.0.4", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, - "license": "MIT", "dependencies": { - "@types/unist": "*" + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "license": "MIT", - "peer": true - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/linkify-it": { - "version": "5.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/markdown-it": { - "version": "14.1.2", + "node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, - "license": "MIT", "dependencies": { - "@types/linkify-it": "^5", - "@types/mdurl": "^2" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@types/mdast": { - "version": "4.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "*" + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@types/mdurl": { - "version": "2.0.0", + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, - "license": "MIT" - }, - "node_modules/@types/methods": { - "version": "1.1.4", - "license": "MIT", - "peer": true - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "license": "MIT", - "peer": true - }, - "node_modules/@types/mongodb": { - "version": "4.0.7", - "license": "MIT", - "peer": true, - "dependencies": { - "mongodb": "*" + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@types/ms": { - "version": "0.7.34", - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "22.10.5", - "license": "MIT", - "dependencies": { - "undici-types": "~6.20.0" - } + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" }, - "node_modules/@types/pg": { - "version": "8.11.10", - "license": "MIT", - "peer": true, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dependencies": { - "@types/node": "*", - "pg-protocol": "*", - "pg-types": "^4.0.1" + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@types/qs": { - "version": "6.9.17", - "license": "MIT", - "peer": true - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "license": "MIT", - "peer": true - }, - "node_modules/@types/retry": { - "version": "0.12.5", - "license": "MIT", - "peer": true - }, - "node_modules/@types/send": { - "version": "0.17.4", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" + "node_modules/@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" } }, - "node_modules/@types/serve-static": { - "version": "1.15.7", - "license": "MIT", + "node_modules/@mongodb-js/saslprep": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.2.0.tgz", + "integrity": "sha512-+ywrb0AqkfaYuhHs6LxKWgqbh3I72EpEgESCw37o+9qPx9WTCkgDm2B+eMrwehGtHBWHFU4GXvnSCNiFhhausg==", "peer": true, "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" + "sparse-bitfield": "^3.0.3" } }, - "node_modules/@types/sqlite3": { - "version": "3.1.11", + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, - "license": "MIT", "dependencies": { - "@types/node": "*" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/@types/ssh2": { - "version": "1.15.1", - "license": "MIT", - "dependencies": { - "@types/node": "^18.11.18" + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" } }, - "node_modules/@types/ssh2-streams": { - "version": "0.1.12", - "license": "MIT", + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, "dependencies": { - "@types/node": "*" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/@types/ssh2/node_modules/@types/node": { - "version": "18.19.69", - "license": "MIT", + "node_modules/@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "optional": true, + "peer": true, "dependencies": { - "undici-types": "~5.26.4" + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" } }, - "node_modules/@types/ssh2/node_modules/undici-types": { - "version": "5.26.5", - "license": "MIT" - }, - "node_modules/@types/superagent": { - "version": "8.1.9", - "license": "MIT", + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "optional": true, "peer": true, "dependencies": { - "@types/cookiejar": "^2.1.5", - "@types/methods": "^1.1.4", - "@types/node": "*", - "form-data": "^4.0.0" + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" } }, - "node_modules/@types/supertest": { - "version": "6.0.2", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/methods": "^1.1.4", - "@types/superagent": "^8.1.0" + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" } }, - "node_modules/@types/unist": { - "version": "3.0.3", + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", "dev": true, - "license": "MIT" + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } }, - "node_modules/@types/uuid": { - "version": "10.0.0", - "license": "MIT" + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" }, - "node_modules/@types/web-bluetooth": { - "version": "0.0.20", + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.6.tgz", + "integrity": "sha512-+GcCXtOQoWuC7hhX1P00LqjjIiS/iOouHXhMdiDSnq/1DGTox4SpUvO52Xm+div6+106r+TcvOeo/cxvyEyTgg==", + "cpu": [ + "arm" + ], "dev": true, - "license": "MIT" + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.6.tgz", + "integrity": "sha512-E8+2qCIjciYUnCa1AiVF1BkRgqIGW9KzJeesQqVfyRITGQN+dFuoivO0hnro1DjT74wXLRZ7QF8MIbz+luGaJA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.6.tgz", + "integrity": "sha512-z9Ib+OzqN3DZEjX7PDQMHEhtF+t6Mi2z/ueChQPLS/qUMKY7Ybn5A2ggFoKRNRh1q1T03YTQfBTQCJZiepESAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.6.tgz", + "integrity": "sha512-PShKVY4u0FDAR7jskyFIYVyHEPCPnIQY8s5OcXkdU8mz3Y7eXDJPdyM/ZWjkYdR2m0izD9HHWA8sGcXn+Qrsyg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.6.tgz", + "integrity": "sha512-YSwyOqlDAdKqs0iKuqvRHLN4SrD2TiswfoLfvYXseKbL47ht1grQpq46MSiQAx6rQEN8o8URtpXARCpqabqxGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.6.tgz", + "integrity": "sha512-HEP4CgPAY1RxXwwL5sPFv6BBM3tVeLnshF03HMhJYCNc6kvSqBgTMmsEjb72RkZBAWIqiPUyF1JpEBv5XT9wKQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.6.tgz", + "integrity": "sha512-88fSzjC5xeH9S2Vg3rPgXJULkHcLYMkh8faix8DX4h4TIAL65ekwuQMA/g2CXq8W+NJC43V6fUpYZNjaX3+IIg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.6.tgz", + "integrity": "sha512-wM4ztnutBqYFyvNeR7Av+reWI/enK9tDOTKNF+6Kk2Q96k9bwhDDOlnCUNRPvromlVXo04riSliMBs/Z7RteEg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.6.tgz", + "integrity": "sha512-9RyprECbRa9zEjXLtvvshhw4CMrRa3K+0wcp3KME0zmBe1ILmvcVHnypZ/aIDXpRyfhSYSuN4EPdCCj5Du8FIA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.6.tgz", + "integrity": "sha512-qTmklhCTyaJSB05S+iSovfo++EwnIEZxHkzv5dep4qoszUMX5Ca4WM4zAVUMbfdviLgCSQOu5oU8YoGk1s6M9Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.6.tgz", + "integrity": "sha512-4Qmkaps9yqmpjY5pvpkfOerYgKNUGzQpFxV6rnS7c/JfYbDSU0y6WpbbredB5cCpLFGJEqYX40WUmxMkwhWCjw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.6.tgz", + "integrity": "sha512-Zsrtux3PuaxuBTX/zHdLaFmcofWGzaWW1scwLU3ZbW/X+hSsFbz9wDIp6XvnT7pzYRl9MezWqEqKy7ssmDEnuQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.6.tgz", + "integrity": "sha512-aK+Zp+CRM55iPrlyKiU3/zyhgzWBxLVrw2mwiQSYJRobCURb781+XstzvA8Gkjg/hbdQFuDw44aUOxVQFycrAg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.6.tgz", + "integrity": "sha512-WoKLVrY9ogmaYPXwTH326+ErlCIgMmsoRSx6bO+l68YgJnlOXhygDYSZe/qbUJCSiCiZAQ+tKm88NcWuUXqOzw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.6.tgz", + "integrity": "sha512-Sht4aFvmA4ToHd2vFzwMFaQCiYm2lDFho5rPcvPBT5pCdC+GwHG6CMch4GQfmWTQ1SwRKS0dhDYb54khSrjDWw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.6.tgz", + "integrity": "sha512-zmmpOQh8vXc2QITsnCiODCDGXFC8LMi64+/oPpPx5qz3pqv0s6x46ps4xoycfUiVZps5PFn1gksZzo4RGTKT+A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.6.tgz", + "integrity": "sha512-3/q1qUsO/tLqGBaD4uXsB6coVGB3usxw3qyeVb59aArCgedSF66MPdgRStUd7vbZOsko/CgVaY5fo2vkvPLWiA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.6.tgz", + "integrity": "sha512-oLHxuyywc6efdKVTxvc0135zPrRdtYVjtVD5GUm55I3ODxhU/PwkQFD97z16Xzxa1Fz0AEe4W/2hzRtd+IfpOA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.6.tgz", + "integrity": "sha512-0PVwmgzZ8+TZ9oGBmdZoQVXflbvuwzN/HRclujpl4N/q3i+y0lqLw8n1bXA8ru3sApDjlmONaNAuYr38y1Kr9w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-2.3.2.tgz", + "integrity": "sha512-s7vyL3LzUKm3Qwf36zRWlavX9BQMZTIq9B1almM63M5xBuSldnsTHCmsXzoF/Kyw4k7Xgas7yAyJz9VR/vcP1A==", + "dev": true, + "dependencies": { + "@shikijs/engine-javascript": "2.3.2", + "@shikijs/engine-oniguruma": "2.3.2", + "@shikijs/types": "2.3.2", + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.4" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-2.3.2.tgz", + "integrity": "sha512-w3IEMu5HfL/OaJTsMbIfZ1HRPnWVYRANeDtmsdIIEgUOcLjzFJFQwlnkckGjKHekEzNqlMLbgB/twnfZ/EEAGg==", + "dev": true, + "dependencies": { + "@shikijs/types": "2.3.2", + "@shikijs/vscode-textmate": "^10.0.1", + "oniguruma-to-es": "^3.1.0" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-2.3.2.tgz", + "integrity": "sha512-vikMY1TroyZXUHIXbMnvY/mjtOxMn+tavcfAeQPgWS9FHcgFSUoEtywF5B5sOLb9NXb8P2vb7odkh3nj15/00A==", + "dev": true, + "dependencies": { + "@shikijs/types": "2.3.2", + "@shikijs/vscode-textmate": "^10.0.1" + } + }, + "node_modules/@shikijs/langs": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-2.3.2.tgz", + "integrity": "sha512-UqI6bSxFzhexIJficZLKeB1L2Sc3xoNiAV0yHpfbg5meck93du+EKQtsGbBv66Ki53XZPhnR/kYkOr85elIuFw==", + "dev": true, + "dependencies": { + "@shikijs/types": "2.3.2" + } + }, + "node_modules/@shikijs/themes": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-2.3.2.tgz", + "integrity": "sha512-QAh7D/hhfYKHibkG2tti8vxNt3ekAH5EqkXJeJbTh7FGvTCWEI7BHqNCtMdjFvZ0vav5nvUgdvA7/HI7pfsB4w==", + "dev": true, + "dependencies": { + "@shikijs/types": "2.3.2" + } + }, + "node_modules/@shikijs/transformers": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-2.3.2.tgz", + "integrity": "sha512-2HDnJumw8A/9GecRpTgvfqSbPjEbJ4DPWq5J++OVP1gNMLvbV0MqFsP4canqRNM1LqB7VmWY45Stipb0ZIJ+0A==", + "dev": true, + "dependencies": { + "@shikijs/core": "2.3.2", + "@shikijs/types": "2.3.2" + } + }, + "node_modules/@shikijs/types": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-2.3.2.tgz", + "integrity": "sha512-CBaMY+a3pepyC4SETi7+bSzO0f6hxEQJUUuS4uD7zppzjmrN4ZRtBqxaT+wOan26CR9eeJ5iBhc4qvWEwn7Eeg==", + "dev": true, + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.1.tgz", + "integrity": "sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg==", + "dev": true + }, + "node_modules/@testcontainers/mongodb": { + "version": "10.18.0", + "resolved": "https://registry.npmjs.org/@testcontainers/mongodb/-/mongodb-10.18.0.tgz", + "integrity": "sha512-KpcGo6r4vu+2zoYQE4rii9aj8Sv/lVyGnoSyvFtQjcpjOvQgF2U0BqwgpmyScJ5VqKHdY++ekLVAzPN5p6RYXg==", + "dependencies": { + "testcontainers": "^10.18.0" + } + }, + "node_modules/@testcontainers/postgresql": { + "version": "10.18.0", + "resolved": "https://registry.npmjs.org/@testcontainers/postgresql/-/postgresql-10.18.0.tgz", + "integrity": "sha512-WxkE/tBlBpoKvqDEqL3i/mL6BOBWnXb8FXKtLhEeZ3lSt0zlldkTozMmewNsKJtFTBZdv7uFwMzWyXP12t0sxQ==", + "dependencies": { + "testcontainers": "^10.18.0" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "optional": true, + "peer": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" + }, + "node_modules/@types/async-retry": { + "version": "1.4.9", + "resolved": "https://registry.npmjs.org/@types/async-retry/-/async-retry-1.4.9.tgz", + "integrity": "sha512-s1ciZQJzRh3708X/m3vPExr5KJlzlZJvXsKpbtE2luqNcbROr64qU+3KpJsYHqWMeaxI839OvXf9PrUSw1Xtyg==", + "peer": true, + "dependencies": { + "@types/retry": "*" + } + }, + "node_modules/@types/benchmark": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@types/benchmark/-/benchmark-2.1.5.tgz", + "integrity": "sha512-cKio2eFB3v7qmKcvIHLUMw/dIx/8bhWPuzpzRT4unCPRTD8VdA9Zb0afxpcxOqR4PixRS7yT42FqGS8BYL8g1w==" + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "peer": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "peer": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cookiejar": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz", + "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==", + "peer": true + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/docker-modem": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/docker-modem/-/docker-modem-3.0.6.tgz", + "integrity": "sha512-yKpAGEuKRSS8wwx0joknWxsmLha78wNMe9R2S3UNsVOkZded8UqOrV8KoeDXoXsjndxwyF3eIhyClGbO1SEhEg==", + "dependencies": { + "@types/node": "*", + "@types/ssh2": "*" + } + }, + "node_modules/@types/dockerode": { + "version": "3.3.34", + "resolved": "https://registry.npmjs.org/@types/dockerode/-/dockerode-3.3.34.tgz", + "integrity": "sha512-mH9SuIb8NuTDsMus5epcbTzSbEo52fKLBMo0zapzYIAIyfDqoIFn7L3trekHLKC8qmxGV++pPUP4YqQ9n5v2Zg==", + "dependencies": { + "@types/docker-modem": "*", + "@types/node": "*", + "@types/ssh2": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "peer": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "peer": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/google-protobuf": { + "version": "3.15.12", + "resolved": "https://registry.npmjs.org/@types/google-protobuf/-/google-protobuf-3.15.12.tgz", + "integrity": "sha512-40um9QqwHjRS92qnOaDpL7RmDK15NuZYo9HihiJRbYkMQZlWnuH8AdvbMy8/o6lgLmKbDUKa+OALCltHdbOTpQ==" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "peer": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "dev": true + }, + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "dev": true, + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "dev": true + }, + "node_modules/@types/methods": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", + "integrity": "sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==", + "peer": true + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "peer": true + }, + "node_modules/@types/mongodb": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-4.0.7.tgz", + "integrity": "sha512-lPUYPpzA43baXqnd36cZ9xxorprybxXDzteVKCPAdp14ppHtFJHnXYvNpmBvtMUTb5fKXVv6sVbzo1LHkWhJlw==", + "deprecated": "mongodb provides its own types. @types/mongodb is no longer needed.", + "peer": true, + "dependencies": { + "mongodb": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==" + }, + "node_modules/@types/node": { + "version": "22.13.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.4.tgz", + "integrity": "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==", + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "node_modules/@types/pg": { + "version": "8.11.11", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.11.11.tgz", + "integrity": "sha512-kGT1qKM8wJQ5qlawUrEkXgvMSXoV213KfMGXcwfDwUIfUHXqXYXOfS1nE1LINRJVVVx5wCm70XnFlMHaIcQAfw==", + "peer": true, + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^4.0.1" + } + }, + "node_modules/@types/qs": { + "version": "6.9.18", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", + "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", + "peer": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "peer": true + }, + "node_modules/@types/retry": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.5.tgz", + "integrity": "sha512-3xSjTp3v03X/lSQLkczaN9UIEwJMoMCA1+Nb5HfbJEQWogdeQIyVtTvxPXDQjZ5zws8rFQfVfRdz03ARihPJgw==", + "peer": true + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "peer": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "peer": true, + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/sqlite3": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/@types/sqlite3/-/sqlite3-3.1.11.tgz", + "integrity": "sha512-KYF+QgxAnnAh7DWPdNDroxkDI3/MspH1NMx6m/N/6fT1G6+jvsw4/ZePt8R8cr7ta58aboeTfYFBDxTJ5yv15w==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ssh2": { + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/@types/ssh2/-/ssh2-1.15.4.tgz", + "integrity": "sha512-9JTQgVBWSgq6mAen6PVnrAmty1lqgCMvpfN+1Ck5WRUsyMYPa6qd50/vMJ0y1zkGpOEgLzm8m8Dx/Y5vRouLaA==", + "dependencies": { + "@types/node": "^18.11.18" + } + }, + "node_modules/@types/ssh2-streams": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/@types/ssh2-streams/-/ssh2-streams-0.1.12.tgz", + "integrity": "sha512-Sy8tpEmCce4Tq0oSOYdfqaBpA3hDM8SoxoFh5vzFsu2oL+znzGz8oVWW7xb4K920yYMUY+PIG31qZnFMfPWNCg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ssh2/node_modules/@types/node": { + "version": "18.19.76", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.76.tgz", + "integrity": "sha512-yvR7Q9LdPz2vGpmpJX5LolrgRdWvB67MJKDPSgIIzpFbaf9a1j/f5DnLp5VDyHGMR0QZHlTr1afsD87QCXFHKw==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/ssh2/node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/@types/superagent": { + "version": "8.1.9", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.9.tgz", + "integrity": "sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==", + "peer": true, + "dependencies": { + "@types/cookiejar": "^2.1.5", + "@types/methods": "^1.1.4", + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/supertest": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-6.0.2.tgz", + "integrity": "sha512-137ypx2lk/wTQbW6An6safu9hXmajAifU/s7szAHLN/FeIm5w7yR0Wkl9fdJMRSHwOn4HLAI0DaB2TOORuhPDg==", + "peer": true, + "dependencies": { + "@types/methods": "^1.1.4", + "@types/superagent": "^8.1.0" + } + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true + }, + "node_modules/@types/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==" + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", + "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", + "dev": true }, "node_modules/@types/webidl-conversions": { "version": "7.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", + "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==", "peer": true }, "node_modules/@types/whatwg-url": { "version": "11.0.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz", + "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==", "peer": true, "dependencies": { "@types/webidl-conversions": "*" } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.19.0", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.24.0.tgz", + "integrity": "sha512-aFcXEJJCI4gUdXgoo/j9udUYIHgF23MFkg09LFz2dzEmU0+1Plk4rQWv/IYKvPHAtlkkGoB3m5e6oUp+JPsNaQ==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.19.0", - "@typescript-eslint/type-utils": "8.19.0", - "@typescript-eslint/utils": "8.19.0", - "@typescript-eslint/visitor-keys": "8.19.0", + "@typescript-eslint/scope-manager": "8.24.0", + "@typescript-eslint/type-utils": "8.24.0", + "@typescript-eslint/utils": "8.24.0", + "@typescript-eslint/visitor-keys": "8.24.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.0.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1594,14 +2389,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.19.0", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.24.0.tgz", + "integrity": "sha512-MFDaO9CYiard9j9VepMNa9MTcqVvSny2N4hkY6roquzj8pdCBRENhErrteaQuu7Yjn1ppk0v1/ZF9CG3KIlrTA==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.19.0", - "@typescript-eslint/types": "8.19.0", - "@typescript-eslint/typescript-estree": "8.19.0", - "@typescript-eslint/visitor-keys": "8.19.0", + "@typescript-eslint/scope-manager": "8.24.0", + "@typescript-eslint/types": "8.24.0", + "@typescript-eslint/typescript-estree": "8.24.0", + "@typescript-eslint/visitor-keys": "8.24.0", "debug": "^4.3.4" }, "engines": { @@ -1617,12 +2413,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.19.0", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.24.0.tgz", + "integrity": "sha512-HZIX0UByphEtdVBKaQBgTDdn9z16l4aTUz8e8zPQnyxwHBtf5vtl1L+OhH+m1FGV9DrRmoDuYKqzVrvWDcDozw==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.19.0", - "@typescript-eslint/visitor-keys": "8.19.0" + "@typescript-eslint/types": "8.24.0", + "@typescript-eslint/visitor-keys": "8.24.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1633,14 +2430,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.19.0", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.24.0.tgz", + "integrity": "sha512-8fitJudrnY8aq0F1wMiPM1UUgiXQRJ5i8tFjq9kGfRajU+dbPyOuHbl0qRopLEidy0MwqgTHDt6CnSeXanNIwA==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.19.0", - "@typescript-eslint/utils": "8.19.0", + "@typescript-eslint/typescript-estree": "8.24.0", + "@typescript-eslint/utils": "8.24.0", "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.0.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1655,9 +2453,10 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.19.0", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.24.0.tgz", + "integrity": "sha512-VacJCBTyje7HGAw7xp11q439A+zeGG0p0/p2zsZwpnMzjPB5WteaWqt4g2iysgGFafrqvyLWqq6ZPZAOCoefCw==", "dev": true, - "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -1667,18 +2466,19 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.19.0", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.24.0.tgz", + "integrity": "sha512-ITjYcP0+8kbsvT9bysygfIfb+hBj6koDsu37JZG7xrCiy3fPJyNmfVtaGsgTUSEuTzcvME5YI5uyL5LD1EV5ZQ==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.19.0", - "@typescript-eslint/visitor-keys": "8.19.0", + "@typescript-eslint/types": "8.24.0", + "@typescript-eslint/visitor-keys": "8.24.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.0.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1692,14 +2492,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.19.0", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.24.0.tgz", + "integrity": "sha512-07rLuUBElvvEb1ICnafYWr4hk8/U7X9RDCOqd9JcAMtjh/9oRmcfN4yGzbPVirgMR0+HLVHehmu19CWeh7fsmQ==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.19.0", - "@typescript-eslint/types": "8.19.0", - "@typescript-eslint/typescript-estree": "8.19.0" + "@typescript-eslint/scope-manager": "8.24.0", + "@typescript-eslint/types": "8.24.0", + "@typescript-eslint/typescript-estree": "8.24.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1714,11 +2515,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.19.0", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.24.0.tgz", + "integrity": "sha512-kArLq83QxGLbuHrTMoOEWO+l2MwsNS2TGISEdx8xgqpkbytB07XmlQyQdNDrCc1ecSqx0cnmhGvpX+VBwqqSkg==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.19.0", + "@typescript-eslint/types": "8.24.0", "eslint-visitor-keys": "^4.2.0" }, "engines": { @@ -1731,8 +2533,9 @@ }, "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -1741,14 +2544,16 @@ } }, "node_modules/@ungap/structured-clone": { - "version": "1.2.1", - "dev": true, - "license": "ISC" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true }, "node_modules/@vitejs/plugin-vue": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.1.tgz", + "integrity": "sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==", "dev": true, - "license": "MIT", "engines": { "node": "^18.0.0 || >=20.0.0" }, @@ -1759,8 +2564,9 @@ }, "node_modules/@vue/compiler-core": { "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz", + "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==", "dev": true, - "license": "MIT", "dependencies": { "@babel/parser": "^7.25.3", "@vue/shared": "3.5.13", @@ -1771,8 +2577,9 @@ }, "node_modules/@vue/compiler-dom": { "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz", + "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==", "dev": true, - "license": "MIT", "dependencies": { "@vue/compiler-core": "3.5.13", "@vue/shared": "3.5.13" @@ -1780,8 +2587,9 @@ }, "node_modules/@vue/compiler-sfc": { "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz", + "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/parser": "^7.25.3", "@vue/compiler-core": "3.5.13", @@ -1796,6372 +2604,7773 @@ }, "node_modules/@vue/compiler-sfc/node_modules/magic-string": { "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "node_modules/@vue/compiler-ssr": { "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz", + "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==", "dev": true, - "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.13", - "@vue/shared": "3.5.13" + "@vue/compiler-dom": "3.5.13", + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/devtools-api": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.2.tgz", + "integrity": "sha512-1syn558KhyN+chO5SjlZIwJ8bV/bQ1nOVTG66t2RbG66ZGekyiYNmRO7X9BJCXQqPsFHlnksqvPhce2qpzxFnA==", + "dev": true, + "dependencies": { + "@vue/devtools-kit": "^7.7.2" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.2.tgz", + "integrity": "sha512-CY0I1JH3Z8PECbn6k3TqM1Bk9ASWxeMtTCvZr7vb+CHi+X/QwQm5F1/fPagraamKMAHVfuuCbdcnNg1A4CYVWQ==", + "dev": true, + "dependencies": { + "@vue/devtools-shared": "^7.7.2", + "birpc": "^0.2.19", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.1" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.2.tgz", + "integrity": "sha512-uBFxnp8gwW2vD6FrJB8JZLUzVb6PNRG0B0jBnHsOH8uKyva2qINY8PTF5Te4QlTbMDqU5K6qtJDr6cNsKWhbOA==", + "dev": true, + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.13.tgz", + "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==", + "dev": true, + "dependencies": { + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.13.tgz", + "integrity": "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==", + "dev": true, + "dependencies": { + "@vue/reactivity": "3.5.13", + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz", + "integrity": "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==", + "dev": true, + "dependencies": { + "@vue/reactivity": "3.5.13", + "@vue/runtime-core": "3.5.13", + "@vue/shared": "3.5.13", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.13.tgz", + "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==", + "dev": true, + "dependencies": { + "@vue/compiler-ssr": "3.5.13", + "@vue/shared": "3.5.13" + }, + "peerDependencies": { + "vue": "3.5.13" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz", + "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==", + "dev": true + }, + "node_modules/@vueuse/core": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.6.1.tgz", + "integrity": "sha512-FpgM1tXGAHsAC5n4Tflyg0vSoJUmdevfKaAhKFdxiK9BTIdHOHOiWmo+xivwdzjYFIvI8cEeJWYuqs646jOM2w==", + "dev": true, + "dependencies": { + "@types/web-bluetooth": "^0.0.20", + "@vueuse/metadata": "12.6.1", + "@vueuse/shared": "12.6.1", + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/integrations": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-12.6.1.tgz", + "integrity": "sha512-TsX9noygHqZGGoAcvvu+DoSGtbeuVl49V6gZZLgNxmKGeAxH2wQrlS3/7TM2wNczIkKV541bbOmhcQH6D+CM4Q==", + "dev": true, + "dependencies": { + "@vueuse/core": "12.6.1", + "@vueuse/shared": "12.6.1", + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "async-validator": "^4", + "axios": "^1", + "change-case": "^5", + "drauu": "^0.4", + "focus-trap": "^7", + "fuse.js": "^7", + "idb-keyval": "^6", + "jwt-decode": "^4", + "nprogress": "^0.2", + "qrcode": "^1.5", + "sortablejs": "^1", + "universal-cookie": "^7" + }, + "peerDependenciesMeta": { + "async-validator": { + "optional": true + }, + "axios": { + "optional": true + }, + "change-case": { + "optional": true + }, + "drauu": { + "optional": true + }, + "focus-trap": { + "optional": true + }, + "fuse.js": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "jwt-decode": { + "optional": true + }, + "nprogress": { + "optional": true + }, + "qrcode": { + "optional": true + }, + "sortablejs": { + "optional": true + }, + "universal-cookie": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.6.1.tgz", + "integrity": "sha512-2094HNXGdsU3aqRbad0vmlRgGncMC4u2f6nFdW1mUn7b7ym4hORrDZfyeq8G5BfGvX4y0zZynWfCdtB2WwpyVw==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.6.1.tgz", + "integrity": "sha512-ukTb2na19KT1/YVjj4CYBDOgiV/xmsSJRL6TcKeiz2db+P5bT3I0OJxy38eRR3WSN8CmSnt7MdVJ16vX6VZFxg==", + "dev": true, + "dependencies": { + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/0x": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/0x/-/0x-4.11.0.tgz", + "integrity": "sha512-AdEFfertRHzlGq5RWdF6kxHwNbpVBoCB5kIvIqXfgWu37UcP0mFK3P9FKundVauPvNpGCmA9YcJsPxt9+8MRoQ==", + "dependencies": { + "ajv": "^6.9.2", + "browserify": "^16.2.3", + "concat-stream": "^1.5.2", + "d3-fg": "^6.14.0", + "debounce": "^1.2.0", + "debug": "^4.1.1", + "end-of-stream": "^1.1.0", + "env-string": "^1.0.0", + "escape-string-regexp": "^1.0.5", + "execspawn": "^1.0.1", + "has-unicode": "^2.0.1", + "hsl-to-rgb-for-reals": "^1.1.0", + "jsonstream2": "^1.1.2", + "make-dir": "^1.3.0", + "minimist": "^1.2.0", + "morphdom": "^2.3.3", + "nanohtml": "^1.4.0", + "on-net-listen": "^1.1.0", + "opn": "^5.4.0", + "perf-sym": "^2.0.3", + "pump": "^3.0.0", + "pumpify": "^1.4.0", + "semver": "^5.5.1", + "single-line-log": "^1.0.1", + "split2": "^3.1.0", + "tachyons": "^4.9.1", + "through2": "^2.0.5", + "which": "^1.2.4" + }, + "bin": { + "0x": "cmd.js" + }, + "engines": { + "node": ">=8.5.0" + } + }, + "node_modules/0x/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "optional": true, + "peer": true + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/abstract-logging": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", + "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==", + "peer": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "peer": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dependencies": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" } }, - "node_modules/@vue/devtools-api": { - "version": "7.6.8", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/devtools-kit": "^7.6.8" + "node_modules/acorn-node/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" } }, - "node_modules/@vue/devtools-kit": { - "version": "7.6.8", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/devtools-shared": "^7.6.8", - "birpc": "^0.2.19", - "hookable": "^5.5.3", - "mitt": "^3.0.1", - "perfect-debounce": "^1.0.0", - "speakingurl": "^14.0.1", - "superjson": "^2.2.1" + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "engines": { + "node": ">=0.4.0" } }, - "node_modules/@vue/devtools-shared": { - "version": "7.6.8", - "dev": true, - "license": "MIT", + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "optional": true, + "peer": true, "dependencies": { - "rfdc": "^1.4.1" + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" } }, - "node_modules/@vue/reactivity": { - "version": "3.5.13", - "dev": true, - "license": "MIT", + "node_modules/agentkeepalive": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", + "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", + "optional": true, + "peer": true, "dependencies": { - "@vue/shared": "3.5.13" + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" } }, - "node_modules/@vue/runtime-core": { - "version": "3.5.13", - "dev": true, - "license": "MIT", + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "optional": true, + "peer": true, "dependencies": { - "@vue/reactivity": "3.5.13", - "@vue/shared": "3.5.13" + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@vue/runtime-dom": { - "version": "3.5.13", - "dev": true, - "license": "MIT", + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dependencies": { - "@vue/reactivity": "3.5.13", - "@vue/runtime-core": "3.5.13", - "@vue/shared": "3.5.13", - "csstype": "^3.1.3" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@vue/server-renderer": { - "version": "3.5.13", - "dev": true, - "license": "MIT", + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "peer": true, "dependencies": { - "@vue/compiler-ssr": "3.5.13", - "@vue/shared": "3.5.13" + "ajv": "^8.0.0" }, "peerDependencies": { - "vue": "3.5.13" + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/@vue/shared": { - "version": "3.5.13", - "dev": true, - "license": "MIT" - }, - "node_modules/@vueuse/core": { - "version": "11.3.0", - "dev": true, - "license": "MIT", + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "peer": true, "dependencies": { - "@types/web-bluetooth": "^0.0.20", - "@vueuse/metadata": "11.3.0", - "@vueuse/shared": "11.3.0", - "vue-demi": ">=0.14.10" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, "funding": { - "url": "https://github.com/sponsors/antfu" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@vueuse/core/node_modules/vue-demi": { - "version": "0.14.10", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" + "node_modules/ajv-formats/node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "peer": true + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "peer": true + }, + "node_modules/algoliasearch": { + "version": "5.20.2", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.20.2.tgz", + "integrity": "sha512-8evxG++iWyWnhng3g5RP+kwn6j+2vKLfew8pVoekn87FcfsDm92zJXKwSrU6pl+m5eAbGFhFF/gCYEQiRdbPlA==", + "dev": true, + "dependencies": { + "@algolia/client-abtesting": "5.20.2", + "@algolia/client-analytics": "5.20.2", + "@algolia/client-common": "5.20.2", + "@algolia/client-insights": "5.20.2", + "@algolia/client-personalization": "5.20.2", + "@algolia/client-query-suggestions": "5.20.2", + "@algolia/client-search": "5.20.2", + "@algolia/ingestion": "1.20.2", + "@algolia/monitoring": "1.20.2", + "@algolia/recommend": "5.20.2", + "@algolia/requester-browser-xhr": "5.20.2", + "@algolia/requester-fetch": "5.20.2", + "@algolia/requester-node-http": "5.20.2" }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@vueuse/integrations": { - "version": "11.3.0", - "dev": true, - "license": "MIT", + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "@vueuse/core": "11.3.0", - "@vueuse/shared": "11.3.0", - "vue-demi": ">=0.14.10" + "color-convert": "^2.0.1" }, - "funding": { - "url": "https://github.com/sponsors/antfu" + "engines": { + "node": ">=8" }, - "peerDependencies": { - "async-validator": "^4", - "axios": "^1", - "change-case": "^5", - "drauu": "^0.4", - "focus-trap": "^7", - "fuse.js": "^7", - "idb-keyval": "^6", - "jwt-decode": "^4", - "nprogress": "^0.2", - "qrcode": "^1.5", - "sortablejs": "^1", - "universal-cookie": "^7" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansicolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.2.1.tgz", + "integrity": "sha512-tOIuy1/SK/dr94ZA0ckDohKXNeBNqZ4us6PjMVLs5h1w2GBB6uPtOknp2+VF4F/zcy9LI70W+Z+pE2Soajky1w==" + }, + "node_modules/ansis": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-3.14.0.tgz", + "integrity": "sha512-R1LnSpYZWMDEFoAyCrfgToVz4ES25luDpjlZsUlD5GXdPWb91U+TZGkxWAOvt+7zWRY/ctOxhtTx5HUtL3qmbA==", + "peer": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "optional": true, + "peer": true + }, + "node_modules/archiver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", + "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", + "dependencies": { + "archiver-utils": "^5.0.2", + "async": "^3.2.4", + "buffer-crc32": "^1.0.0", + "readable-stream": "^4.0.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^3.0.0", + "zip-stream": "^6.0.1" }, - "peerDependenciesMeta": { - "async-validator": { - "optional": true - }, - "axios": { - "optional": true - }, - "change-case": { - "optional": true - }, - "drauu": { - "optional": true - }, - "focus-trap": { - "optional": true - }, - "fuse.js": { - "optional": true - }, - "idb-keyval": { - "optional": true - }, - "jwt-decode": { - "optional": true - }, - "nprogress": { - "optional": true - }, - "qrcode": { - "optional": true + "engines": { + "node": ">= 14" + } + }, + "node_modules/archiver-utils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", + "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", + "dependencies": { + "glob": "^10.0.0", + "graceful-fs": "^4.2.0", + "is-stream": "^2.0.1", + "lazystream": "^1.0.0", + "lodash": "^4.17.15", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/archiver-utils/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" }, - "sortablejs": { - "optional": true + { + "type": "patreon", + "url": "https://www.patreon.com/feross" }, - "universal-cookie": { - "optional": true + { + "type": "consulting", + "url": "https://feross.org/support" } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/@vueuse/integrations/node_modules/vue-demi": { - "version": "0.14.10", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" - }, + "node_modules/archiver-utils/node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } + "node": ">=0.8.x" } }, - "node_modules/@vueuse/metadata": { - "version": "11.3.0", - "dev": true, - "license": "MIT", + "node_modules/archiver-utils/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, "funding": { - "url": "https://github.com/sponsors/antfu" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@vueuse/shared": { - "version": "11.3.0", - "dev": true, - "license": "MIT", + "node_modules/archiver-utils/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dependencies": { - "vue-demi": ">=0.14.10" + "@isaacs/cliui": "^8.0.2" }, "funding": { - "url": "https://github.com/sponsors/antfu" + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/@vueuse/shared/node_modules/vue-demi": { - "version": "0.14.10", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" + "node_modules/archiver-utils/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "node_modules/archiver-utils/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=12" + "node": ">=16 || 14 >=14.18" }, "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/archiver/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/0x": { - "version": "4.11.0", - "license": "MIT", + "node_modules/archiver/node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/archiver/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", "dependencies": { - "ajv": "^6.9.2", - "browserify": "^16.2.3", - "concat-stream": "^1.5.2", - "d3-fg": "^6.14.0", - "debounce": "^1.2.0", - "debug": "^4.1.1", - "end-of-stream": "^1.1.0", - "env-string": "^1.0.0", - "escape-string-regexp": "^1.0.5", - "execspawn": "^1.0.1", - "has-unicode": "^2.0.1", - "hsl-to-rgb-for-reals": "^1.1.0", - "jsonstream2": "^1.1.2", - "make-dir": "^1.3.0", - "minimist": "^1.2.0", - "morphdom": "^2.3.3", - "nanohtml": "^1.4.0", - "on-net-listen": "^1.1.0", - "opn": "^5.4.0", - "perf-sym": "^2.0.3", - "pump": "^3.0.0", - "pumpify": "^1.4.0", - "semver": "^5.5.1", - "single-line-log": "^1.0.1", - "split2": "^3.1.0", - "tachyons": "^4.9.1", - "through2": "^2.0.5", - "which": "^1.2.4" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, - "bin": { - "0x": "cmd.js" + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "deprecated": "This package is no longer supported.", + "optional": true, + "peer": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" }, "engines": { - "node": ">=8.5.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/0x/node_modules/semver": { - "version": "5.7.2", - "license": "ISC", - "bin": { - "semver": "bin/semver" + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "optional": true, + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "peer": true + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "peer": true + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==" + }, + "node_modules/assert": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.1.tgz", + "integrity": "sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==", + "dependencies": { + "object.assign": "^4.1.4", + "util": "^0.10.4" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" + }, + "node_modules/async-lock": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", + "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==" + }, + "node_modules/async-retry": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "peer": true, + "dependencies": { + "retry": "0.13.1" + } + }, + "node_modules/async-retry/node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "peer": true, + "engines": { + "node": ">= 4" } }, - "node_modules/abbrev": { - "version": "1.1.1", - "license": "ISC", - "optional": true, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "peer": true }, - "node_modules/abort-controller": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "peer": true, "engines": { - "node": ">=6.5" + "node": ">=8.0.0" } }, - "node_modules/abstract-logging": { - "version": "2.0.1", - "license": "MIT", - "peer": true - }, - "node_modules/accepts": { - "version": "1.3.8", - "license": "MIT", + "node_modules/avvio": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/avvio/-/avvio-8.4.0.tgz", + "integrity": "sha512-CDSwaxINFy59iNwhYnkvALBwZiTydGkOecZyPkqBpABYR1KqGEsET0VOOYDwtleZSUIdeY36DC2bSZ24CO1igA==", "peer": true, "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" + "@fastify/error": "^3.3.0", + "fastq": "^1.17.1" } }, - "node_modules/acorn": { - "version": "8.14.0", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" + "node_modules/b4a": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/bare-events": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", + "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", + "optional": true + }, + "node_modules/bare-fs": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.0.1.tgz", + "integrity": "sha512-ilQs4fm/l9eMfWY2dY0WCIUplSUp7U0CT1vrqMg1MUdeZl4fypu5UP0XcDBK5WBQPJAKP1b7XEodISmekH/CEg==", + "optional": true, + "dependencies": { + "bare-events": "^2.0.0", + "bare-path": "^3.0.0", + "bare-stream": "^2.0.0" }, "engines": { - "node": ">=0.4.0" + "bare": ">=1.7.0" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "node_modules/bare-os": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.4.0.tgz", + "integrity": "sha512-9Ous7UlnKbe3fMi7Y+qh0DwAup6A1JkYgPnjvMDNOlmnxNRQvQ/7Nst+OnUQKzk0iAT0m9BisbDVp9gCv8+ETA==", + "optional": true, + "engines": { + "bare": ">=1.6.0" } }, - "node_modules/acorn-node": { - "version": "1.8.2", - "license": "Apache-2.0", + "node_modules/bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "optional": true, "dependencies": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" + "bare-os": "^3.0.1" } }, - "node_modules/acorn-node/node_modules/acorn": { - "version": "7.4.1", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" + "node_modules/bare-stream": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.5.tgz", + "integrity": "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==", + "optional": true, + "dependencies": { + "streamx": "^2.21.0" }, - "engines": { - "node": ">=0.4.0" + "peerDependencies": { + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } } }, - "node_modules/acorn-walk": { - "version": "7.2.0", - "license": "MIT", - "engines": { - "node": ">=0.4.0" + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dependencies": { + "tweetnacl": "^0.14.3" } }, - "node_modules/agent-base": { - "version": "6.0.2", - "license": "MIT", - "optional": true, - "peer": true, + "node_modules/benchmark": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", + "integrity": "sha512-l9MlfN4M1K/H2fbhfMy3B7vJd6AGKJVQn2h6Sg/Yx+KckoUA7ewS5Vv6TjSq18ooE1kS9hhAlQRH3AkXIh/aOQ==", "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" + "lodash": "^4.17.4", + "platform": "^1.3.3" } }, - "node_modules/agentkeepalive": { - "version": "4.6.0", - "license": "MIT", - "optional": true, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", "peer": true, "dependencies": { - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" + "file-uri-to-path": "1.0.0" } }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "license": "MIT", - "optional": true, - "peer": true, + "node_modules/birpc": { + "version": "0.2.19", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.19.tgz", + "integrity": "sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" } }, - "node_modules/ajv": { - "version": "6.12.6", - "license": "MIT", + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "license": "MIT", - "peer": true, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } + "engines": { + "node": ">= 6" } }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.17.1", - "license": "MIT", + "node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "peer": true, "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/ajv-formats/node_modules/fast-uri": { - "version": "3.0.3", - "license": "BSD-3-Clause", - "peer": true + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "peer": true, + "dependencies": { + "ms": "2.0.0" + } }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "license": "MIT", + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "peer": true }, - "node_modules/algoliasearch": { - "version": "5.18.0", - "dev": true, - "license": "MIT", + "node_modules/body-parser/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "peer": true, "dependencies": { - "@algolia/client-abtesting": "5.18.0", - "@algolia/client-analytics": "5.18.0", - "@algolia/client-common": "5.18.0", - "@algolia/client-insights": "5.18.0", - "@algolia/client-personalization": "5.18.0", - "@algolia/client-query-suggestions": "5.18.0", - "@algolia/client-search": "5.18.0", - "@algolia/ingestion": "1.18.0", - "@algolia/monitoring": "1.18.0", - "@algolia/recommend": "5.18.0", - "@algolia/requester-browser-xhr": "5.18.0", - "@algolia/requester-fetch": "5.18.0", - "@algolia/requester-node-http": "5.18.0" + "side-channel": "^1.0.6" }, "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/ansi-regex": { - "version": "6.1.0", - "license": "MIT", - "engines": { - "node": ">=12" + "node": ">=0.6" }, "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "license": "MIT", + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dependencies": { - "color-convert": "^2.0.1" + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/ansicolors": { - "version": "0.2.1", - "license": "MIT" + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" }, - "node_modules/ansis": { - "version": "3.5.2", - "license": "ISC", - "peer": true, - "engines": { - "node": ">=16" + "node_modules/browser-pack": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", + "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", + "dependencies": { + "combine-source-map": "~0.8.0", + "defined": "^1.0.0", + "JSONStream": "^1.0.3", + "safe-buffer": "^5.1.1", + "through2": "^2.0.0", + "umd": "^3.0.0" + }, + "bin": { + "browser-pack": "bin/cmd.js" } }, - "node_modules/any-promise": { - "version": "1.3.0", - "dev": true, - "license": "MIT" + "node_modules/browser-process-hrtime": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", + "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==" }, - "node_modules/aproba": { + "node_modules/browser-resolve": { "version": "2.0.0", - "license": "ISC", - "optional": true, - "peer": true + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", + "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", + "dependencies": { + "resolve": "^1.17.0" + } }, - "node_modules/archiver": { - "version": "7.0.1", - "license": "MIT", + "node_modules/browserify": { + "version": "16.5.2", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.5.2.tgz", + "integrity": "sha512-TkOR1cQGdmXU9zW4YukWzWVSJwrxmNdADFbqbE3HFgQWe5wqZmOawqZ7J/8MPCwk/W8yY7Y0h+7mOtcZxLP23g==", "dependencies": { - "archiver-utils": "^5.0.2", - "async": "^3.2.4", - "buffer-crc32": "^1.0.0", - "readable-stream": "^4.0.0", - "readdir-glob": "^1.1.2", - "tar-stream": "^3.0.0", - "zip-stream": "^6.0.1" + "assert": "^1.4.0", + "browser-pack": "^6.0.1", + "browser-resolve": "^2.0.0", + "browserify-zlib": "~0.2.0", + "buffer": "~5.2.1", + "cached-path-relative": "^1.0.0", + "concat-stream": "^1.6.0", + "console-browserify": "^1.1.0", + "constants-browserify": "~1.0.0", + "crypto-browserify": "^3.0.0", + "defined": "^1.0.0", + "deps-sort": "^2.0.0", + "domain-browser": "^1.2.0", + "duplexer2": "~0.1.2", + "events": "^2.0.0", + "glob": "^7.1.0", + "has": "^1.0.0", + "htmlescape": "^1.1.0", + "https-browserify": "^1.0.0", + "inherits": "~2.0.1", + "insert-module-globals": "^7.0.0", + "JSONStream": "^1.0.3", + "labeled-stream-splicer": "^2.0.0", + "mkdirp-classic": "^0.5.2", + "module-deps": "^6.2.3", + "os-browserify": "~0.3.0", + "parents": "^1.0.1", + "path-browserify": "~0.0.0", + "process": "~0.11.0", + "punycode": "^1.3.2", + "querystring-es3": "~0.2.0", + "read-only-stream": "^2.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.4", + "shasum": "^1.0.0", + "shell-quote": "^1.6.1", + "stream-browserify": "^2.0.0", + "stream-http": "^3.0.0", + "string_decoder": "^1.1.1", + "subarg": "^1.0.0", + "syntax-error": "^1.1.1", + "through2": "^2.0.0", + "timers-browserify": "^1.0.1", + "tty-browserify": "0.0.1", + "url": "~0.11.0", + "util": "~0.10.1", + "vm-browserify": "^1.0.0", + "xtend": "^4.0.0" + }, + "bin": { + "browserify": "bin/cmd.js" }, "engines": { - "node": ">= 14" + "node": ">= 0.8" } }, - "node_modules/archiver-utils": { - "version": "5.0.2", - "license": "MIT", + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dependencies": { - "glob": "^10.0.0", - "graceful-fs": "^4.2.0", - "is-stream": "^2.0.1", - "lazystream": "^1.0.0", - "lodash": "^4.17.15", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "node_modules/archiver-utils/node_modules/buffer": { - "version": "6.0.3", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, - "node_modules/archiver-utils/node_modules/events": { - "version": "3.3.0", - "license": "MIT", - "engines": { - "node": ">=0.8.x" + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "node_modules/archiver-utils/node_modules/glob": { - "version": "10.4.5", - "license": "ISC", + "node_modules/browserify-rsa": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.1.tgz", + "integrity": "sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" + "bn.js": "^5.2.1", + "randombytes": "^2.1.0", + "safe-buffer": "^5.2.1" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">= 0.10" } }, - "node_modules/archiver-utils/node_modules/jackspeak": { - "version": "3.4.3", - "license": "BlueOak-1.0.0", + "node_modules/browserify-sign": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.3.tgz", + "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==", "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.5", + "hash-base": "~3.0", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.7", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1" }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "engines": { + "node": ">= 0.12" } }, - "node_modules/archiver-utils/node_modules/lru-cache": { - "version": "10.4.3", - "license": "ISC" + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dependencies": { + "pako": "~1.0.5" + } }, - "node_modules/archiver-utils/node_modules/path-scurry": { - "version": "1.11.1", - "license": "BlueOak-1.0.0", + "node_modules/browserify/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserify/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": "*" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/archiver-utils/node_modules/readable-stream": { - "version": "4.6.0", - "license": "MIT", + "node_modules/browserify/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/archiver/node_modules/buffer": { - "version": "6.0.3", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "node": "*" } }, - "node_modules/archiver/node_modules/events": { - "version": "3.3.0", - "license": "MIT", + "node_modules/bson": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.10.2.tgz", + "integrity": "sha512-5afhLTjqDSA3akH56E+/2J6kTDuSIlBxyXPdQslj9hcIgOUE378xdOfZvC/9q3LifJNI6KR/juZ+d0NRNYBwXg==", + "peer": true, "engines": { - "node": ">=0.8.x" + "node": ">=16.20.1" } }, - "node_modules/archiver/node_modules/readable-stream": { - "version": "4.6.0", - "license": "MIT", + "node_modules/buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", + "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" } }, - "node_modules/are-we-there-yet": { - "version": "3.0.1", - "license": "ISC", - "optional": true, - "peer": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, + "node_modules/buffer-crc32": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", + "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8.0.0" } }, - "node_modules/are-we-there-yet/node_modules/readable-stream": { - "version": "3.6.2", - "license": "MIT", + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" + }, + "node_modules/buildcheck": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.6.tgz", + "integrity": "sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==", "optional": true, - "peer": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, "engines": { - "node": ">= 6" + "node": ">=10.0.0" } }, - "node_modules/arg": { - "version": "4.1.3", - "license": "MIT" + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==" }, - "node_modules/argparse": { - "version": "2.0.1", + "node_modules/bundle-require": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", + "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==", "dev": true, - "license": "Python-2.0" - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "license": "MIT", - "peer": true - }, - "node_modules/asap": { - "version": "2.0.6", - "license": "MIT", - "peer": true - }, - "node_modules/asn1": { - "version": "0.2.6", - "license": "MIT", "dependencies": { - "safer-buffer": "~2.1.0" + "load-tsconfig": "^0.2.3" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "esbuild": ">=0.18" } }, - "node_modules/asn1.js": { - "version": "4.10.1", - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "node_modules/byline": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", + "integrity": "sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.1", - "license": "MIT" - }, - "node_modules/assert": { - "version": "1.5.1", - "license": "MIT", - "dependencies": { - "object.assign": "^4.1.4", - "util": "^0.10.4" + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "peer": true, + "engines": { + "node": ">= 0.8" } }, - "node_modules/async": { - "version": "3.2.6", - "license": "MIT" - }, - "node_modules/async-lock": { - "version": "1.4.1", - "license": "MIT" + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "node_modules/async-retry": { - "version": "1.3.3", - "license": "MIT", + "node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "optional": true, "peer": true, "dependencies": { - "retry": "0.13.1" + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" } }, - "node_modules/async-retry/node_modules/retry": { - "version": "0.13.1", - "license": "MIT", + "node_modules/cacache/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "optional": true, "peer": true, - "engines": { - "node": ">= 4" + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "license": "MIT", - "peer": true - }, - "node_modules/atomic-sleep": { - "version": "1.0.0", - "license": "MIT", + "node_modules/cacache/node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "optional": true, "peer": true, "engines": { - "node": ">=8.0.0" + "node": ">=10" } }, - "node_modules/avvio": { - "version": "8.4.0", - "license": "MIT", + "node_modules/cacache/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "optional": true, "peer": true, "dependencies": { - "@fastify/error": "^3.3.0", - "fastq": "^1.17.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/b4a": { - "version": "1.6.7", - "license": "Apache-2.0" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/bare-events": { - "version": "2.5.0", - "license": "Apache-2.0", - "optional": true + "node_modules/cacache/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "optional": true, + "peer": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } }, - "node_modules/bare-fs": { - "version": "2.3.5", - "license": "Apache-2.0", + "node_modules/cacache/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "optional": true, + "peer": true, "dependencies": { - "bare-events": "^2.0.0", - "bare-path": "^2.0.0", - "bare-stream": "^2.0.0" + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "node_modules/bare-os": { - "version": "2.4.4", - "license": "Apache-2.0", - "optional": true - }, - "node_modules/bare-path": { - "version": "2.1.3", - "license": "Apache-2.0", + "node_modules/cacache/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "optional": true, + "peer": true, "dependencies": { - "bare-os": "^2.1.0" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/bare-stream": { - "version": "2.6.1", - "license": "Apache-2.0", - "optional": true, + "node_modules/cached-path-relative": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.1.0.tgz", + "integrity": "sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==" + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "dependencies": { - "streamx": "^2.21.0" + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/base64-js": { - "version": "1.5.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/bcrypt-pbkdf": { + "node_modules/call-bind-apply-helpers": { "version": "1.0.2", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dependencies": { - "tweetnacl": "^0.14.3" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/benchmark": { - "version": "2.1.4", - "license": "MIT", + "node_modules/call-bound": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", "dependencies": { - "lodash": "^4.17.4", - "platform": "^1.3.3" + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/bindings": { - "version": "1.5.0", - "license": "MIT", - "peer": true, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", "dependencies": { - "file-uri-to-path": "1.0.0" + "no-case": "^2.2.0", + "upper-case": "^1.1.1" } }, - "node_modules/birpc": { - "version": "0.2.19", + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", "dev": true, - "license": "MIT", "funding": { - "url": "https://github.com/sponsors/antfu" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/bl": { - "version": "4.1.0", - "license": "MIT", + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/bl/node_modules/buffer": { - "version": "5.7.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "license": "MIT", + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/cipher-base": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.6.tgz", + "integrity": "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1" }, "engines": { - "node": ">= 6" + "node": ">= 0.10" } }, - "node_modules/bn.js": { - "version": "5.2.1", - "license": "MIT" + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "optional": true, + "peer": true, + "engines": { + "node": ">=6" + } }, - "node_modules/body-parser": { - "version": "1.20.3", - "license": "MIT", + "node_modules/cli-table3": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", "peer": true, "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" + "string-width": "^4.2.0" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" } }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "peer": true, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dependencies": { - "ms": "2.0.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "license": "MIT", - "peer": true + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.13.0", - "license": "BSD-3-Clause", - "peer": true, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { - "side-channel": "^1.0.6" + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=0.6" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" + "node_modules/close-with-grace": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/close-with-grace/-/close-with-grace-2.2.0.tgz", + "integrity": "sha512-OdcFxnxTm/AMLPHA4Aq3J1BLpkojXP7I4G5QBQLN5TT55ED/rk04rAoDbtfNnfZ988kGXPxh1bdRLeIU9bz/lA==", + "peer": true + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/braces": { - "version": "3.0.3", - "dev": true, - "license": "MIT", + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { - "fill-range": "^7.1.1" + "color-name": "~1.1.4" }, "engines": { - "node": ">=8" + "node": ">=7.0.0" } }, - "node_modules/brorand": { - "version": "1.1.0", - "license": "MIT" + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/browser-pack": { - "version": "6.1.0", - "license": "MIT", - "dependencies": { - "combine-source-map": "~0.8.0", - "defined": "^1.0.0", - "JSONStream": "^1.0.3", - "safe-buffer": "^5.1.1", - "through2": "^2.0.0", - "umd": "^3.0.0" - }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "optional": true, + "peer": true, "bin": { - "browser-pack": "bin/cmd.js" + "color-support": "bin.js" } }, - "node_modules/browser-process-hrtime": { - "version": "0.1.3", - "license": "BSD-2-Clause" - }, - "node_modules/browser-resolve": { - "version": "2.0.0", - "license": "MIT", + "node_modules/combine-source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", + "integrity": "sha512-UlxQ9Vw0b/Bt/KYwCFqdEwsQ1eL8d1gibiFb7lxQJFdvTgc2hIZi6ugsg+kyhzhPV+QEpUiEIwInIAIrgoEkrg==", "dependencies": { - "resolve": "^1.17.0" + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" } }, - "node_modules/browserify": { - "version": "16.5.2", - "license": "MIT", + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "peer": true, "dependencies": { - "assert": "^1.4.0", - "browser-pack": "^6.0.1", - "browser-resolve": "^2.0.0", - "browserify-zlib": "~0.2.0", - "buffer": "~5.2.1", - "cached-path-relative": "^1.0.0", - "concat-stream": "^1.6.0", - "console-browserify": "^1.1.0", - "constants-browserify": "~1.0.0", - "crypto-browserify": "^3.0.0", - "defined": "^1.0.0", - "deps-sort": "^2.0.0", - "domain-browser": "^1.2.0", - "duplexer2": "~0.1.2", - "events": "^2.0.0", - "glob": "^7.1.0", - "has": "^1.0.0", - "htmlescape": "^1.1.0", - "https-browserify": "^1.0.0", - "inherits": "~2.0.1", - "insert-module-globals": "^7.0.0", - "JSONStream": "^1.0.3", - "labeled-stream-splicer": "^2.0.0", - "mkdirp-classic": "^0.5.2", - "module-deps": "^6.2.3", - "os-browserify": "~0.3.0", - "parents": "^1.0.1", - "path-browserify": "~0.0.0", - "process": "~0.11.0", - "punycode": "^1.3.2", - "querystring-es3": "~0.2.0", - "read-only-stream": "^2.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.1.4", - "shasum": "^1.0.0", - "shell-quote": "^1.6.1", - "stream-browserify": "^2.0.0", - "stream-http": "^3.0.0", - "string_decoder": "^1.1.1", - "subarg": "^1.0.0", - "syntax-error": "^1.1.1", - "through2": "^2.0.0", - "timers-browserify": "^1.0.1", - "tty-browserify": "0.0.1", - "url": "~0.11.0", - "util": "~0.10.1", - "vm-browserify": "^1.0.0", - "xtend": "^4.0.0" - }, - "bin": { - "browserify": "bin/cmd.js" + "delayed-stream": "~1.0.0" }, "engines": { "node": ">= 0.8" } }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "license": "MIT", - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" + "node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "engines": { + "node": ">=18" } }, - "node_modules/browserify-des": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/browserify-rsa": { - "version": "4.1.1", - "license": "MIT", + "node_modules/compress-commons": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", + "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", "dependencies": { - "bn.js": "^5.2.1", - "randombytes": "^2.1.0", - "safe-buffer": "^5.2.1" + "crc-32": "^1.2.0", + "crc32-stream": "^6.0.0", + "is-stream": "^2.0.1", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" }, "engines": { - "node": ">= 0.10" + "node": ">= 14" } }, - "node_modules/browserify-sign": { - "version": "4.2.3", - "license": "ISC", + "node_modules/compress-commons/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "bn.js": "^5.2.1", - "browserify-rsa": "^4.1.0", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.5", - "hash-base": "~3.0", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.7", - "readable-stream": "^2.3.8", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.12" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/browserify-zlib": { - "version": "0.2.0", - "license": "MIT", - "dependencies": { - "pako": "~1.0.5" + "node_modules/compress-commons/node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" } }, - "node_modules/browserify/node_modules/brace-expansion": { - "version": "1.1.11", - "license": "MIT", + "node_modules/compress-commons/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/browserify/node_modules/glob": { - "version": "7.2.3", - "license": "ISC", + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/consola": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.0.tgz", + "integrity": "sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==", + "dev": true, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "^14.18.0 || >=16.10.0" } }, - "node_modules/browserify/node_modules/minimatch": { - "version": "3.1.2", - "license": "ISC", + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "optional": true, + "peer": true + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "peer": true, "dependencies": { - "brace-expansion": "^1.1.7" + "safe-buffer": "5.2.1" }, "engines": { - "node": "*" + "node": ">= 0.6" } }, - "node_modules/bson": { - "version": "6.10.1", - "license": "Apache-2.0", + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "peer": true, "engines": { - "node": ">=16.20.1" + "node": ">= 0.6" } }, - "node_modules/buffer": { - "version": "5.2.1", - "license": "MIT", - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } + "node_modules/convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha512-Y8L5rp6jo+g9VEPgvqNfEopjTR4OTYct8lXlS8iVQdmnjDvbdbzYe9rjtFCB9egC86JoNCU61WRY+ScjkZpnIg==" }, - "node_modules/buffer-crc32": { - "version": "1.0.0", - "license": "MIT", + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "peer": true, "engines": { - "node": ">=8.0.0" + "node": ">= 0.6" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "license": "MIT" - }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "license": "MIT" - }, - "node_modules/buildcheck": { - "version": "0.0.6", - "optional": true, - "engines": { - "node": ">=10.0.0" - } + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "peer": true }, - "node_modules/builtin-status-codes": { - "version": "3.0.0", - "license": "MIT" + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "peer": true }, - "node_modules/bundle-require": { - "version": "5.1.0", + "node_modules/copy-anything": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", + "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", "dev": true, - "license": "MIT", "dependencies": { - "load-tsconfig": "^0.2.3" + "is-what": "^4.1.8" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=12.13" }, - "peerDependencies": { - "esbuild": ">=0.18" + "funding": { + "url": "https://github.com/sponsors/mesqueeb" } }, - "node_modules/byline": { - "version": "5.0.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, - "node_modules/bytes": { - "version": "3.1.2", - "license": "MIT", - "peer": true, + "node_modules/cpu-features": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.10.tgz", + "integrity": "sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "buildcheck": "~0.0.6", + "nan": "^2.19.0" + }, "engines": { - "node": ">= 0.8" + "node": ">=10.0.0" } }, - "node_modules/cac": { - "version": "6.7.14", - "dev": true, - "license": "MIT", + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "bin": { + "crc32": "bin/crc32.njs" + }, "engines": { - "node": ">=8" + "node": ">=0.8" } }, - "node_modules/cacache": { - "version": "15.3.0", - "license": "ISC", - "optional": true, - "peer": true, + "node_modules/crc32-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", + "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", "dependencies": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" + "crc-32": "^1.2.0", + "readable-stream": "^4.0.0" }, "engines": { - "node": ">= 10" + "node": ">= 14" } }, - "node_modules/cacache/node_modules/brace-expansion": { - "version": "1.1.11", - "license": "MIT", - "optional": true, - "peer": true, + "node_modules/crc32-stream/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/cacache/node_modules/chownr": { - "version": "2.0.0", - "license": "ISC", - "optional": true, - "peer": true, + "node_modules/crc32-stream/node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "engines": { - "node": ">=10" + "node": ">=0.8.x" } }, - "node_modules/cacache/node_modules/glob": { - "version": "7.2.3", - "license": "ISC", - "optional": true, - "peer": true, + "node_modules/crc32-stream/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "6.0.0", - "license": "ISC", - "optional": true, - "peer": true, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" } }, - "node_modules/cacache/node_modules/minimatch": { - "version": "3.1.2", - "license": "ISC", - "optional": true, - "peer": true, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==" + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" } }, - "node_modules/cacache/node_modules/minipass": { - "version": "3.3.6", - "license": "ISC", - "optional": true, - "peer": true, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, - "node_modules/cached-path-relative": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/call-bind": { - "version": "1.0.8", - "license": "MIT", + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 8" } }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.1", - "license": "MIT", + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" }, "engines": { - "node": ">= 0.4" + "node": ">= 8" } }, - "node_modules/call-bound": { - "version": "1.0.3", - "license": "MIT", + "node_modules/crypto-browserify": { + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.1.tgz", + "integrity": "sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "get-intrinsic": "^1.2.6" + "browserify-cipher": "^1.0.1", + "browserify-sign": "^4.2.3", + "create-ecdh": "^4.0.4", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "diffie-hellman": "^5.0.3", + "hash-base": "~3.0.4", + "inherits": "^2.0.4", + "pbkdf2": "^3.1.2", + "public-encrypt": "^4.0.3", + "randombytes": "^2.1.0", + "randomfill": "^1.0.4" }, "engines": { - "node": ">= 0.4" + "node": ">= 0.10" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/callsites": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true }, - "node_modules/camel-case": { - "version": "3.0.0", - "license": "MIT", + "node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", "dependencies": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" + "internmap": "^1.0.0" } }, - "node_modules/ccount": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "node_modules/d3-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-2.0.0.tgz", + "integrity": "sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ==" }, - "node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } + "node_modules/d3-dispatch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/d3-drag": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", + "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", + "dependencies": { + "d3-dispatch": "1", + "d3-selection": "1" } }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "node_modules/d3-ease": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", + "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==" }, - "node_modules/chokidar": { - "version": "4.0.3", - "dev": true, - "license": "MIT", + "node_modules/d3-fg": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/d3-fg/-/d3-fg-6.14.0.tgz", + "integrity": "sha512-M4QpFZOEvAq4ZDzwabJp2inL+KXS85T2SQl00zWwjnolaCJR+gHxUbT7Ha4GxTeW1NXwzbykhv/38I1fxQqbyg==", "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "d3-array": "^2.2.0", + "d3-dispatch": "^1.0.5", + "d3-ease": "^1.0.5", + "d3-hierarchy": "^1.1.8", + "d3-scale": "^3.0.0", + "d3-selection": "^1.4.0", + "d3-zoom": "^1.7.3", + "escape-string-regexp": "^1.0.5", + "hsl-to-rgb-for-reals": "^1.1.0" } }, - "node_modules/chownr": { - "version": "1.1.4", - "license": "ISC" + "node_modules/d3-format": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-2.0.0.tgz", + "integrity": "sha512-Ab3S6XuE/Q+flY96HXT0jOXcM4EAClYFnRGY5zsjRGNy6qCYrQsMffs7cV5Q9xejb35zxW5hf/guKw34kvIKsA==" }, - "node_modules/cipher-base": { - "version": "1.0.6", - "license": "MIT", + "node_modules/d3-hierarchy": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", + "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" + }, + "node_modules/d3-interpolate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-2.0.1.tgz", + "integrity": "sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ==", "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" + "d3-color": "1 - 2" } }, - "node_modules/clean-stack": { - "version": "2.2.0", - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=6" + "node_modules/d3-scale": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.3.0.tgz", + "integrity": "sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ==", + "dependencies": { + "d3-array": "^2.3.0", + "d3-format": "1 - 2", + "d3-interpolate": "1.2.0 - 2", + "d3-time": "^2.1.1", + "d3-time-format": "2 - 3" } }, - "node_modules/cli-table3": { - "version": "0.6.5", - "license": "MIT", - "peer": true, + "node_modules/d3-selection": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", + "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" + }, + "node_modules/d3-time": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-2.1.1.tgz", + "integrity": "sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ==", "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" + "d3-array": "2" } }, - "node_modules/cliui": { - "version": "8.0.1", - "license": "ISC", + "node_modules/d3-time-format": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-3.0.0.tgz", + "integrity": "sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag==", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" + "d3-time": "1 - 2" } }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "license": "MIT", - "engines": { - "node": ">=8" - } + "node_modules/d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "license": "MIT", + "node_modules/d3-transition": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz", + "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==", "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" + "d3-color": "1", + "d3-dispatch": "1", + "d3-ease": "1", + "d3-interpolate": "1", + "d3-selection": "^1.1.0", + "d3-timer": "1" } }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "license": "MIT", + "node_modules/d3-transition/node_modules/d3-color": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", + "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" + }, + "node_modules/d3-transition/node_modules/d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "d3-color": "1" } }, - "node_modules/close-with-grace": { - "version": "2.1.0", - "license": "MIT", - "peer": true - }, - "node_modules/code-point-at": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "node_modules/d3-zoom": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz", + "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==", + "dependencies": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" } }, - "node_modules/color-convert": { - "version": "2.0.1", - "license": "MIT", + "node_modules/d3-zoom/node_modules/d3-color": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", + "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" + }, + "node_modules/d3-zoom/node_modules/d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "d3-color": "1" } }, - "node_modules/color-name": { - "version": "1.1.4", - "license": "MIT" + "node_modules/dash-ast": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", + "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==" }, - "node_modules/color-support": { - "version": "1.1.3", - "license": "ISC", - "optional": true, - "peer": true, - "bin": { - "color-support": "bin.js" - } + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" }, - "node_modules/combine-source-map": { - "version": "0.8.0", - "license": "MIT", + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dependencies": { - "convert-source-map": "~1.1.0", - "inline-source-map": "~0.6.0", - "lodash.memoize": "~3.0.3", - "source-map": "~0.5.3" + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/combined-stream": { - "version": "1.0.8", - "license": "MIT", + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "peer": true, "dependencies": { - "delayed-stream": "~1.0.0" + "mimic-response": "^3.1.0" }, "engines": { - "node": ">= 0.8" - } - }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "dev": true, - "license": "MIT", + "node": ">=10" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/commander": { - "version": "12.1.0", - "license": "MIT", + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "peer": true, "engines": { - "node": ">=18" + "node": ">=4.0.0" } }, - "node_modules/component-emitter": { - "version": "1.3.1", - "license": "MIT", - "peer": true, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/compress-commons": { - "version": "6.0.2", - "license": "MIT", + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dependencies": { - "crc-32": "^1.2.0", - "crc32-stream": "^6.0.0", - "is-stream": "^2.0.1", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">= 14" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/compress-commons/node_modules/buffer": { - "version": "6.0.3", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "node_modules/defined": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", + "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/compress-commons/node_modules/events": { - "version": "3.3.0", - "license": "MIT", + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "peer": true, "engines": { - "node": ">=0.8.x" + "node": ">=0.4.0" } }, - "node_modules/compress-commons/node_modules/readable-stream": { - "version": "4.6.0", - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "optional": true, + "peer": true + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "peer": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">= 0.8" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "license": "MIT" - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "engines": [ - "node >= 0.8" - ], - "license": "MIT", + "node_modules/deps-sort": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz", + "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==", "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "JSONStream": "^1.0.3", + "shasum-object": "^1.0.0", + "subarg": "^1.0.0", + "through2": "^2.0.0" + }, + "bin": { + "deps-sort": "bin/cmd.js" } }, - "node_modules/consola": { - "version": "3.3.3", + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "dev": true, - "license": "MIT", "engines": { - "node": "^14.18.0 || >=16.10.0" + "node": ">=6" } }, - "node_modules/console-browserify": { - "version": "1.2.0" - }, - "node_modules/console-control-strings": { + "node_modules/des.js": { "version": "1.1.0", - "license": "ISC", - "optional": true, - "peer": true - }, - "node_modules/constants-browserify": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, - "node_modules/content-type": { - "version": "1.0.5", - "license": "MIT", + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "peer": true, "engines": { - "node": ">= 0.6" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/convert-source-map": { - "version": "1.1.3", - "license": "MIT" - }, - "node_modules/cookie": { - "version": "0.7.1", - "license": "MIT", + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", "peer": true, "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "license": "MIT", - "peer": true - }, - "node_modules/cookiejar": { - "version": "2.1.4", - "license": "MIT", - "peer": true + "node_modules/detective": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", + "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", + "dependencies": { + "acorn-node": "^1.8.2", + "defined": "^1.0.0", + "minimist": "^1.2.6" + }, + "bin": { + "detective": "bin/detective.js" + }, + "engines": { + "node": ">=0.8.0" + } }, - "node_modules/copy-anything": { - "version": "3.0.5", + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", "dev": true, - "license": "MIT", "dependencies": { - "is-what": "^4.1.8" - }, - "engines": { - "node": ">=12.13" + "dequal": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/mesqueeb" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/core-util-is": { - "version": "1.0.3", - "license": "MIT" - }, - "node_modules/cpu-features": { - "version": "0.0.10", - "hasInstallScript": true, - "optional": true, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "peer": true, "dependencies": { - "buildcheck": "~0.0.6", - "nan": "^2.19.0" - }, + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "engines": { - "node": ">=10.0.0" + "node": ">=0.3.1" } }, - "node_modules/crc-32": { - "version": "1.2.2", - "license": "Apache-2.0", - "bin": { - "crc32": "bin/crc32.njs" + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==" + }, + "node_modules/docker-compose": { + "version": "0.24.8", + "resolved": "https://registry.npmjs.org/docker-compose/-/docker-compose-0.24.8.tgz", + "integrity": "sha512-plizRs/Vf15H+GCVxq2EUvyPK7ei9b/cVesHvjnX4xaXjM9spHe2Ytq0BitndFgvTJ3E3NljPNUEl7BAN43iZw==", + "dependencies": { + "yaml": "^2.2.2" }, "engines": { - "node": ">=0.8" + "node": ">= 6.0.0" } }, - "node_modules/crc32-stream": { - "version": "6.0.0", - "license": "MIT", + "node_modules/docker-modem": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-3.0.8.tgz", + "integrity": "sha512-f0ReSURdM3pcKPNS30mxOHSbaFLcknGmQjwSfmbcdOw1XWKXVhukM3NJHhr7NpY9BIyyWQb0EBo3KQvvuU5egQ==", "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^4.0.0" + "debug": "^4.1.1", + "readable-stream": "^3.5.0", + "split-ca": "^1.0.1", + "ssh2": "^1.11.0" }, "engines": { - "node": ">= 14" + "node": ">= 8.0" } }, - "node_modules/crc32-stream/node_modules/buffer": { - "version": "6.0.3", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", + "node_modules/docker-modem/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/crc32-stream/node_modules/events": { - "version": "3.3.0", - "license": "MIT", + "node_modules/dockerode": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/dockerode/-/dockerode-3.3.5.tgz", + "integrity": "sha512-/0YNa3ZDNeLr/tSckmD69+Gq+qVNhvKfAHNeZJBnp7EOP6RGKV8ORrJHkUn20So5wU+xxT7+1n5u8PjHbfjbSA==", + "dependencies": { + "@balena/dockerignore": "^1.0.2", + "docker-modem": "^3.0.0", + "tar-fs": "~2.0.1" + }, "engines": { - "node": ">=0.8.x" + "node": ">= 8.0" } }, - "node_modules/crc32-stream/node_modules/readable-stream": { - "version": "4.6.0", - "license": "MIT", + "node_modules/dockerode/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">= 6" } }, - "node_modules/create-ecdh": { - "version": "4.0.4", - "license": "MIT", + "node_modules/dockerode/node_modules/tar-fs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.1.tgz", + "integrity": "sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA==", "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.0.0" } }, - "node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.12.1", - "license": "MIT" - }, - "node_modules/create-hash": { - "version": "1.2.0", - "license": "MIT", + "node_modules/dockerode/node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" } }, - "node_modules/create-hmac": { - "version": "1.1.7", - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "node_modules/domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "engines": { + "node": ">=0.4", + "npm": ">=1.2" } }, - "node_modules/create-require": { - "version": "1.1.1", - "license": "MIT" + "node_modules/dotenv": { + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "license": "MIT", + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" }, "engines": { - "node": ">= 8" + "node": ">= 0.4" } }, - "node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "license": "ISC", + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" + "readable-stream": "^2.0.2" } }, - "node_modules/crypto-browserify": { - "version": "3.12.1", - "license": "MIT", + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "dependencies": { - "browserify-cipher": "^1.0.1", - "browserify-sign": "^4.2.3", - "create-ecdh": "^4.0.4", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "diffie-hellman": "^5.0.3", - "hash-base": "~3.0.4", - "inherits": "^2.0.4", - "pbkdf2": "^3.1.2", - "public-encrypt": "^4.0.3", - "randombytes": "^2.1.0", - "randomfill": "^1.0.4" - }, - "engines": { - "node": ">= 0.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" } }, - "node_modules/csstype": { - "version": "3.1.3", - "dev": true, - "license": "MIT" + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, - "node_modules/d3-array": { - "version": "2.12.1", - "license": "BSD-3-Clause", + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "peer": true + }, + "node_modules/elliptic": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", "dependencies": { - "internmap": "^1.0.0" + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" } }, - "node_modules/d3-color": { - "version": "2.0.0", - "license": "BSD-3-Clause" + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, - "node_modules/d3-dispatch": { - "version": "1.0.6", - "license": "BSD-3-Clause" + "node_modules/emoji-regex-xs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", + "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==", + "dev": true }, - "node_modules/d3-drag": { - "version": "1.2.5", - "license": "BSD-3-Clause", - "dependencies": { - "d3-dispatch": "1", - "d3-selection": "1" + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "peer": true, + "engines": { + "node": ">= 0.8" } }, - "node_modules/d3-ease": { - "version": "1.0.7", - "license": "BSD-3-Clause" - }, - "node_modules/d3-fg": { - "version": "6.14.0", - "license": "Apache-2.0", + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "optional": true, + "peer": true, "dependencies": { - "d3-array": "^2.2.0", - "d3-dispatch": "^1.0.5", - "d3-ease": "^1.0.5", - "d3-hierarchy": "^1.1.8", - "d3-scale": "^3.0.0", - "d3-selection": "^1.4.0", - "d3-zoom": "^1.7.3", - "escape-string-regexp": "^1.0.5", - "hsl-to-rgb-for-reals": "^1.1.0" + "iconv-lite": "^0.6.2" } }, - "node_modules/d3-format": { - "version": "2.0.0", - "license": "BSD-3-Clause" - }, - "node_modules/d3-hierarchy": { - "version": "1.1.9", - "license": "BSD-3-Clause" - }, - "node_modules/d3-interpolate": { - "version": "2.0.1", - "license": "BSD-3-Clause", + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "optional": true, + "peer": true, "dependencies": { - "d3-color": "1 - 2" + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/d3-scale": { - "version": "3.3.0", - "license": "BSD-3-Clause", + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dependencies": { - "d3-array": "^2.3.0", - "d3-format": "1 - 2", - "d3-interpolate": "1.2.0 - 2", - "d3-time": "^2.1.1", - "d3-time-format": "2 - 3" + "once": "^1.4.0" } }, - "node_modules/d3-selection": { - "version": "1.4.2", - "license": "BSD-3-Clause" - }, - "node_modules/d3-time": { - "version": "2.1.1", - "license": "BSD-3-Clause", - "dependencies": { - "d3-array": "2" + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/d3-time-format": { - "version": "3.0.0", - "license": "BSD-3-Clause", - "dependencies": { - "d3-time": "1 - 2" + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "optional": true, + "peer": true, + "engines": { + "node": ">=6" } }, - "node_modules/d3-timer": { - "version": "1.0.10", - "license": "BSD-3-Clause" + "node_modules/env-string": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/env-string/-/env-string-1.0.1.tgz", + "integrity": "sha512-/DhCJDf5DSFK32joQiWRpWrT0h7p3hVQfMKxiBb7Nt8C8IF8BYyPtclDnuGGLOoj16d/8udKeiE7JbkotDmorQ==" }, - "node_modules/d3-transition": { - "version": "1.3.2", - "license": "BSD-3-Clause", - "dependencies": { - "d3-color": "1", - "d3-dispatch": "1", - "d3-ease": "1", - "d3-interpolate": "1", - "d3-selection": "^1.1.0", - "d3-timer": "1" + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "optional": true, + "peer": true + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "engines": { + "node": ">= 0.4" } }, - "node_modules/d3-transition/node_modules/d3-color": { - "version": "1.4.1", - "license": "BSD-3-Clause" + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } }, - "node_modules/d3-transition/node_modules/d3-interpolate": { - "version": "1.4.0", - "license": "BSD-3-Clause", + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "dependencies": { - "d3-color": "1" + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/d3-zoom": { - "version": "1.8.3", - "license": "BSD-3-Clause", - "dependencies": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" + "node_modules/esbuild": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" } }, - "node_modules/d3-zoom/node_modules/d3-color": { - "version": "1.4.1", - "license": "BSD-3-Clause" + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "engines": { + "node": ">=6" + } }, - "node_modules/d3-zoom/node_modules/d3-interpolate": { - "version": "1.4.0", - "license": "BSD-3-Clause", - "dependencies": { - "d3-color": "1" + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "peer": true + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" } }, - "node_modules/dash-ast": { - "version": "1.0.0", - "license": "Apache-2.0" + "node_modules/eslint": { + "version": "9.20.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.20.1.tgz", + "integrity": "sha512-m1mM33o6dBUjxl2qb6wv6nGNwCAsns1eKtaQ4l/NPHeTvhiUPbtdfMyktxN4B3fgHIgsYh1VT3V9txblpQHq+g==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.19.0", + "@eslint/core": "^0.11.0", + "@eslint/eslintrc": "^3.2.0", + "@eslint/js": "9.20.0", + "@eslint/plugin-kit": "^0.2.5", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } }, - "node_modules/debounce": { - "version": "1.2.1", - "license": "MIT" + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } }, - "node_modules/debug": { - "version": "4.4.0", - "license": "MIT", + "node_modules/eslint-plugin-prettier": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.3.tgz", + "integrity": "sha512-qJ+y0FfCp/mQYQ/vWQ3s7eUlFEL4PyKfAJxsnYTJ4YT73nsJBWqmEpFryxV9OeUiqmsTsYJ5Y+KDNaeP31wrRw==", + "dev": true, "dependencies": { - "ms": "^2.1.3" + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.9.1" }, "engines": { - "node": ">=6.0" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" }, "peerDependenciesMeta": { - "supports-color": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { "optional": true } } }, - "node_modules/decompress-response": { - "version": "6.0.0", - "license": "MIT", - "peer": true, + "node_modules/eslint-scope": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "dev": true, "dependencies": { - "mimic-response": "^3.1.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, - "node_modules/deep-extend": { - "version": "0.6.0", - "license": "MIT", - "peer": true, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, "engines": { - "node": ">=4.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/deep-is": { - "version": "0.1.4", + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "license": "MIT" - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "node_modules/define-properties": { - "version": "1.2.1", - "license": "MIT", + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "*" } }, - "node_modules/defined": { - "version": "1.0.1", - "license": "MIT", + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dev": true, + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "license": "MIT", - "peer": true, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, "engines": { - "node": ">=0.4.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/delegates": { - "version": "1.0.0", - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/depd": { - "version": "2.0.0", - "license": "MIT", - "peer": true, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, "engines": { - "node": ">= 0.8" + "node": ">=0.10" } }, - "node_modules/deps-sort": { - "version": "2.0.1", - "license": "MIT", + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, "dependencies": { - "JSONStream": "^1.0.3", - "shasum-object": "^1.0.0", - "subarg": "^1.0.0", - "through2": "^2.0.0" + "estraverse": "^5.2.0" }, - "bin": { - "deps-sort": "bin/cmd.js" + "engines": { + "node": ">=4.0" } }, - "node_modules/dequal": { + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-is-member-expression": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-is-member-expression/-/estree-is-member-expression-1.0.0.tgz", + "integrity": "sha512-Ec+X44CapIGExvSZN+pGkmr5p7HwUVQoPQSd458Lqwvaf4/61k/invHSh4BYK8OXnCkfEhWuIoG5hayKLQStIg==" + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/esutils": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, - "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "engines": { "node": ">=6" } }, - "node_modules/des.js": { - "version": "1.1.0", - "license": "MIT", + "node_modules/events": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", + "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" } }, - "node_modules/destroy": { - "version": "1.2.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node_modules/execspawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/execspawn/-/execspawn-1.0.1.tgz", + "integrity": "sha512-s2k06Jy9i8CUkYe0+DxRlvtkZoOkwwfhB+Xxo5HGUtrISVW2m98jO2tr67DGRFxZwkjQqloA3v/tNtjhBRBieg==", + "dependencies": { + "util-extend": "^1.0.1" } }, - "node_modules/detect-libc": { + "node_modules/expand-template": { "version": "2.0.3", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", "peer": true, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/detective": { - "version": "5.2.1", - "license": "MIT", + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "peer": true, "dependencies": { - "acorn-node": "^1.8.2", - "defined": "^1.0.0", - "minimist": "^1.2.6" - }, - "bin": { - "detective": "bin/detective.js" + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" }, "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/devlop": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" + "node": ">= 0.10.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/dezalgo": { - "version": "1.0.4", - "license": "ISC", + "node_modules/express-async-errors": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/express-async-errors/-/express-async-errors-3.1.1.tgz", + "integrity": "sha512-h6aK1da4tpqWSbyCa3FxB/V6Ehd4EEB15zyQq9qe75OZBp0krinNKuH4rAY+S/U/2I36vdLAUFSjQJ+TFmODng==", "peer": true, - "dependencies": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" + "peerDependencies": { + "express": "^4.16.2" } }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "license": "MIT", + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "peer": true, "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" + "ms": "2.0.0" } }, - "node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.12.1", - "license": "MIT" + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "peer": true }, - "node_modules/docker-compose": { - "version": "0.24.8", - "license": "MIT", + "node_modules/express/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "peer": true, "dependencies": { - "yaml": "^2.2.2" + "side-channel": "^1.0.6" }, "engines": { - "node": ">= 6.0.0" + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/docker-modem": { - "version": "3.0.8", - "license": "Apache-2.0", + "node_modules/fast-content-type-parse": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-1.1.0.tgz", + "integrity": "sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==", + "peer": true + }, + "node_modules/fast-decode-uri-component": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", + "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==", + "peer": true + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, "dependencies": { - "debug": "^4.1.1", - "readable-stream": "^3.5.0", - "split-ca": "^1.0.1", - "ssh2": "^1.11.0" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" }, "engines": { - "node": ">= 8.0" + "node": ">=8.6.0" } }, - "node_modules/docker-modem/node_modules/readable-stream": { - "version": "3.6.2", - "license": "MIT", + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "is-glob": "^4.0.1" }, "engines": { "node": ">= 6" } }, - "node_modules/dockerode": { - "version": "3.3.5", - "license": "Apache-2.0", + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-json-stringify": { + "version": "5.16.1", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-5.16.1.tgz", + "integrity": "sha512-KAdnLvy1yu/XrRtP+LJnxbBGrhN+xXu+gt3EUvZhYGKCr3lFHq/7UFJHHFgmJKoqlh6B40bZLEv7w46B0mqn1g==", + "peer": true, "dependencies": { - "@balena/dockerignore": "^1.0.2", - "docker-modem": "^3.0.0", - "tar-fs": "~2.0.1" - }, - "engines": { - "node": ">= 8.0" + "@fastify/merge-json-schemas": "^0.1.0", + "ajv": "^8.10.0", + "ajv-formats": "^3.0.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^2.1.0", + "json-schema-ref-resolver": "^1.0.1", + "rfdc": "^1.2.0" } }, - "node_modules/dockerode/node_modules/readable-stream": { - "version": "3.6.2", - "license": "MIT", + "node_modules/fast-json-stringify/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "peer": true, "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, - "engines": { - "node": ">= 6" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/dockerode/node_modules/tar-fs": { - "version": "2.0.1", - "license": "MIT", + "node_modules/fast-json-stringify/node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "peer": true, "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.0.0" + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/dockerode/node_modules/tar-stream": { - "version": "2.2.0", - "license": "MIT", + "node_modules/fast-json-stringify/node_modules/ajv/node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "peer": true + }, + "node_modules/fast-json-stringify/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "peer": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fast-querystring": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", + "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", + "peer": true, "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" + "fast-decode-uri-component": "^1.0.1" } }, - "node_modules/domain-browser": { - "version": "1.2.0", - "license": "MIT", + "node_modules/fast-redact": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz", + "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==", + "peer": true, "engines": { - "node": ">=0.4", - "npm": ">=1.2" + "node": ">=6" } }, - "node_modules/dotenv": { - "version": "16.4.7", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "license": "MIT", + "node_modules/fast-uri": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-2.4.0.tgz", + "integrity": "sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA==", + "peer": true + }, + "node_modules/fastify": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.29.0.tgz", + "integrity": "sha512-MaaUHUGcCgC8fXQDsDtioaCcag1fmPJ9j64vAKunqZF4aSub040ZGi/ag8NGE2714yREPOKZuHCfpPzuUD3UQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "peer": true, "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" + "@fastify/ajv-compiler": "^3.5.0", + "@fastify/error": "^3.4.0", + "@fastify/fast-json-stringify-compiler": "^4.3.0", + "abstract-logging": "^2.0.1", + "avvio": "^8.3.0", + "fast-content-type-parse": "^1.1.0", + "fast-json-stringify": "^5.8.0", + "find-my-way": "^8.0.0", + "light-my-request": "^5.11.0", + "pino": "^9.0.0", + "process-warning": "^3.0.0", + "proxy-addr": "^2.0.7", + "rfdc": "^1.3.0", + "secure-json-parse": "^2.7.0", + "semver": "^7.5.4", + "toad-cache": "^3.3.0" } }, - "node_modules/duplexer2": { - "version": "0.1.4", - "license": "BSD-3-Clause", + "node_modules/fastify-plugin": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-4.5.1.tgz", + "integrity": "sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==", + "peer": true + }, + "node_modules/fastq": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz", + "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==", "dependencies": { - "readable-stream": "^2.0.2" + "reusify": "^1.0.4" } }, - "node_modules/duplexify": { - "version": "3.7.1", - "license": "MIT", + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, "dependencies": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "license": "MIT" - }, - "node_modules/ee-first": { - "version": "1.1.1", - "license": "MIT", + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", "peer": true }, - "node_modules/elliptic": { - "version": "6.6.1", - "license": "MIT", + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.1", - "license": "MIT" - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "license": "MIT" - }, - "node_modules/emoji-regex-xs": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "license": "MIT", + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "peer": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, "engines": { "node": ">= 0.8" } }, - "node_modules/encoding": { - "version": "0.1.13", - "license": "MIT", - "optional": true, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "peer": true, "dependencies": { - "iconv-lite": "^0.6.2" + "ms": "2.0.0" } }, - "node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "license": "MIT", - "optional": true, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "peer": true + }, + "node_modules/find-my-way": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-8.2.2.tgz", + "integrity": "sha512-Dobi7gcTEq8yszimcfp/R7+owiT4WncAJ7VTTgFH1jYJ5GaG1FbhjwDG820hptN0QDFvzVY3RfCzdInvGPGzjA==", "peer": true, "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "fast-deep-equal": "^3.1.3", + "fast-querystring": "^1.0.0", + "safe-regex2": "^3.1.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "license": "MIT", - "dependencies": { - "once": "^1.4.0" + "node": ">=14" } }, - "node_modules/entities": { - "version": "4.5.0", + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, - "license": "BSD-2-Clause", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, "engines": { - "node": ">=0.12" + "node": ">=10" }, "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/env-paths": { - "version": "2.2.1", - "license": "MIT", - "optional": true, - "peer": true, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, "engines": { - "node": ">=6" + "node": ">=16" } }, - "node_modules/env-string": { - "version": "1.0.1", - "license": "MIT" + "node_modules/flatted": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "dev": true }, - "node_modules/err-code": { - "version": "2.0.3", - "license": "MIT", - "optional": true, - "peer": true + "node_modules/focus-trap": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.4.tgz", + "integrity": "sha512-xx560wGBk7seZ6y933idtjJQc1l+ck+pI3sKvhKozdBV1dRZoKhkW5xoCaFv9tQiX5RH1xfSxjuNu6g+lmN/gw==", + "dev": true, + "dependencies": { + "tabbable": "^6.2.0" + } }, - "node_modules/es-define-property": { - "version": "1.0.1", - "license": "MIT", + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, "engines": { - "node": ">= 0.4" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/es-errors": { - "version": "1.3.0", - "license": "MIT", + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "peer": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, "engines": { - "node": ">= 0.4" + "node": ">= 6" } }, - "node_modules/es-object-atoms": { - "version": "1.0.0", - "license": "MIT", + "node_modules/formidable": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.2.tgz", + "integrity": "sha512-Jqc1btCy3QzRbJaICGwKcBfGWuLADRerLzDqi2NwSt/UkXLsHJw2TVResiaoBufHVHy9aSgClOHCeJsSsFLTbg==", + "peer": true, "dependencies": { - "es-errors": "^1.3.0" + "dezalgo": "^1.0.4", + "hexoid": "^2.0.0", + "once": "^1.4.0" }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "peer": true, "engines": { - "node": ">= 0.4" + "node": ">= 0.6" } }, - "node_modules/esbuild": { - "version": "0.24.2", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "peer": true, "engines": { - "node": ">=18" + "node": ">= 0.6" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "peer": true, + "dependencies": { + "minipass": "^3.0.0" }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.2", - "@esbuild/android-arm": "0.24.2", - "@esbuild/android-arm64": "0.24.2", - "@esbuild/android-x64": "0.24.2", - "@esbuild/darwin-arm64": "0.24.2", - "@esbuild/darwin-x64": "0.24.2", - "@esbuild/freebsd-arm64": "0.24.2", - "@esbuild/freebsd-x64": "0.24.2", - "@esbuild/linux-arm": "0.24.2", - "@esbuild/linux-arm64": "0.24.2", - "@esbuild/linux-ia32": "0.24.2", - "@esbuild/linux-loong64": "0.24.2", - "@esbuild/linux-mips64el": "0.24.2", - "@esbuild/linux-ppc64": "0.24.2", - "@esbuild/linux-riscv64": "0.24.2", - "@esbuild/linux-s390x": "0.24.2", - "@esbuild/linux-x64": "0.24.2", - "@esbuild/netbsd-arm64": "0.24.2", - "@esbuild/netbsd-x64": "0.24.2", - "@esbuild/openbsd-arm64": "0.24.2", - "@esbuild/openbsd-x64": "0.24.2", - "@esbuild/sunos-x64": "0.24.2", - "@esbuild/win32-arm64": "0.24.2", - "@esbuild/win32-ia32": "0.24.2", - "@esbuild/win32-x64": "0.24.2" + "engines": { + "node": ">= 8" } }, - "node_modules/escalade": { - "version": "3.2.0", - "license": "MIT", + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "peer": true, + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "license": "MIT", - "peer": true + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "license": "MIT", + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=0.8.0" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/eslint": { - "version": "9.17.0", - "dev": true, - "license": "MIT", + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "deprecated": "This package is no longer supported.", + "optional": true, + "peer": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.19.0", - "@eslint/core": "^0.9.0", - "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.17.0", - "@eslint/plugin-kit": "^0.2.3", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.1", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.2.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "dev": true, - "license": "MIT", - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" + "node_modules/gauge/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "optional": true, + "peer": true, + "engines": { + "node": ">=8" } }, - "node_modules/eslint-plugin-prettier": { - "version": "5.2.1", - "dev": true, - "license": "MIT", + "node_modules/gauge/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "optional": true, + "peer": true + }, + "node_modules/gauge/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "optional": true, + "peer": true, "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.9.1" + "ansi-regex": "^5.0.1" }, "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint-plugin-prettier" - }, - "peerDependencies": { - "@types/eslint": ">=8.0.0", - "eslint": ">=8.0.0", - "eslint-config-prettier": "*", - "prettier": ">=3.0.0" - }, - "peerDependenciesMeta": { - "@types/eslint": { - "optional": true - }, - "eslint-config-prettier": { - "optional": true - } + "node": ">=8" } }, - "node_modules/eslint-scope": { - "version": "8.2.0", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/get-assigned-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", + "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==" + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", + "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "call-bind-apply-helpers": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "function-bind": "^1.1.2", + "get-proto": "^1.0.0", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">= 0.4" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "dev": true, - "license": "Apache-2.0", + "node_modules/get-port": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", + "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=8" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "license": "MIT", + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", + "node_modules/get-tsconfig": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz", + "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" + "dependencies": { + "resolve-pkg-maps": "^1.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.2.0", + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "peer": true + }, + "node_modules/glob": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.1.tgz", + "integrity": "sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==", "dev": true, - "license": "Apache-2.0", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "20 || >=22" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "is-glob": "^4.0.3" }, "engines": { - "node": "*" + "node": ">=10.13.0" } }, - "node_modules/espree": { - "version": "10.3.0", + "node_modules/glob/node_modules/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.14.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "20 || >=22" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.0", + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, - "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/google-protobuf": { + "version": "3.21.4", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.4.tgz", + "integrity": "sha512-MnG7N936zcKTco4Jd2PX2U96Kf9PxygAPKBug+74LHzmHXmceN16MmRcdgZv+DGef/S9YvQAfRsNCn4cjf9yyQ==" + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esquery": { - "version": "1.6.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", + "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", "engines": { - "node": ">=0.10" + "node": ">= 0.4.0" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", "dependencies": { - "estraverse": "^5.2.0" + "ansi-regex": "^2.0.0" }, "engines": { - "node": ">=4.0" + "node": ">=0.10.0" } }, - "node_modules/estraverse": { - "version": "5.3.0", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "engines": { - "node": ">=4.0" + "node": ">=0.10.0" } }, - "node_modules/estree-is-member-expression": { - "version": "1.0.0", - "license": "Apache-2.0" - }, - "node_modules/estree-walker": { - "version": "2.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/esutils": { - "version": "2.0.3", + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "BSD-2-Clause", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/etag": { - "version": "1.8.1", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.6" + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "license": "MIT", + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/events": { - "version": "2.1.0", - "license": "MIT", - "engines": { - "node": ">=0.4.x" - } + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "license": "MIT", + "node_modules/hash-base": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.5.tgz", + "integrity": "sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==", "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" } }, - "node_modules/execspawn": { - "version": "1.0.1", - "license": "MIT", + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dependencies": { - "util-extend": "^1.0.1" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" } }, - "node_modules/expand-template": { - "version": "2.0.3", - "license": "(MIT OR WTFPL)", - "peer": true, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, "engines": { - "node": ">=6" + "node": ">= 0.4" } }, - "node_modules/express": { - "version": "4.21.2", - "license": "MIT", - "peer": true, + "node_modules/hast-util-to-html": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.4.tgz", + "integrity": "sha512-wxQzXtdbhiwGAUKrnQJXlOPmHnEehzphwkK7aluUPQ+lEc1xefC8pblMgpp2w5ldBTEfveRIrADcrhGIWrlTDA==", + "dev": true, "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express-async-errors": { - "version": "3.1.1", - "license": "ISC", - "peer": true, - "peerDependencies": { - "express": "^4.16.2" + "url": "https://opencollective.com/unified" } }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "peer": true, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dev": true, "dependencies": { - "ms": "2.0.0" + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/express/node_modules/ms": { + "node_modules/hexoid": { "version": "2.0.0", - "license": "MIT", - "peer": true - }, - "node_modules/express/node_modules/qs": { - "version": "6.13.0", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-2.0.0.tgz", + "integrity": "sha512-qlspKUK7IlSQv2o+5I7yhUd7TxlOG2Vr5LTa3ve2XSNVKAL/n/u/7KLvKmFNimomDIKvZFXWHv0T12mv7rT8Aw==", "peer": true, - "dependencies": { - "side-channel": "^1.0.6" - }, "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/fast-content-type-parse": { - "version": "1.1.0", - "license": "MIT", - "peer": true - }, - "node_modules/fast-decode-uri-component": { + "node_modules/hmac-drbg": { "version": "1.0.1", - "license": "MIT", - "peer": true + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "license": "MIT" + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "dev": true }, - "node_modules/fast-diff": { - "version": "1.3.0", + "node_modules/hsl-to-rgb-for-reals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/hsl-to-rgb-for-reals/-/hsl-to-rgb-for-reals-1.1.1.tgz", + "integrity": "sha512-LgOWAkrN0rFaQpfdWBQlv/VhkOxb5AsBjk6NQVx4yEzWS923T07X0M1Y0VNko2H52HeSpZrZNNMJ0aFqsdVzQg==" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", "dev": true, - "license": "Apache-2.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "license": "MIT" + "node_modules/htmlescape": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "integrity": "sha512-eVcrzgbR4tim7c7soKQKtxa/kQM4TzjnlU83rcZ9bHU6t31ehfV7SktN6McWgwPWg+JYMA/O3qpGxBvFq1z2Jg==", + "engines": { + "node": ">=0.10" + } }, - "node_modules/fast-glob": { - "version": "3.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "optional": true, + "peer": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "peer": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "engines": { - "node": ">=8.6.0" + "node": ">= 0.8" } }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "dev": true, - "license": "ISC", + "node_modules/http-problem-details": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/http-problem-details/-/http-problem-details-0.1.7.tgz", + "integrity": "sha512-+ccES43ePQOnZDIkEuo4gNyT0R/Gkulk79oZ3a9FuQQFZYPcUx0OPBe5ztmehe6t79WN/me7APHX3yD6Ha5CHA==", + "peer": true + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "optional": true, + "peer": true, "dependencies": { - "is-glob": "^4.0.1" + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" }, "engines": { "node": ">= 6" } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "license": "MIT" + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==" }, - "node_modules/fast-json-stringify": { - "version": "5.16.1", - "license": "MIT", + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "optional": true, "peer": true, "dependencies": { - "@fastify/merge-json-schemas": "^0.1.0", - "ajv": "^8.10.0", - "ajv-formats": "^3.0.1", - "fast-deep-equal": "^3.1.3", - "fast-uri": "^2.1.0", - "json-schema-ref-resolver": "^1.0.1", - "rfdc": "^1.2.0" + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/fast-json-stringify/node_modules/ajv": { - "version": "8.17.1", - "license": "MIT", + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "optional": true, "peer": true, "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "ms": "^2.0.0" } }, - "node_modules/fast-json-stringify/node_modules/ajv-formats": { - "version": "3.0.1", - "license": "MIT", + "node_modules/hyperscript-attribute-to-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hyperscript-attribute-to-property/-/hyperscript-attribute-to-property-1.0.2.tgz", + "integrity": "sha512-oerMul16jZCmrbNsUw8QgrtDzF8lKgFri1bKQjReLw1IhiiNkI59CWuzZjJDGT79UQ1YiWqXhJMv/tRMVqgtkA==" + }, + "node_modules/hyperx": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/hyperx/-/hyperx-2.5.4.tgz", + "integrity": "sha512-iOkSh7Yse7lsN/B9y7OsevLWjeXPqGuHQ5SbwaiJM5xAhWFqhoN6erpK1dQsS12OFU36lyai1pnx1mmzWLQqcA==", + "dependencies": { + "hyperscript-attribute-to-property": "^1.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "peer": true, "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" + "safer-buffer": ">= 2.1.2 < 3" }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } + "engines": { + "node": ">=0.10.0" } }, - "node_modules/fast-json-stringify/node_modules/ajv/node_modules/fast-uri": { - "version": "3.0.3", - "license": "BSD-3-Clause", - "peer": true - }, - "node_modules/fast-json-stringify/node_modules/json-schema-traverse": { - "version": "1.0.0", - "license": "MIT", - "peer": true + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, - "license": "MIT" + "engines": { + "node": ">= 4" + } }, - "node_modules/fast-querystring": { - "version": "1.1.2", - "license": "MIT", - "peer": true, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, "dependencies": { - "fast-decode-uri-component": "^1.0.1" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fast-redact": { - "version": "3.5.0", - "license": "MIT", - "peer": true, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "devOptional": true, "engines": { - "node": ">=6" + "node": ">=0.8.19" } }, - "node_modules/fast-safe-stringify": { - "version": "2.1.1", - "license": "MIT" + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } }, - "node_modules/fast-uri": { - "version": "2.4.0", - "license": "MIT", + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "optional": true, "peer": true }, - "node_modules/fastify": { - "version": "4.29.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT", - "peer": true, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dependencies": { - "@fastify/ajv-compiler": "^3.5.0", - "@fastify/error": "^3.4.0", - "@fastify/fast-json-stringify-compiler": "^4.3.0", - "abstract-logging": "^2.0.1", - "avvio": "^8.3.0", - "fast-content-type-parse": "^1.1.0", - "fast-json-stringify": "^5.8.0", - "find-my-way": "^8.0.0", - "light-my-request": "^5.11.0", - "pino": "^9.0.0", - "process-warning": "^3.0.0", - "proxy-addr": "^2.0.7", - "rfdc": "^1.3.0", - "secure-json-parse": "^2.7.0", - "semver": "^7.5.4", - "toad-cache": "^3.3.0" + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/fastify-plugin": { - "version": "4.5.1", - "license": "MIT", + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "peer": true }, - "node_modules/fastq": { - "version": "1.18.0", - "license": "ISC", + "node_modules/inline-source-map": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.3.tgz", + "integrity": "sha512-1aVsPEsJWMJq/pdMU61CDlm1URcW702MTB4w9/zUjMus6H/Py8o7g68Pr9D4I6QluWGt/KdmswuRhaA05xVR1w==", "dependencies": { - "reusify": "^1.0.4" + "source-map": "~0.5.3" } }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "dev": true, - "license": "MIT", + "node_modules/insert-module-globals": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.1.tgz", + "integrity": "sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==", + "dependencies": { + "acorn-node": "^1.5.2", + "combine-source-map": "^0.8.0", + "concat-stream": "^1.6.1", + "is-buffer": "^1.1.0", + "JSONStream": "^1.0.3", + "path-is-absolute": "^1.0.1", + "process": "~0.11.0", + "through2": "^2.0.0", + "undeclared-identifiers": "^1.1.2", + "xtend": "^4.0.0" + }, + "bin": { + "insert-module-globals": "bin/cmd.js" + } + }, + "node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==" + }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "optional": true, + "peer": true, + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "peer": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-boolean-attribute": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/is-boolean-attribute/-/is-boolean-attribute-0.0.1.tgz", + "integrity": "sha512-0kXT52Scokg2Miscvsn5UVqg6y1691vcLJcagie1YHJB4zOEuAhMERLX992jtvaStGy2xQTqOtJhvmG/MK1T5w==" + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dependencies": { - "flat-cache": "^4.0.0" + "hasown": "^2.0.2" }, "engines": { - "node": ">=16.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "license": "MIT", - "peer": true - }, - "node_modules/fill-range": { - "version": "7.1.1", + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/finalhandler": { - "version": "1.3.1", - "license": "MIT", - "peer": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "peer": true, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "dependencies": { - "ms": "2.0.0" + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "license": "MIT", + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "optional": true, "peer": true }, - "node_modules/find-my-way": { - "version": "8.2.2", - "license": "MIT", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-querystring": "^1.0.0", - "safe-regex2": "^3.1.0" - }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, "engines": { - "node": ">=14" + "node": ">=0.12.0" } }, - "node_modules/find-up": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/flat-cache": { - "version": "4.0.1", + "node_modules/is-what": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" + "engines": { + "node": ">=12.13" }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", "engines": { - "node": ">=16" + "node": ">=4" } }, - "node_modules/flatted": { - "version": "3.3.2", - "dev": true, - "license": "ISC" + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, - "node_modules/focus-trap": { - "version": "7.6.2", - "dev": true, - "license": "MIT", - "dependencies": { - "tabbable": "^6.2.0" - } + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, - "node_modules/foreground-child": { - "version": "3.3.0", - "license": "ISC", + "node_modules/jackspeak": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.3.tgz", + "integrity": "sha512-oSwM7q8PTHQWuZAlp995iPpPJ4Vkl7qT0ZRD+9duL9j2oBy6KcTfyxc8mEuHJYC+z/kbps80aJLkaNzTOrf/kw==", + "dev": true, "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" + "@isaacs/cliui": "^8.0.2" }, "engines": { - "node": ">=14" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/form-data": { - "version": "4.0.1", - "license": "MIT", - "peer": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, + "node_modules/joycon": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", + "dev": true, "engines": { - "node": ">= 6" + "node": ">=10" } }, - "node_modules/formidable": { - "version": "3.5.2", - "license": "MIT", - "peer": true, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, "dependencies": { - "dezalgo": "^1.0.4", - "hexoid": "^2.0.0", - "once": "^1.4.0" + "argparse": "^2.0.1" }, - "funding": { - "url": "https://ko-fi.com/tunnckoCore/commissions" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/forwarded": { - "version": "0.2.0", - "license": "MIT", - "peer": true, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "optional": true, + "peer": true + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", + "dev": true, "engines": { - "node": ">= 0.6" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/fresh": { - "version": "0.5.2", - "license": "MIT", + "node_modules/json-schema-ref-resolver": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-1.0.1.tgz", + "integrity": "sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==", "peer": true, - "engines": { - "node": ">= 0.6" + "dependencies": { + "fast-deep-equal": "^3.1.3" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "license": "MIT" + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "license": "ISC", - "peer": true, + "node_modules/json-stable-stringify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", + "integrity": "sha512-nKtD/Qxm7tWdZqJoldEC7fF0S41v0mWbeaXG3637stOWfyGxTgWTYE2wtfKmjzpvxv2MA2xzxsXOIiwUpkX6Qw==", "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" + "jsonify": "~0.0.0" } }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "license": "ISC", - "peer": true, - "dependencies": { - "yallist": "^4.0.0" + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "license": "ISC" - }, - "node_modules/function-bind": { - "version": "1.1.2", - "license": "MIT", + "node_modules/jsonify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gauge": { - "version": "4.0.4", - "license": "ISC", - "optional": true, - "peer": true, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "*" } }, - "node_modules/gauge/node_modules/ansi-regex": { - "version": "5.0.1", - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=8" + "node_modules/jsonstream2": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/jsonstream2/-/jsonstream2-1.1.2.tgz", + "integrity": "sha512-sVWipJW3f/NGAZfQnqys6cGTUc6vgiTl4eFK0Y3lzi2RV4Fo5hzgUpgc/jS4qY8/nnntFPiXt14ujrS2TzfWkQ==", + "dependencies": { + "jsonparse": "0.0.6", + "through2": "^0.6.1", + "type-component": "0.0.1" + }, + "bin": { + "jsonstream": "bin/jsonstream.js" } }, - "node_modules/gauge/node_modules/signal-exit": { - "version": "3.0.7", - "license": "ISC", - "optional": true, - "peer": true + "node_modules/jsonstream2/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" }, - "node_modules/gauge/node_modules/strip-ansi": { - "version": "6.0.1", - "license": "MIT", - "optional": true, - "peer": true, + "node_modules/jsonstream2/node_modules/jsonparse": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.6.tgz", + "integrity": "sha512-blsKgQZEztkzXe/GF9tr3OWqx8dbMyHqJQofvpUoCf1cAmDNqTRv7UyCmZ5yC5YSWmaS2nP6UBiAkoJBzmPhCQ==", + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/jsonstream2/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "node_modules/get-assigned-identifiers": { - "version": "1.2.0", - "license": "Apache-2.0" + "node_modules/jsonstream2/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" + "node_modules/jsonstream2/node_modules/through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", + "dependencies": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" } }, - "node_modules/get-intrinsic": { - "version": "1.2.7", - "license": "MIT", + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "function-bind": "^1.1.2", - "get-proto": "^1.0.0", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "json-buffer": "3.0.1" } }, - "node_modules/get-port": { - "version": "5.1.1", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/labeled-stream-splicer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", + "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", + "dependencies": { + "inherits": "^2.0.1", + "stream-splicer": "^2.0.0" } }, - "node_modules/get-proto": { + "node_modules/lazystream": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" + "readable-stream": "^2.0.5" }, "engines": { - "node": ">= 0.4" + "node": ">= 0.6.3" } }, - "node_modules/get-tsconfig": { - "version": "4.8.1", + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, - "license": "MIT", "dependencies": { - "resolve-pkg-maps": "^1.0.0" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/github-from-package": { - "version": "0.0.0", - "license": "MIT", - "peer": true + "node_modules/light-my-request": { + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.14.0.tgz", + "integrity": "sha512-aORPWntbpH5esaYpGOOmri0OHDOe3wC5M2MQxZ9dvMLZm6DnaAn0kJlcbU9hwsQgLzmZyReKwFwwPkR+nHu5kA==", + "peer": true, + "dependencies": { + "cookie": "^0.7.0", + "process-warning": "^3.0.0", + "set-cookie-parser": "^2.4.1" + } }, - "node_modules/glob": { - "version": "11.0.0", + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^4.0.1", - "minimatch": "^10.0.0", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^2.0.0" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, "engines": { - "node": "20 || >=22" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/antonk52" } }, - "node_modules/glob-parent": { - "version": "6.0.2", + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/load-tsconfig": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", + "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, "engines": { - "node": ">=10.13.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/glob/node_modules/minimatch": { - "version": "10.0.1", + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, - "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": "20 || >=22" + "p-locate": "^5.0.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/globals": { - "version": "14.0.0", - "dev": true, - "license": "MIT", "engines": { - "node": ">=18" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/google-protobuf": { - "version": "3.21.4", - "license": "(BSD-3-Clause AND Apache-2.0)" + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "node_modules/gopd": { - "version": "1.2.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "license": "ISC" + "node_modules/lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha512-eDn9kqrAmVUC1wmZvlQ6Uhde44n+tXpqPrN8olQJbttgh0oKclk+SF54P47VEGE9CEiMeRwAP8BaM7UHvBkz2A==" }, - "node_modules/graphemer": { - "version": "1.4.0", - "dev": true, - "license": "MIT" + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true }, - "node_modules/has": { - "version": "1.0.4", - "license": "MIT", + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true + }, + "node_modules/long": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.0.tgz", + "integrity": "sha512-5vvY5yF1zF/kXk+L94FRiTDa1Znom46UjPCH6/XbSvS8zBKMFBHTJk8KDMqJ+2J6QezQFi7k1k8v21ClJYHPaw==" + }, + "node_modules/lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==" + }, + "node_modules/lru-cache": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz", + "integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==", + "dev": true, "engines": { - "node": ">= 0.4.0" + "node": "20 || >=22" } }, - "node_modules/has-ansi": { - "version": "2.0.0", - "license": "MIT", + "node_modules/magic-string": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.23.2.tgz", + "integrity": "sha512-oIUZaAxbcxYIp4AyLafV6OVKoB3YouZs0UTCJ8mOKBHNyJgGDaMJ4TgA+VylJh6fx7EQCC52XkbURxxG9IoJXA==", "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" + "sourcemap-codec": "^1.4.1" } }, - "node_modules/has-ansi/node_modules/ansi-regex": { - "version": "2.1.1", - "license": "MIT", + "node_modules/make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dependencies": { + "pify": "^3.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "license": "MIT", + "node_modules/make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "optional": true, + "peer": true, "dependencies": { - "es-define-property": "^1.0.0" + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 10" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "license": "ISC" - }, - "node_modules/hash-base": { - "version": "3.0.5", - "license": "MIT", + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "optional": true, + "peer": true, "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1" + "yallist": "^4.0.0" }, "engines": { - "node": ">= 0.10" + "node": ">=10" } }, - "node_modules/hash.js": { - "version": "1.1.7", - "license": "MIT", + "node_modules/make-fetch-happen/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "optional": true, + "peer": true, "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/hasown": { - "version": "2.0.2", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "dev": true + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "engines": { "node": ">= 0.4" } }, - "node_modules/hast-util-to-html": { - "version": "9.0.4", - "dev": true, - "license": "MIT", + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-whitespace": "^3.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "stringify-entities": "^4.0.0", - "zwitch": "^2.0.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "node_modules/hast-util-whitespace": { - "version": "3.0.0", + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", "dev": true, - "license": "MIT", "dependencies": { - "@types/hast": "^3.0.0" + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/hexoid": { - "version": "2.0.0", - "license": "MIT", + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "peer": true, "engines": { - "node": ">=8" - } - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" + "node": ">= 0.6" } }, - "node_modules/hookable": { - "version": "5.5.3", - "dev": true, - "license": "MIT" - }, - "node_modules/hsl-to-rgb-for-reals": { - "version": "1.1.1", - "license": "ISC" + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "peer": true }, - "node_modules/html-void-elements": { - "version": "3.0.0", + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/htmlescape": { - "version": "1.1.1", - "license": "MIT", "engines": { - "node": ">=0.10" + "node": ">= 0.10.0" } }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "license": "BSD-2-Clause", - "optional": true, - "peer": true - }, - "node_modules/http-errors": { - "version": "2.0.0", - "license": "MIT", + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", "peer": true, - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/http-problem-details": { - "version": "0.1.5", - "license": "MIT", - "peer": true - }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "license": "MIT", - "optional": true, - "peer": true, + "node_modules/merge-source-map": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz", + "integrity": "sha512-PGSmS0kfnTnMJCzJ16BLLCEe6oeYCamKFFdQKshi4BmM6FUwipjVOcBFGxqtQtirtAG4iZvHlqST9CpZKqlRjA==", "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" + "source-map": "^0.5.6" } }, - "node_modules/https-browserify": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, "engines": { - "node": ">= 6" + "node": ">= 8" } }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "license": "MIT", - "optional": true, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "peer": true, - "dependencies": { - "ms": "^2.0.0" + "engines": { + "node": ">= 0.6" } }, - "node_modules/hyperscript-attribute-to-property": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/hyperx": { - "version": "2.5.4", - "license": "BSD", + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "hyperscript-attribute-to-property": "^1.0.0" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "license": "MIT", - "peer": true, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/ieee754": { - "version": "1.2.1", + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "dev": true, "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/feross" + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" }, { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", + "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } - ], - "license": "BSD-3-Clause" + ] }, - "node_modules/ignore": { - "version": "5.3.2", + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, - "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, "engines": { - "node": ">= 4" + "node": ">=8.6" } }, - "node_modules/import-fresh": { - "version": "3.3.0", - "dev": true, - "license": "MIT", + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" + "bn.js": "^4.0.0", + "brorand": "^1.0.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "miller-rabin": "bin/miller-rabin" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==" }, - "node_modules/indent-string": { - "version": "4.0.0", - "license": "MIT", - "optional": true, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "peer": true, + "bin": { + "mime": "cli.js" + }, "engines": { - "node": ">=8" - } - }, - "node_modules/infer-owner": { - "version": "1.0.4", - "license": "ISC", - "optional": true, - "peer": true - }, - "node_modules/inflight": { - "version": "1.0.6", - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "license": "ISC" - }, - "node_modules/ini": { - "version": "1.3.8", - "license": "ISC", - "peer": true - }, - "node_modules/inline-source-map": { - "version": "0.6.3", - "license": "MIT", - "dependencies": { - "source-map": "~0.5.3" + "node": ">=4.0.0" } }, - "node_modules/insert-module-globals": { - "version": "7.2.1", - "license": "MIT", - "dependencies": { - "acorn-node": "^1.5.2", - "combine-source-map": "^0.8.0", - "concat-stream": "^1.6.1", - "is-buffer": "^1.1.0", - "JSONStream": "^1.0.3", - "path-is-absolute": "^1.0.1", - "process": "~0.11.0", - "through2": "^2.0.0", - "undeclared-identifiers": "^1.1.2", - "xtend": "^4.0.0" - }, - "bin": { - "insert-module-globals": "bin/cmd.js" + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "peer": true, + "engines": { + "node": ">= 0.6" } }, - "node_modules/internmap": { - "version": "1.0.1", - "license": "ISC" - }, - "node_modules/ip-address": { - "version": "9.0.5", - "license": "MIT", - "optional": true, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "peer": true, "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" + "mime-db": "1.52.0" }, "engines": { - "node": ">= 12" + "node": ">= 0.6" } }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "license": "MIT", + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "peer": true, "engines": { - "node": ">= 0.10" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-boolean-attribute": { - "version": "0.0.1", - "license": "MIT" + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, - "node_modules/is-buffer": { - "version": "1.1.6", - "license": "MIT" + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" }, - "node_modules/is-core-module": { - "version": "2.16.1", - "license": "MIT", + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dependencies": { - "hasown": "^2.0.2" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "license": "MIT", + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "dev": true, - "license": "MIT", + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "optional": true, + "peer": true, "dependencies": { - "is-extglob": "^2.1.1" + "minipass": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, - "node_modules/is-lambda": { - "version": "1.0.1", - "license": "MIT", + "node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "optional": true, - "peer": true - }, - "node_modules/is-number": { - "version": "7.0.0", - "dev": true, - "license": "MIT", + "peer": true, + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { - "node": ">=0.12.0" + "node": ">=8" } }, - "node_modules/is-stream": { - "version": "2.0.1", - "license": "MIT", + "node_modules/minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "optional": true, + "peer": true, + "dependencies": { + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + }, "engines": { "node": ">=8" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "encoding": "^0.1.12" } }, - "node_modules/is-what": { - "version": "4.1.16", - "dev": true, - "license": "MIT", + "node_modules/minipass-fetch/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "optional": true, + "peer": true, + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { - "node": ">=12.13" + "node": ">=8" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "optional": true, + "peer": true, + "dependencies": { + "minipass": "^3.0.0" }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" + "engines": { + "node": ">= 8" } }, - "node_modules/is-wsl": { - "version": "1.1.0", - "license": "MIT", + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "optional": true, + "peer": true, + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/isarray": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "license": "ISC" - }, - "node_modules/jackspeak": { - "version": "4.0.2", - "dev": true, - "license": "BlueOak-1.0.0", + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "optional": true, + "peer": true, "dependencies": { - "@isaacs/cliui": "^8.0.2" + "minipass": "^3.0.0" }, "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8" } }, - "node_modules/joycon": { - "version": "3.1.1", - "dev": true, - "license": "MIT", + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "optional": true, + "peer": true, + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/js-yaml": { - "version": "4.1.0", - "dev": true, - "license": "MIT", + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "optional": true, + "peer": true, "dependencies": { - "argparse": "^2.0.1" + "minipass": "^3.0.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=8" } }, - "node_modules/jsbn": { - "version": "1.1.0", - "license": "MIT", + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "optional": true, - "peer": true - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/json-parse-even-better-errors": { - "version": "3.0.2", - "dev": true, - "license": "MIT", + "peer": true, + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/json-schema-ref-resolver": { - "version": "1.0.1", - "license": "MIT", + "node_modules/minisearch": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.1.1.tgz", + "integrity": "sha512-b3YZEYCEH4EdCAtYP7OlDyx7FdPwNzuNwLQ34SfJpM9dlbBZzeXndGavTrC+VCiRWomL21SWfMc6SCKO/U2ZNw==", + "dev": true + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "peer": true, "dependencies": { - "fast-deep-equal": "^3.1.3" + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "license": "MIT" - }, - "node_modules/json-stable-stringify": { - "version": "0.0.1", - "license": "MIT", + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "peer": true, "dependencies": { - "jsonify": "~0.0.0" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "dev": true, - "license": "MIT" + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true }, - "node_modules/json5": { - "version": "2.2.3", - "dev": true, - "license": "MIT", + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "bin": { - "json5": "lib/cli.js" + "mkdirp": "bin/cmd.js" }, "engines": { - "node": ">=6" - } - }, - "node_modules/jsonify": { - "version": "0.0.1", - "license": "Public Domain", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=10" } }, - "node_modules/jsonparse": { - "version": "1.3.1", - "engines": [ - "node >= 0.2.0" - ], - "license": "MIT" + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" }, - "node_modules/JSONStream": { - "version": "1.3.5", - "license": "(MIT OR Apache-2.0)", + "node_modules/module-deps": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.3.tgz", + "integrity": "sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==", "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" + "browser-resolve": "^2.0.0", + "cached-path-relative": "^1.0.2", + "concat-stream": "~1.6.0", + "defined": "^1.0.0", + "detective": "^5.2.0", + "duplexer2": "^0.1.2", + "inherits": "^2.0.1", + "JSONStream": "^1.0.3", + "parents": "^1.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.4.0", + "stream-combiner2": "^1.1.1", + "subarg": "^1.0.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" }, "bin": { - "JSONStream": "bin.js" + "module-deps": "bin/cmd.js" }, "engines": { - "node": "*" + "node": ">= 0.8.0" } }, - "node_modules/jsonstream2": { - "version": "1.1.2", - "license": "MIT", + "node_modules/mongodb": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.13.0.tgz", + "integrity": "sha512-KeESYR5TEaFxOuwRqkOm3XOsMqCSkdeDMjaW5u2nuKfX7rqaofp7JQGoi7sVqQcNJTKuveNbzZtWMstb8ABP6Q==", + "peer": true, "dependencies": { - "jsonparse": "0.0.6", - "through2": "^0.6.1", - "type-component": "0.0.1" + "@mongodb-js/saslprep": "^1.1.9", + "bson": "^6.10.1", + "mongodb-connection-string-url": "^3.0.0" }, - "bin": { - "jsonstream": "bin/jsonstream.js" + "engines": { + "node": ">=16.20.1" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.1.0 || ^2.0.0", + "gcp-metadata": "^5.2.0", + "kerberos": "^2.0.1", + "mongodb-client-encryption": ">=6.0.0 <7", + "snappy": "^7.2.2", + "socks": "^2.7.1" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "gcp-metadata": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + }, + "socks": { + "optional": true + } } }, - "node_modules/jsonstream2/node_modules/isarray": { - "version": "0.0.1", - "license": "MIT" - }, - "node_modules/jsonstream2/node_modules/jsonparse": { - "version": "0.0.6", - "engines": [ - "node >= 0.2.0" - ], - "license": "MIT" - }, - "node_modules/jsonstream2/node_modules/readable-stream": { - "version": "1.0.34", - "license": "MIT", + "node_modules/mongodb-connection-string-url": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.2.tgz", + "integrity": "sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==", + "peer": true, "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "@types/whatwg-url": "^11.0.2", + "whatwg-url": "^14.1.0 || ^13.0.0" } }, - "node_modules/jsonstream2/node_modules/string_decoder": { - "version": "0.10.31", - "license": "MIT" + "node_modules/morphdom": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/morphdom/-/morphdom-2.7.4.tgz", + "integrity": "sha512-ATTbWMgGa+FaMU3FhnFYB6WgulCqwf6opOll4CBzmVDTLvPMmUPrEv8CudmLPK0MESa64+6B89fWOxP3+YIlxQ==" }, - "node_modules/jsonstream2/node_modules/through2": { - "version": "0.6.5", - "license": "MIT", + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/mutexify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mutexify/-/mutexify-1.4.0.tgz", + "integrity": "sha512-pbYSsOrSB/AKN5h/WzzLRMFgZhClWccf2XIB4RSMC8JbquiB0e0/SH5AIfdQMdyHmYtv4seU7yV/TvAwPLJ1Yg==", "dependencies": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" + "queue-tick": "^1.0.0" } }, - "node_modules/keyv": { - "version": "4.5.4", + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", "dev": true, - "license": "MIT", "dependencies": { - "json-buffer": "3.0.1" + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" } }, - "node_modules/labeled-stream-splicer": { - "version": "2.0.2", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "stream-splicer": "^2.0.0" - } + "node_modules/nan": { + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.0.tgz", + "integrity": "sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==", + "optional": true }, - "node_modules/lazystream": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } + "node_modules/nanoassert": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-1.1.0.tgz", + "integrity": "sha512-C40jQ3NzfkP53NsO8kEOFd79p4b9kDXQMwgiY1z8ZwrDZgUyom0AHwGegF4Dm99L+YoYhuaB0ceerUcXmqr1rQ==" }, - "node_modules/levn": { - "version": "0.4.1", - "dev": true, - "license": "MIT", + "node_modules/nanobench": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nanobench/-/nanobench-2.1.1.tgz", + "integrity": "sha512-z+Vv7zElcjN+OpzAxAquUayFLGK3JI/ubCl0Oh64YQqsTGG09CGqieJVQw4ui8huDnnAgrvTv93qi5UaOoNj8A==", "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" + "browser-process-hrtime": "^0.1.2", + "chalk": "^1.1.3", + "mutexify": "^1.1.0", + "pretty-hrtime": "^1.0.2" }, - "engines": { - "node": ">= 0.8.0" + "bin": { + "nanobench": "run.js", + "nanobench-compare": "compare.js" } }, - "node_modules/light-my-request": { - "version": "5.14.0", - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "cookie": "^0.7.0", - "process-warning": "^3.0.0", - "set-cookie-parser": "^2.4.1" + "node_modules/nanobench/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/lilconfig": { - "version": "3.1.3", - "dev": true, - "license": "MIT", + "node_modules/nanobench/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" + "node": ">=0.10.0" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "dev": true, - "license": "MIT" - }, - "node_modules/load-tsconfig": { - "version": "0.2.5", - "dev": true, - "license": "MIT", + "node_modules/nanobench/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=0.10.0" } }, - "node_modules/locate-path": { - "version": "6.0.0", - "dev": true, - "license": "MIT", + "node_modules/nanobench/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dependencies": { - "p-locate": "^5.0.0" + "ansi-regex": "^2.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/lodash": { - "version": "4.17.21", - "license": "MIT" - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "license": "MIT" - }, - "node_modules/lodash.memoize": { - "version": "3.0.4", - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.sortby": { - "version": "4.7.0", - "dev": true, - "license": "MIT" - }, - "node_modules/long": { - "version": "5.2.3", - "license": "Apache-2.0" - }, - "node_modules/lower-case": { - "version": "1.1.4", - "license": "MIT" - }, - "node_modules/lru-cache": { - "version": "11.0.2", - "dev": true, - "license": "ISC", + "node_modules/nanobench/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", "engines": { - "node": "20 || >=22" + "node": ">=0.8.0" } }, - "node_modules/magic-string": { - "version": "0.23.2", - "license": "MIT", + "node_modules/nanohtml": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/nanohtml/-/nanohtml-1.10.0.tgz", + "integrity": "sha512-r/3AQl+jxAxUIJRiKExUjBtFcE1cm4yTOsTIdVqqlxPNtBxJh522ANrcQYzdNHhPzbPgb7j6qujq6eGehBX0kg==", "dependencies": { - "sourcemap-codec": "^1.4.1" + "acorn-node": "^1.8.2", + "camel-case": "^3.0.0", + "convert-source-map": "^1.5.1", + "estree-is-member-expression": "^1.0.0", + "hyperx": "^2.5.0", + "is-boolean-attribute": "0.0.1", + "nanoassert": "^1.1.0", + "nanobench": "^2.1.0", + "normalize-html-whitespace": "^0.2.0", + "through2": "^2.0.3", + "transform-ast": "^2.4.0" } }, - "node_modules/make-dir": { - "version": "1.3.0", - "license": "MIT", - "dependencies": { - "pify": "^3.0.0" + "node_modules/nanohtml/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": ">=4" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/make-error": { - "version": "1.3.6", - "license": "ISC" + "node_modules/napi-build-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", + "peer": true }, - "node_modules/make-fetch-happen": { - "version": "9.1.0", - "license": "ISC", - "optional": true, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "peer": true, - "dependencies": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" - }, "engines": { - "node": ">= 10" + "node": ">= 0.6" } }, - "node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "6.0.0", - "license": "ISC", - "optional": true, + "node_modules/no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dependencies": { + "lower-case": "^1.1.1" + } + }, + "node_modules/node-abi": { + "version": "3.74.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.74.0.tgz", + "integrity": "sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==", "peer": true, "dependencies": { - "yallist": "^4.0.0" + "semver": "^7.3.5" }, "engines": { "node": ">=10" } }, - "node_modules/make-fetch-happen/node_modules/minipass": { - "version": "3.3.6", - "license": "ISC", + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "peer": true + }, + "node_modules/node-gyp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", "optional": true, "peer": true, "dependencies": { - "yallist": "^4.0.0" + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" }, "engines": { - "node": ">=8" - } - }, - "node_modules/mark.js": { - "version": "8.11.1", - "dev": true, - "license": "MIT" - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" + "node": ">= 10.12.0" } }, - "node_modules/md5.js": { - "version": "1.3.5", - "license": "MIT", + "node_modules/node-gyp/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "optional": true, + "peer": true, "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/mdast-util-to-hast": { - "version": "13.2.0", - "dev": true, - "license": "MIT", + "node_modules/node-gyp/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "optional": true, + "peer": true, "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/media-typer": { - "version": "0.3.0", - "license": "MIT", + "node_modules/node-gyp/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "optional": true, "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, "engines": { - "node": ">= 0.6" + "node": "*" } }, - "node_modules/memory-pager": { - "version": "1.5.0", - "license": "MIT", - "peer": true - }, - "node_modules/memorystream": { - "version": "0.3.1", - "dev": true, + "node_modules/node-gyp/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "optional": true, + "peer": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, "engines": { - "node": ">= 0.10.0" + "node": ">= 8" } }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "license": "MIT", + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "optional": true, "peer": true, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-source-map": { - "version": "1.0.4", - "license": "MIT", "dependencies": { - "source-map": "^0.5.6" + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" } }, - "node_modules/merge2": { - "version": "1.4.1", - "dev": true, - "license": "MIT", + "node_modules/normalize-html-whitespace": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/normalize-html-whitespace/-/normalize-html-whitespace-0.2.0.tgz", + "integrity": "sha512-5CZAEQ4bQi8Msqw0GAT6rrkrjNN4ZKqAG3+jJMwms4O6XoMvh6ekwOueG4mRS1LbPUR1r9EdnhxxfpzMTOdzKw==", "engines": { - "node": ">= 8" + "node": ">= 0.10" } }, - "node_modules/methods": { - "version": "1.1.2", - "license": "MIT", - "peer": true, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "engines": { - "node": ">= 0.6" + "node": ">=0.10.0" } }, - "node_modules/micromark-util-character": { - "version": "2.1.1", + "node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/micromark-util-encode": { - "version": "2.0.1", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.1", + "node_modules/npm-run-all2": { + "version": "6.2.6", + "resolved": "https://registry.npmjs.org/npm-run-all2/-/npm-run-all2-6.2.6.tgz", + "integrity": "sha512-tkyb4pc0Zb0oOswCb5tORPk9MvVL6gcDq1cMItQHmsbVk1skk7YF6cH+UU2GxeNLHMuk6wFEOSmEmJ2cnAK1jg==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" + "ansi-styles": "^6.2.1", + "cross-spawn": "^7.0.3", + "memorystream": "^0.3.1", + "minimatch": "^9.0.0", + "pidtree": "^0.6.0", + "read-package-json-fast": "^3.0.2", + "shell-quote": "^1.7.3", + "which": "^3.0.1" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "npm-run-all2": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": "^14.18.0 || ^16.13.0 || >=18.0.0", + "npm": ">= 8" } }, - "node_modules/micromark-util-symbol": { - "version": "2.0.1", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-types": { - "version": "2.0.1", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromatch": { - "version": "4.0.8", + "node_modules/npm-run-all2/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, "engines": { - "node": ">=8.6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "license": "MIT", + "node_modules/npm-run-all2/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" + "isexe": "^2.0.0" }, "bin": { - "miller-rabin": "bin/miller-rabin" + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.1", - "license": "MIT" - }, - "node_modules/mime": { - "version": "2.6.0", - "license": "MIT", + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "deprecated": "This package is no longer supported.", + "optional": true, "peer": true, - "bin": { - "mime": "cli.js" + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" }, "engines": { - "node": ">=4.0.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "license": "MIT", - "peer": true, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", "engines": { - "node": ">= 0.6" + "node": ">=0.10.0" } }, - "node_modules/mime-types": { - "version": "2.1.35", - "license": "MIT", - "peer": true, - "dependencies": { - "mime-db": "1.52.0" - }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, "engines": { - "node": ">= 0.6" + "node": ">=0.10.0" } }, - "node_modules/mimic-response": { - "version": "3.1.0", - "license": "MIT", - "peer": true, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "license": "ISC" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "license": "MIT" + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } }, - "node_modules/minimatch": { - "version": "9.0.5", - "license": "ISC", + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dependencies": { - "brace-expansion": "^2.0.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">= 0.4" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/minipass": { - "version": "7.1.2", - "license": "ISC", + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "peer": true + }, + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "peer": true, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=14.0.0" } }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "license": "ISC", - "optional": true, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "peer": true, "dependencies": { - "minipass": "^3.0.0" + "ee-first": "1.1.1" }, "engines": { - "node": ">= 8" + "node": ">= 0.8" } }, - "node_modules/minipass-collect/node_modules/minipass": { - "version": "3.3.6", - "license": "ISC", - "optional": true, - "peer": true, + "node_modules/on-net-listen": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/on-net-listen/-/on-net-listen-1.1.2.tgz", + "integrity": "sha512-y1HRYy8s/RlcBvDUwKXSmkODMdx4KSuIvloCnQYJ2LdBBC1asY4HtfhXwe3UWknLakATZDnbzht2Ijw3M1EqFg==", + "engines": { + "node": ">=9.4.0 || ^8.9.4" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dependencies": { - "yallist": "^4.0.0" + "wrappy": "1" + } + }, + "node_modules/oniguruma-to-es": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-3.1.0.tgz", + "integrity": "sha512-BJ3Jy22YlgejHSO7Fvmz1kKazlaPmRSUH+4adTDUS/dKQ4wLxI+gALZ8updbaux7/m7fIlpgOZ5fp/Inq5jUAw==", + "dev": true, + "dependencies": { + "emoji-regex-xs": "^1.0.0", + "regex": "^6.0.1", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dependencies": { + "is-wsl": "^1.1.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/minipass-fetch": { - "version": "1.4.1", - "license": "MIT", - "optional": true, - "peer": true, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, "dependencies": { - "minipass": "^3.1.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { - "node": ">=8" - }, - "optionalDependencies": { - "encoding": "^0.1.12" + "node": ">= 0.8.0" } }, - "node_modules/minipass-fetch/node_modules/minipass": { - "version": "3.3.6", - "license": "ISC", - "optional": true, - "peer": true, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==" + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, "dependencies": { - "yallist": "^4.0.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "license": "ISC", - "optional": true, - "peer": true, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, "dependencies": { - "minipass": "^3.0.0" + "p-limit": "^3.0.2" }, "engines": { - "node": ">= 8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", - "license": "ISC", + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "optional": true, "peer": true, "dependencies": { - "yallist": "^4.0.0" + "aggregate-error": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "license": "ISC", - "optional": true, - "peer": true, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, "dependencies": { - "minipass": "^3.0.0" + "callsites": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "license": "ISC", - "optional": true, - "peer": true, + "node_modules/parents": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", + "integrity": "sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg==", "dependencies": { - "yallist": "^4.0.0" + "path-platform": "~0.11.15" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.7.tgz", + "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==", + "dependencies": { + "asn1.js": "^4.10.1", + "browserify-aes": "^1.2.0", + "evp_bytestokey": "^1.0.3", + "hash-base": "~3.0", + "pbkdf2": "^3.1.2", + "safe-buffer": "^5.2.1" }, "engines": { - "node": ">=8" + "node": ">= 0.10" } }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "license": "ISC", - "optional": true, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "peer": true, - "dependencies": { - "minipass": "^3.0.0" - }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, "engines": { "node": ">=8" } }, - "node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", - "license": "ISC", - "optional": true, - "peer": true, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-platform": { + "version": "0.11.15", + "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", + "integrity": "sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "dev": true, "dependencies": { - "yallist": "^4.0.0" + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" }, "engines": { - "node": ">=8" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/minisearch": { - "version": "7.1.1", - "dev": true, - "license": "MIT" + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "peer": true }, - "node_modules/minizlib": { - "version": "2.1.2", - "license": "MIT", - "peer": true, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" }, "engines": { - "node": ">= 8" + "node": ">=0.12" } }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "license": "ISC", + "node_modules/peek-stream": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/peek-stream/-/peek-stream-1.1.3.tgz", + "integrity": "sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==", "peer": true, "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" + "buffer-from": "^1.0.0", + "duplexify": "^3.5.0", + "through2": "^2.0.3" } }, - "node_modules/mitt": { - "version": "3.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" + "node_modules/perf-sym": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/perf-sym/-/perf-sym-2.0.3.tgz", + "integrity": "sha512-dEVkxyeQ/LroVSVEx94UHsftLNLNR3fs6OGfxWXBOKaNb1XZUb0Evr49RTFFYpJakMCa1MLMxoGDzHu4VENCTg==", + "dependencies": { + "end-of-stream": "^1.1.0", + "minimist": "^1.2.0", + "pump": "^1.0.1", + "resolve-jit-symbols": "^0.5.0", + "split2": "^2.0.1" }, - "engines": { - "node": ">=10" + "bin": { + "perf-sym": "cmd.js", + "profile_1ms.d": "profile_1ms.d" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "license": "MIT" + "node_modules/perf-sym/node_modules/pump": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", + "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } }, - "node_modules/module-deps": { - "version": "6.2.3", - "license": "MIT", + "node_modules/perf-sym/node_modules/split2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", + "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", "dependencies": { - "browser-resolve": "^2.0.0", - "cached-path-relative": "^1.0.2", - "concat-stream": "~1.6.0", - "defined": "^1.0.0", - "detective": "^5.2.0", - "duplexer2": "^0.1.2", - "inherits": "^2.0.1", - "JSONStream": "^1.0.3", - "parents": "^1.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.4.0", - "stream-combiner2": "^1.1.1", - "subarg": "^1.0.0", - "through2": "^2.0.0", - "xtend": "^4.0.0" - }, - "bin": { - "module-deps": "bin/cmd.js" - }, - "engines": { - "node": ">= 0.8.0" + "through2": "^2.0.2" } }, - "node_modules/mongodb": { - "version": "6.12.0", - "license": "Apache-2.0", + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "dev": true + }, + "node_modules/pg": { + "version": "8.13.3", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.13.3.tgz", + "integrity": "sha512-P6tPt9jXbL9HVu/SSRERNYaYG++MjnscnegFh9pPHihfoBSujsrka0hyuymMzeJKFWrcG8wvCKy8rCe8e5nDUQ==", "peer": true, "dependencies": { - "@mongodb-js/saslprep": "^1.1.9", - "bson": "^6.10.1", - "mongodb-connection-string-url": "^3.0.0" + "pg-connection-string": "^2.7.0", + "pg-pool": "^3.7.1", + "pg-protocol": "^1.7.1", + "pg-types": "^2.1.0", + "pgpass": "1.x" }, "engines": { - "node": ">=16.20.1" + "node": ">= 8.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.1.1" }, "peerDependencies": { - "@aws-sdk/credential-providers": "^3.188.0", - "@mongodb-js/zstd": "^1.1.0 || ^2.0.0", - "gcp-metadata": "^5.2.0", - "kerberos": "^2.0.1", - "mongodb-client-encryption": ">=6.0.0 <7", - "snappy": "^7.2.2", - "socks": "^2.7.1" + "pg-native": ">=3.0.1" }, "peerDependenciesMeta": { - "@aws-sdk/credential-providers": { - "optional": true - }, - "@mongodb-js/zstd": { - "optional": true - }, - "gcp-metadata": { - "optional": true - }, - "kerberos": { - "optional": true - }, - "mongodb-client-encryption": { - "optional": true - }, - "snappy": { - "optional": true - }, - "socks": { + "pg-native": { "optional": true } } }, - "node_modules/mongodb-connection-string-url": { - "version": "3.0.1", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@types/whatwg-url": "^11.0.2", - "whatwg-url": "^13.0.0" - } + "node_modules/pg-cloudflare": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", + "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", + "optional": true, + "peer": true }, - "node_modules/morphdom": { - "version": "2.7.4", - "license": "MIT" + "node_modules/pg-connection-string": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.7.0.tgz", + "integrity": "sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==", + "peer": true }, - "node_modules/ms": { - "version": "2.1.3", - "license": "MIT" + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "peer": true, + "engines": { + "node": ">=4.0.0" + } }, - "node_modules/mutexify": { - "version": "1.4.0", - "license": "MIT", - "dependencies": { - "queue-tick": "^1.0.0" + "node_modules/pg-numeric": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pg-numeric/-/pg-numeric-1.0.2.tgz", + "integrity": "sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==", + "peer": true, + "engines": { + "node": ">=4" } }, - "node_modules/mz": { - "version": "2.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" + "node_modules/pg-pool": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.7.1.tgz", + "integrity": "sha512-xIOsFoh7Vdhojas6q3596mXFsR8nwBQBXX5JiV7p9buEVAGqYL4yFzclON5P9vFrpu1u7Zwl2oriyDa89n0wbw==", + "peer": true, + "peerDependencies": { + "pg": ">=8.0" } }, - "node_modules/nan": { - "version": "2.22.0", - "license": "MIT", - "optional": true + "node_modules/pg-protocol": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.7.1.tgz", + "integrity": "sha512-gjTHWGYWsEgy9MsY0Gp6ZJxV24IjDqdpTW7Eh0x+WfJLFsm/TJx1MzL6T0D88mBvkpxotCQ6TwW6N+Kko7lhgQ==", + "peer": true }, - "node_modules/nanoassert": { - "version": "1.1.0", - "license": "ISC" + "node_modules/pg-types": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-4.0.2.tgz", + "integrity": "sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng==", + "peer": true, + "dependencies": { + "pg-int8": "1.0.1", + "pg-numeric": "1.0.2", + "postgres-array": "~3.0.1", + "postgres-bytea": "~3.0.0", + "postgres-date": "~2.1.0", + "postgres-interval": "^3.0.0", + "postgres-range": "^1.1.1" + }, + "engines": { + "node": ">=10" + } }, - "node_modules/nanobench": { - "version": "2.1.1", - "license": "MIT", + "node_modules/pg/node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "peer": true, "dependencies": { - "browser-process-hrtime": "^0.1.2", - "chalk": "^1.1.3", - "mutexify": "^1.1.0", - "pretty-hrtime": "^1.0.2" + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" }, - "bin": { - "nanobench": "run.js", - "nanobench-compare": "compare.js" + "engines": { + "node": ">=4" } }, - "node_modules/nanobench/node_modules/ansi-regex": { - "version": "2.1.1", - "license": "MIT", + "node_modules/pg/node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pg/node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "peer": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/nanobench/node_modules/ansi-styles": { - "version": "2.2.1", - "license": "MIT", + "node_modules/pg/node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "peer": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/nanobench/node_modules/chalk": { - "version": "1.1.3", - "license": "MIT", + "node_modules/pg/node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "peer": true, "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "xtend": "^4.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/nanobench/node_modules/strip-ansi": { - "version": "3.0.1", - "license": "MIT", + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "peer": true, "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" + "split2": "^4.1.0" } }, - "node_modules/nanobench/node_modules/supports-color": { - "version": "2.0.0", - "license": "MIT", + "node_modules/pgpass/node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "peer": true, "engines": { - "node": ">=0.8.0" + "node": ">= 10.x" } }, - "node_modules/nanohtml": { - "version": "1.10.0", - "license": "MIT", - "dependencies": { - "acorn-node": "^1.8.2", - "camel-case": "^3.0.0", - "convert-source-map": "^1.5.1", - "estree-is-member-expression": "^1.0.0", - "hyperx": "^2.5.0", - "is-boolean-attribute": "0.0.1", - "nanoassert": "^1.1.0", - "nanobench": "^2.1.0", - "normalize-html-whitespace": "^0.2.0", - "through2": "^2.0.3", - "transform-ast": "^2.4.0" - } + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true }, - "node_modules/nanohtml/node_modules/convert-source-map": { - "version": "1.9.0", - "license": "MIT" + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, - "node_modules/nanoid": { - "version": "3.3.8", + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", "bin": { - "nanoid": "bin/nanoid.cjs" + "pidtree": "bin/pidtree.js" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">=0.10" } }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "license": "MIT", - "peer": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "license": "MIT", - "peer": true, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "engines": { - "node": ">= 0.6" + "node": ">=4" } }, - "node_modules/no-case": { - "version": "2.3.2", - "license": "MIT", + "node_modules/pino": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-9.6.0.tgz", + "integrity": "sha512-i85pKRCt4qMjZ1+L7sy2Ag4t1atFcdbEt76+7iRJn1g2BvsnRMGu9p8pivl9fs63M2kF/A0OacFZhTub+m/qMg==", + "peer": true, "dependencies": { - "lower-case": "^1.1.1" + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^2.0.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^4.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^3.0.0" + }, + "bin": { + "pino": "bin.js" } }, - "node_modules/node-abi": { - "version": "3.71.0", - "license": "MIT", + "node_modules/pino-abstract-transport": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-2.0.0.tgz", + "integrity": "sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==", "peer": true, "dependencies": { - "semver": "^7.3.5" - }, + "split2": "^4.0.0" + } + }, + "node_modules/pino-abstract-transport/node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "peer": true, "engines": { - "node": ">=10" + "node": ">= 10.x" } }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "license": "MIT", + "node_modules/pino-std-serializers": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", + "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==", "peer": true }, - "node_modules/node-gyp": { - "version": "8.4.1", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^9.1.0", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, + "node_modules/pino/node_modules/process-warning": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.1.tgz", + "integrity": "sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "peer": true + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, "engines": { - "node": ">= 10.12.0" + "node": ">= 6" } }, - "node_modules/node-gyp/node_modules/brace-expansion": { - "version": "1.1.11", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } + "node_modules/platform": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", + "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" }, - "node_modules/node-gyp/node_modules/glob": { - "version": "7.2.3", - "license": "ISC", - "optional": true, - "peer": true, + "node_modules/postcss": { + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz", + "integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "^10 || ^12 || >=14" } }, - "node_modules/node-gyp/node_modules/minimatch": { - "version": "3.1.2", - "license": "ISC", - "optional": true, - "peer": true, + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "brace-expansion": "^1.1.7" + "lilconfig": "^3.1.1" }, "engines": { - "node": "*" + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } } }, - "node_modules/node-gyp/node_modules/which": { - "version": "2.0.2", - "license": "ISC", - "optional": true, + "node_modules/postgres-array": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-3.0.2.tgz", + "integrity": "sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==", "peer": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, "engines": { - "node": ">= 8" + "node": ">=12" } }, - "node_modules/nopt": { - "version": "5.0.0", - "license": "ISC", - "optional": true, + "node_modules/postgres-bytea": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-3.0.0.tgz", + "integrity": "sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==", "peer": true, "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" + "obuf": "~1.1.2" }, "engines": { - "node": ">=6" + "node": ">= 6" } }, - "node_modules/normalize-html-whitespace": { - "version": "0.2.0", - "license": "MIT", + "node_modules/postgres-date": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-2.1.0.tgz", + "integrity": "sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==", + "peer": true, "engines": { - "node": ">= 0.10" + "node": ">=12" } }, - "node_modules/normalize-path": { + "node_modules/postgres-interval": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-3.0.0.tgz", + "integrity": "sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==", + "peer": true, "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/npm-normalize-package-bin": { - "version": "3.0.1", + "node_modules/postgres-range": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/postgres-range/-/postgres-range-1.1.4.tgz", + "integrity": "sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==", + "peer": true + }, + "node_modules/preact": { + "version": "10.25.4", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.25.4.tgz", + "integrity": "sha512-jLdZDb+Q+odkHJ+MpW/9U5cODzqnB+fy2EiHSZES7ldV5LK7yjlVzTp7R8Xy6W6y75kfK8iWYtFVH7lvjwrCMA==", "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" } }, - "node_modules/npm-run-all2": { - "version": "6.2.6", - "dev": true, - "license": "MIT", + "node_modules/prebuild-install": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "peer": true, "dependencies": { - "ansi-styles": "^6.2.1", - "cross-spawn": "^7.0.3", - "memorystream": "^0.3.1", - "minimatch": "^9.0.0", - "pidtree": "^0.6.0", - "read-package-json-fast": "^3.0.2", - "shell-quote": "^1.7.3", - "which": "^3.0.1" + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^2.0.0", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" }, "bin": { - "npm-run-all": "bin/npm-run-all/index.js", - "npm-run-all2": "bin/npm-run-all/index.js", - "run-p": "bin/run-p/index.js", - "run-s": "bin/run-s/index.js" + "prebuild-install": "bin.js" }, "engines": { - "node": "^14.18.0 || ^16.13.0 || >=18.0.0", - "npm": ">= 8" - } - }, - "node_modules/npm-run-all2/node_modules/ansi-styles": { - "version": "6.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=10" } }, - "node_modules/npm-run-all2/node_modules/which": { - "version": "3.0.1", - "dev": true, - "license": "ISC", + "node_modules/prebuild-install/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "peer": true, "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 6" } }, - "node_modules/npmlog": { - "version": "6.0.2", - "license": "ISC", - "optional": true, + "node_modules/prebuild-install/node_modules/tar-fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.2.tgz", + "integrity": "sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==", "peer": true, "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" } }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "license": "MIT", + "node_modules/prebuild-install/node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "peer": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/object-assign": { - "version": "4.1.1", + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, - "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.8.0" } }, - "node_modules/object-inspect": { - "version": "1.13.3", - "license": "MIT", + "node_modules/prettier": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.1.tgz", + "integrity": "sha512-hPpFQvHwL3Qv5AdRvBFMhnKo4tYxp0ReXiPn2bxkiohEX6mBeBwEpBSQTkD458RaaDKQMYSp4hX4UtfUTA5wDw==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, "engines": { - "node": ">= 0.4" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "license": "MIT", - "engines": { - "node": ">= 0.4" + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/object.assign": { - "version": "4.1.7", - "license": "MIT", + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" + "fast-diff": "^1.1.2" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6.0.0" } }, - "node_modules/obuf": { - "version": "1.1.2", - "license": "MIT", - "peer": true - }, - "node_modules/on-exit-leak-free": { - "version": "2.1.2", - "license": "MIT", - "peer": true, + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", "engines": { - "node": ">=14.0.0" + "node": ">= 0.8" } }, - "node_modules/on-finished": { - "version": "2.4.1", - "license": "MIT", - "peer": true, + "node_modules/pretty-trace": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pretty-trace/-/pretty-trace-0.3.1.tgz", + "integrity": "sha512-wpjLPN4pE1bn0Hq+N9QE0Anv/FusWy0dnbnLwl1jUkr+v2t5XjQWseezHWLvcbib3Kn+D6/0JUb8012Cwv2iDg==", "dependencies": { - "ee-first": "1.1.1" + "ansicolors": "~0.2.1", + "split2": "~0.2.1" }, - "engines": { - "node": ">= 0.8" + "bin": { + "pretty-trace": "bin/pretty-trace" } }, - "node_modules/on-net-listen": { - "version": "1.1.2", - "license": "MIT", - "engines": { - "node": ">=9.4.0 || ^8.9.4" + "node_modules/pretty-trace/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/pretty-trace/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "node_modules/once": { - "version": "1.4.0", - "license": "ISC", + "node_modules/pretty-trace/node_modules/split2": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/split2/-/split2-0.2.1.tgz", + "integrity": "sha512-D/oTExYAkC9nWleOCTOyNmAuzfAT/6rHGBA9LIK7FVnGo13CSvrKCUzKenwH6U1s2znY9MqH6v0UQTEDa3vJmg==", "dependencies": { - "wrappy": "1" + "through2": "~0.6.1" } }, - "node_modules/oniguruma-to-es": { - "version": "0.10.0", - "dev": true, - "license": "MIT", + "node_modules/pretty-trace/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "node_modules/pretty-trace/node_modules/through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", "dependencies": { - "emoji-regex-xs": "^1.0.0", - "regex": "^5.1.1", - "regex-recursion": "^5.1.1" + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" } }, - "node_modules/opn": { - "version": "5.5.0", - "license": "MIT", + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/process-warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", + "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==", + "peer": true + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "optional": true, + "peer": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "optional": true, + "peer": true, "dependencies": { - "is-wsl": "^1.1.0" + "err-code": "^2.0.2", + "retry": "^0.12.0" }, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/optionator": { - "version": "0.9.4", - "dev": true, - "license": "MIT", + "node_modules/proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" } }, - "node_modules/os-browserify": { - "version": "0.3.0", - "license": "MIT" + "node_modules/proper-lockfile/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, - "node_modules/p-limit": { - "version": "3.1.0", - "dev": true, - "license": "MIT", + "node_modules/properties-reader": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/properties-reader/-/properties-reader-2.3.0.tgz", + "integrity": "sha512-z597WicA7nDZxK12kZqHr2TcvwNU1GCfA5UwfDY/HDp3hXPoPlb5rlEx9bwGTiJnc0OqbBTkU975jDToth8Gxw==", "dependencies": { - "yocto-queue": "^0.1.0" + "mkdirp": "^1.0.4" }, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/steveukx/properties?sponsor=1" } }, - "node_modules/p-locate": { - "version": "5.0.0", + "node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", "dev": true, - "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/protobufjs": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", + "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", + "hasInstallScript": true, "dependencies": { - "p-limit": "^3.0.2" + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12.0.0" } }, - "node_modules/p-map": { - "version": "4.0.0", - "license": "MIT", - "optional": true, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "peer": true, "dependencies": { - "aggregate-error": "^3.0.0" + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.10" } }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "license": "BlueOak-1.0.0" - }, - "node_modules/pako": { - "version": "1.0.11", - "license": "(MIT AND Zlib)" - }, - "node_modules/parent-module": { - "version": "1.0.1", - "dev": true, - "license": "MIT", + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "node_modules/parents": { - "version": "1.0.1", - "license": "MIT", + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==" + }, + "node_modules/pump": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", "dependencies": { - "path-platform": "~0.11.15" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "node_modules/parse-asn1": { - "version": "5.1.7", - "license": "ISC", + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", "dependencies": { - "asn1.js": "^4.10.1", - "browserify-aes": "^1.2.0", - "evp_bytestokey": "^1.0.3", - "hash-base": "~3.0", - "pbkdf2": "^3.1.2", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" } }, - "node_modules/parseurl": { - "version": "1.3.3", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.8" + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "node_modules/path-browserify": { - "version": "0.0.1", - "license": "MIT" + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" }, - "node_modules/path-exists": { - "version": "4.0.0", - "dev": true, - "license": "MIT", + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "dependencies": { + "side-channel": "^1.1.0" + }, "engines": { - "node": ">=8" + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "license": "MIT", + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", "engines": { - "node": ">=0.10.0" + "node": ">=0.4.x" } }, - "node_modules/path-key": { - "version": "3.1.1", - "license": "MIT", - "engines": { - "node": ">=8" - } + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "node_modules/path-parse": { - "version": "1.0.7", - "license": "MIT" + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" }, - "node_modules/path-platform": { - "version": "0.11.15", - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", + "peer": true }, - "node_modules/path-scurry": { - "version": "2.0.0", - "dev": true, - "license": "BlueOak-1.0.0", + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "safe-buffer": "^5.1.0" } }, - "node_modules/path-to-regexp": { - "version": "0.1.12", - "license": "MIT", - "peer": true - }, - "node_modules/pbkdf2": { - "version": "3.1.2", - "license": "MIT", + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "peer": true, "engines": { - "node": ">=0.12" + "node": ">= 0.6" } }, - "node_modules/peek-stream": { - "version": "1.1.3", - "license": "MIT", + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "peer": true, "dependencies": { - "buffer-from": "^1.0.0", - "duplexify": "^3.5.0", - "through2": "^2.0.3" + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "node_modules/perf-sym": { - "version": "2.0.3", - "license": "MIT", + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "peer": true, "dependencies": { - "end-of-stream": "^1.1.0", + "deep-extend": "^0.6.0", + "ini": "~1.3.0", "minimist": "^1.2.0", - "pump": "^1.0.1", - "resolve-jit-symbols": "^0.5.0", - "split2": "^2.0.1" + "strip-json-comments": "~2.0.1" }, "bin": { - "perf-sym": "cmd.js", - "profile_1ms.d": "profile_1ms.d" + "rc": "cli.js" } }, - "node_modules/perf-sym/node_modules/pump": { - "version": "1.0.3", - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "peer": true, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/perf-sym/node_modules/split2": { - "version": "2.2.0", - "license": "ISC", + "node_modules/read-only-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", + "integrity": "sha512-3ALe0bjBVZtkdWKIcThYpQCLbBMd/+Tbh2CDSrAIDO3UsZ4Xs+tnyjv2MjCOMMgBG+AsUOeuP1cgtY1INISc8w==", "dependencies": { - "through2": "^2.0.2" + "readable-stream": "^2.0.2" } }, - "node_modules/perfect-debounce": { - "version": "1.0.0", + "node_modules/read-package-json-fast": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", "dev": true, - "license": "MIT" - }, - "node_modules/pg": { - "version": "8.13.1", - "license": "MIT", - "peer": true, "dependencies": { - "pg-connection-string": "^2.7.0", - "pg-pool": "^3.7.0", - "pg-protocol": "^1.7.0", - "pg-types": "^2.1.0", - "pgpass": "1.x" + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" }, "engines": { - "node": ">= 8.0.0" - }, - "optionalDependencies": { - "pg-cloudflare": "^1.1.1" - }, - "peerDependencies": { - "pg-native": ">=3.0.1" - }, - "peerDependenciesMeta": { - "pg-native": { - "optional": true - } + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/pg-cloudflare": { - "version": "1.1.1", - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/pg-connection-string": { - "version": "2.7.0", - "license": "MIT", - "peer": true - }, - "node_modules/pg-int8": { - "version": "1.0.1", - "license": "ISC", - "peer": true, - "engines": { - "node": ">=4.0.0" + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/pg-numeric": { - "version": "1.0.2", - "license": "ISC", - "peer": true, - "engines": { - "node": ">=4" - } + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "node_modules/pg-pool": { - "version": "3.7.0", - "license": "MIT", - "peer": true, - "peerDependencies": { - "pg": ">=8.0" + "node_modules/readable-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" } }, - "node_modules/pg-protocol": { - "version": "1.7.0", - "license": "MIT", - "peer": true - }, - "node_modules/pg-types": { - "version": "4.0.2", - "license": "MIT", - "peer": true, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", "dependencies": { - "pg-int8": "1.0.1", - "pg-numeric": "1.0.2", - "postgres-array": "~3.0.1", - "postgres-bytea": "~3.0.0", - "postgres-date": "~2.1.0", - "postgres-interval": "^3.0.0", - "postgres-range": "^1.1.1" - }, - "engines": { - "node": ">=10" + "minimatch": "^5.1.0" } }, - "node_modules/pg/node_modules/pg-types": { - "version": "2.2.0", - "license": "MIT", - "peer": true, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dependencies": { - "pg-int8": "1.0.1", - "postgres-array": "~2.0.0", - "postgres-bytea": "~1.0.0", - "postgres-date": "~1.0.4", - "postgres-interval": "^1.1.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=4" - } - }, - "node_modules/pg/node_modules/postgres-array": { - "version": "2.0.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/pg/node_modules/postgres-bytea": { - "version": "1.0.0", - "license": "MIT", - "peer": true, + "node_modules/readdirp": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.1.tgz", + "integrity": "sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==", + "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "node_modules/pg/node_modules/postgres-date": { - "version": "1.0.7", - "license": "MIT", + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", "peer": true, "engines": { - "node": ">=0.10.0" + "node": ">= 12.13.0" } }, - "node_modules/pg/node_modules/postgres-interval": { - "version": "1.2.0", - "license": "MIT", - "peer": true, + "node_modules/regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.0.1.tgz", + "integrity": "sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==", + "dev": true, "dependencies": { - "xtend": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" + "regex-utilities": "^2.3.0" } }, - "node_modules/pgpass": { - "version": "1.0.5", - "license": "MIT", - "peer": true, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "dev": true, "dependencies": { - "split2": "^4.1.0" + "regex-utilities": "^2.3.0" } }, - "node_modules/pgpass/node_modules/split2": { - "version": "4.2.0", - "license": "ISC", - "peer": true, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "dev": true + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "engines": { - "node": ">= 10.x" + "node": ">=0.10.0" } }, - "node_modules/picocolors": { - "version": "1.1.1", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "dev": true, - "license": "MIT", + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "peer": true, "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "node": ">=0.10.0" } }, - "node_modules/pidtree": { - "version": "0.6.0", - "dev": true, - "license": "MIT", + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, "bin": { - "pidtree": "bin/pidtree.js" + "resolve": "bin/resolve" }, "engines": { - "node": ">=0.10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pify": { - "version": "3.0.0", - "license": "MIT", + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, "engines": { "node": ">=4" } }, - "node_modules/pino": { - "version": "9.6.0", - "license": "MIT", - "peer": true, + "node_modules/resolve-jit-symbols": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/resolve-jit-symbols/-/resolve-jit-symbols-0.5.0.tgz", + "integrity": "sha512-BaYxONZLR5dWZS8kfgypFZosMn7sdVMlwiDbbz/FGXJsXbTyqNZkTWIbkzT1ovB5TCVj1xi03HHhQS4aEbT4Iw==", "dependencies": { - "atomic-sleep": "^1.0.0", - "fast-redact": "^3.1.1", - "on-exit-leak-free": "^2.1.0", - "pino-abstract-transport": "^2.0.0", - "pino-std-serializers": "^7.0.0", - "process-warning": "^4.0.0", - "quick-format-unescaped": "^4.0.3", - "real-require": "^0.2.0", - "safe-stable-stringify": "^2.3.1", - "sonic-boom": "^4.0.1", - "thread-stream": "^3.0.0" + "pretty-trace": "~0.3.1" }, "bin": { - "pino": "bin.js" + "rjs": "bin/rjs" } }, - "node_modules/pino-abstract-transport": { - "version": "2.0.0", - "license": "MIT", - "peer": true, - "dependencies": { - "split2": "^4.0.0" + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, - "node_modules/pino-abstract-transport/node_modules/split2": { - "version": "4.2.0", - "license": "ISC", + "node_modules/ret": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.4.3.tgz", + "integrity": "sha512-0f4Memo5QP7WQyUEAYUO3esD/XjOc3Zjjg5CPsAq1p8sIu0XPeMbHJemKA0BO7tV0X7+A0FoEpbmHXWxPyD3wQ==", "peer": true, "engines": { - "node": ">= 10.x" + "node": ">=10" } }, - "node_modules/pino-std-serializers": { - "version": "7.0.0", - "license": "MIT", - "peer": true - }, - "node_modules/pino/node_modules/process-warning": { - "version": "4.0.0", - "license": "MIT", - "peer": true - }, - "node_modules/pirates": { - "version": "4.0.6", - "dev": true, - "license": "MIT", + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "engines": { - "node": ">= 6" + "node": ">= 4" } }, - "node_modules/platform": { - "version": "1.3.6", - "license": "MIT" - }, - "node_modules/postcss": { - "version": "8.4.49", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "engines": { - "node": "^10 || ^12 || >=14" + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "node_modules/postcss-load-config": { - "version": "6.0.1", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "optional": true, + "peer": true, "dependencies": { - "lilconfig": "^3.1.1" - }, - "engines": { - "node": ">= 18" + "glob": "^7.1.3" }, - "peerDependencies": { - "jiti": ">=1.21.0", - "postcss": ">=8.0.9", - "tsx": "^4.8.1", - "yaml": "^2.4.2" + "bin": { + "rimraf": "bin.js" }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/postgres-array": { - "version": "3.0.2", - "license": "MIT", + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "optional": true, "peer": true, - "engines": { - "node": ">=12" + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/postgres-bytea": { - "version": "3.0.0", - "license": "MIT", + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "optional": true, "peer": true, "dependencies": { - "obuf": "~1.1.2" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">= 6" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/postgres-date": { - "version": "2.1.0", - "license": "MIT", + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "optional": true, "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, "engines": { - "node": ">=12" + "node": "*" } }, - "node_modules/postgres-interval": { - "version": "3.0.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=12" + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, - "node_modules/postgres-range": { - "version": "1.1.4", - "license": "MIT", - "peer": true - }, - "node_modules/preact": { - "version": "10.25.4", + "node_modules/rollup": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.6.tgz", + "integrity": "sha512-wc2cBWqJgkU3Iz5oztRkQbfVkbxoz5EhnCGOrnJvnLnQ7O0WhQUYyv18qQI79O8L7DdHrrlJNeCHd4VGpnaXKQ==", "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - } - }, - "node_modules/prebuild-install": { - "version": "7.1.2", - "license": "MIT", - "peer": true, "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" + "@types/estree": "1.0.6" }, "bin": { - "prebuild-install": "bin.js" + "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=10" - } - }, - "node_modules/prebuild-install/node_modules/readable-stream": { - "version": "3.6.2", - "license": "MIT", - "peer": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "node": ">=18.0.0", + "npm": ">=8.0.0" }, - "engines": { - "node": ">= 6" + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.34.6", + "@rollup/rollup-android-arm64": "4.34.6", + "@rollup/rollup-darwin-arm64": "4.34.6", + "@rollup/rollup-darwin-x64": "4.34.6", + "@rollup/rollup-freebsd-arm64": "4.34.6", + "@rollup/rollup-freebsd-x64": "4.34.6", + "@rollup/rollup-linux-arm-gnueabihf": "4.34.6", + "@rollup/rollup-linux-arm-musleabihf": "4.34.6", + "@rollup/rollup-linux-arm64-gnu": "4.34.6", + "@rollup/rollup-linux-arm64-musl": "4.34.6", + "@rollup/rollup-linux-loongarch64-gnu": "4.34.6", + "@rollup/rollup-linux-powerpc64le-gnu": "4.34.6", + "@rollup/rollup-linux-riscv64-gnu": "4.34.6", + "@rollup/rollup-linux-s390x-gnu": "4.34.6", + "@rollup/rollup-linux-x64-gnu": "4.34.6", + "@rollup/rollup-linux-x64-musl": "4.34.6", + "@rollup/rollup-win32-arm64-msvc": "4.34.6", + "@rollup/rollup-win32-ia32-msvc": "4.34.6", + "@rollup/rollup-win32-x64-msvc": "4.34.6", + "fsevents": "~2.3.2" } }, - "node_modules/prebuild-install/node_modules/tar-fs": { - "version": "2.1.1", - "license": "MIT", - "peer": true, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" + "queue-microtask": "^1.2.2" } }, - "node_modules/prebuild-install/node_modules/tar-stream": { - "version": "2.2.0", - "license": "MIT", + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex2": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-3.1.0.tgz", + "integrity": "sha512-RAAZAGbap2kBfbVhvmnTFv73NWLMvDGOITFYTZBAaY8eR+Ir4ef7Up/e7amo+y1+AH+3PtLkrt9mvcTsG9LXug==", "peer": true, "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" + "ret": "~0.4.0" } }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "dev": true, - "license": "MIT", + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "peer": true, "engines": { - "node": ">= 0.8.0" + "node": ">=10" } }, - "node_modules/prettier": { - "version": "3.4.2", + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/search-insights": { + "version": "2.17.3", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", + "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", "dev": true, - "license": "MIT", + "peer": true + }, + "node_modules/secure-json-parse": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", + "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==", + "peer": true + }, + "node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "bin": { - "prettier": "bin/prettier.cjs" + "semver": "bin/semver.js" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "node": ">=10" } }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "dev": true, - "license": "MIT", + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "peer": true, "dependencies": { - "fast-diff": "^1.1.2" + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" }, "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/pretty-hrtime": { - "version": "1.0.3", - "license": "MIT", - "engines": { - "node": ">= 0.8" + "node": ">= 0.8.0" } }, - "node_modules/pretty-trace": { - "version": "0.3.1", - "license": "MIT", + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "peer": true, "dependencies": { - "ansicolors": "~0.2.1", - "split2": "~0.2.1" - }, - "bin": { - "pretty-trace": "bin/pretty-trace" + "ms": "2.0.0" } }, - "node_modules/pretty-trace/node_modules/isarray": { - "version": "0.0.1", - "license": "MIT" + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "peer": true }, - "node_modules/pretty-trace/node_modules/readable-stream": { - "version": "1.0.34", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "peer": true, + "engines": { + "node": ">= 0.8" } }, - "node_modules/pretty-trace/node_modules/split2": { - "version": "0.2.1", - "license": "ISC", - "dependencies": { - "through2": "~0.6.1" + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "peer": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" } }, - "node_modules/pretty-trace/node_modules/string_decoder": { - "version": "0.10.31", - "license": "MIT" - }, - "node_modules/pretty-trace/node_modules/through2": { - "version": "0.6.5", - "license": "MIT", + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "peer": true, "dependencies": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - }, - "node_modules/process": { - "version": "0.11.10", - "license": "MIT", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, "engines": { - "node": ">= 0.6.0" + "node": ">= 0.8.0" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "license": "MIT" - }, - "node_modules/process-warning": { - "version": "3.0.0", - "license": "MIT", + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "optional": true, "peer": true }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "license": "ISC", - "optional": true, + "node_modules/set-cookie-parser": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", "peer": true }, - "node_modules/promise-retry": { - "version": "2.0.1", - "license": "MIT", - "optional": true, - "peer": true, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" }, "engines": { - "node": ">=10" - } - }, - "node_modules/proper-lockfile": { - "version": "4.1.2", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "retry": "^0.12.0", - "signal-exit": "^3.0.2" + "node": ">= 0.4" } }, - "node_modules/proper-lockfile/node_modules/signal-exit": { - "version": "3.0.7", - "license": "ISC" + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "peer": true }, - "node_modules/properties-reader": { - "version": "2.3.0", - "license": "MIT", + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dependencies": { - "mkdirp": "^1.0.4" - }, - "engines": { - "node": ">=14" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" }, - "funding": { - "type": "github", - "url": "https://github.com/steveukx/properties?sponsor=1" - } - }, - "node_modules/property-information": { - "version": "6.5.0", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "bin": { + "sha.js": "bin.js" } }, - "node_modules/protobufjs": { - "version": "7.4.0", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" + "node_modules/shasum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", + "integrity": "sha512-UTzHm/+AzKfO9RgPgRpDIuMSNie1ubXRaljjlhFMNGYoG7z+rm9AHLPMf70R7887xboDH9Q+5YQbWKObFHEAtw==", + "dependencies": { + "json-stable-stringify": "~0.0.0", + "sha.js": "~2.4.4" } }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "license": "MIT", - "peer": true, + "node_modules/shasum-object": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz", + "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==", "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" + "fast-safe-stringify": "^2.0.7" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" }, "engines": { - "node": ">= 0.10" + "node": ">=8" } }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" } }, - "node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.12.1", - "license": "MIT" + "node_modules/shell-quote": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", + "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/pump": { - "version": "3.0.2", - "license": "MIT", + "node_modules/shiki": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-2.3.2.tgz", + "integrity": "sha512-UZhz/gsUz7DHFbQBOJP7eXqvKyYvMGramxQiSDc83M/7OkWm6OdVHAReEc3vMLh6L6TRhgL9dvhXz9XDkCDaaw==", + "dev": true, "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "@shikijs/core": "2.3.2", + "@shikijs/engine-javascript": "2.3.2", + "@shikijs/engine-oniguruma": "2.3.2", + "@shikijs/langs": "2.3.2", + "@shikijs/themes": "2.3.2", + "@shikijs/types": "2.3.2", + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4" } }, - "node_modules/pumpify": { - "version": "1.5.1", - "license": "MIT", + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dependencies": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pumpify/node_modules/pump": { - "version": "2.0.1", - "license": "MIT", + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/punycode": { - "version": "1.4.1", - "license": "MIT" + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/qs": { - "version": "6.13.1", - "license": "BSD-3-Clause", + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dependencies": { - "side-channel": "^1.0.6" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { - "node": ">=0.6" + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/querystring-es3": { - "version": "0.2.1", + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "engines": { - "node": ">=0.4.x" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "dev": true, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", "funding": [ { "type": "github", @@ -8175,2248 +10384,2414 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" - }, - "node_modules/queue-tick": { - "version": "1.0.1", - "license": "MIT" - }, - "node_modules/quick-format-unescaped": { - "version": "4.0.4", - "license": "MIT", - "peer": true - }, - "node_modules/randombytes": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/randomfill": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.6" - } + ] }, - "node_modules/raw-body": { - "version": "2.5.2", - "license": "MIT", + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "peer": true, "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" } }, - "node_modules/rc": { - "version": "1.2.8", - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "peer": true, + "node_modules/single-line-log": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/single-line-log/-/single-line-log-1.1.2.tgz", + "integrity": "sha512-awzaaIPtYFdexLr6TBpcZSGPB6D1RInNO/qNetgaJloPDF/D0GkVtLvGEp8InfmLV7CyLyQ5fIRP+tVN/JmWQA==", "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" + "string-width": "^1.0.1" } }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "license": "MIT", - "peer": true, + "node_modules/single-line-log/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "engines": { "node": ">=0.10.0" } }, - "node_modules/read-only-stream": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/read-package-json-fast": { - "version": "3.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/readable-stream": { - "version": "2.3.8", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "license": "MIT" - }, - "node_modules/readable-stream/node_modules/string_decoder": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/readdir-glob": { - "version": "1.1.3", - "license": "Apache-2.0", + "node_modules/single-line-log/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", "dependencies": { - "minimatch": "^5.1.0" + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/readdir-glob/node_modules/minimatch": { - "version": "5.1.6", - "license": "ISC", + "node_modules/single-line-log/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", "dependencies": { - "brace-expansion": "^2.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, - "node_modules/readdirp": { - "version": "4.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.16.0" + "node_modules/single-line-log/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dependencies": { + "ansi-regex": "^2.0.0" }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/real-require": { - "version": "0.2.0", - "license": "MIT", + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "optional": true, "peer": true, "engines": { - "node": ">= 12.13.0" + "node": ">= 6.0.0", + "npm": ">= 3.0.0" } }, - "node_modules/regex": { - "version": "5.1.1", - "dev": true, - "license": "MIT", + "node_modules/socks": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", + "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", + "optional": true, + "peer": true, "dependencies": { - "regex-utilities": "^2.3.0" + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" } }, - "node_modules/regex-recursion": { - "version": "5.1.1", - "dev": true, - "license": "MIT", + "node_modules/socks-proxy-agent": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", + "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "optional": true, + "peer": true, "dependencies": { - "regex": "^5.1.1", - "regex-utilities": "^2.3.0" - } - }, - "node_modules/regex-utilities": { - "version": "2.3.0", - "dev": true, - "license": "MIT" - }, - "node_modules/require-directory": { - "version": "2.1.1", - "license": "MIT", + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 10" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "license": "MIT", + "node_modules/sonic-boom": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.0.tgz", + "integrity": "sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==", "peer": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "atomic-sleep": "^1.0.0" } }, - "node_modules/resolve": { - "version": "1.22.10", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, - "node_modules/resolve-from": { - "version": "4.0.0", + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, - "license": "MIT", "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/resolve-jit-symbols": { - "version": "0.5.0", - "license": "MIT", - "dependencies": { - "pretty-trace": "~0.3.1" - }, - "bin": { - "rjs": "bin/rjs" - } + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead" }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", "dev": true, - "license": "MIT", "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/ret": { - "version": "0.4.3", - "license": "MIT", + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/retry": { - "version": "0.12.0", - "license": "MIT", - "engines": { - "node": ">= 4" + "dependencies": { + "memory-pager": "^1.0.2" } }, - "node_modules/reusify": { - "version": "1.0.4", - "license": "MIT", + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "dev": true, "engines": { - "iojs": ">=1.0.0", "node": ">=0.10.0" } }, - "node_modules/rfdc": { - "version": "1.4.1", - "license": "MIT" + "node_modules/split-ca": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split-ca/-/split-ca-1.0.1.tgz", + "integrity": "sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==" }, - "node_modules/rimraf": { - "version": "3.0.2", - "license": "ISC", - "optional": true, - "peer": true, + "node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "readable-stream": "^3.0.0" } }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "license": "MIT", - "optional": true, - "peer": true, + "node_modules/split2/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "license": "ISC", + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", "optional": true, + "peer": true + }, + "node_modules/sqlite3": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.7.tgz", + "integrity": "sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog==", + "hasInstallScript": true, "peer": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "bindings": "^1.5.0", + "node-addon-api": "^7.0.0", + "prebuild-install": "^7.1.1", + "tar": "^6.1.11" }, - "engines": { - "node": "*" + "optionalDependencies": { + "node-gyp": "8.x" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "node-gyp": "8.x" + }, + "peerDependenciesMeta": { + "node-gyp": { + "optional": true + } } }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "license": "ISC", - "optional": true, - "peer": true, + "node_modules/ssh-remote-port-forward": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/ssh-remote-port-forward/-/ssh-remote-port-forward-1.0.4.tgz", + "integrity": "sha512-x0LV1eVDwjf1gmG7TTnfqIzf+3VPRz7vrNIjX6oYLbeCrf/PeVY6hkT68Mg+q02qXxQhrLjB0jfgvhevoCRmLQ==", "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "@types/ssh2": "^0.5.48", + "ssh2": "^1.4.0" } }, - "node_modules/ripemd160": { - "version": "2.0.2", - "license": "MIT", + "node_modules/ssh-remote-port-forward/node_modules/@types/ssh2": { + "version": "0.5.52", + "resolved": "https://registry.npmjs.org/@types/ssh2/-/ssh2-0.5.52.tgz", + "integrity": "sha512-lbLLlXxdCZOSJMCInKH2+9V/77ET2J6NPQHpFI0kda61Dd1KglJs+fPQBchizmzYSOJBgdTajhPqBO1xxLywvg==", "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" + "@types/node": "*", + "@types/ssh2-streams": "*" } }, - "node_modules/rollup": { - "version": "4.29.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.6" - }, - "bin": { - "rollup": "dist/bin/rollup" + "node_modules/ssh2": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.16.0.tgz", + "integrity": "sha512-r1X4KsBGedJqo7h8F5c4Ybpcr5RjyP+aWIG007uBPRjmdQWfEiVLzSK71Zji1B9sKxwaCvD8y8cwSkYrlLiRRg==", + "hasInstallScript": true, + "dependencies": { + "asn1": "^0.2.6", + "bcrypt-pbkdf": "^1.0.2" }, "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" + "node": ">=10.16.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.29.1", - "@rollup/rollup-android-arm64": "4.29.1", - "@rollup/rollup-darwin-arm64": "4.29.1", - "@rollup/rollup-darwin-x64": "4.29.1", - "@rollup/rollup-freebsd-arm64": "4.29.1", - "@rollup/rollup-freebsd-x64": "4.29.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.29.1", - "@rollup/rollup-linux-arm-musleabihf": "4.29.1", - "@rollup/rollup-linux-arm64-gnu": "4.29.1", - "@rollup/rollup-linux-arm64-musl": "4.29.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.29.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.29.1", - "@rollup/rollup-linux-riscv64-gnu": "4.29.1", - "@rollup/rollup-linux-s390x-gnu": "4.29.1", - "@rollup/rollup-linux-x64-gnu": "4.29.1", - "@rollup/rollup-linux-x64-musl": "4.29.1", - "@rollup/rollup-win32-arm64-msvc": "4.29.1", - "@rollup/rollup-win32-ia32-msvc": "4.29.1", - "@rollup/rollup-win32-x64-msvc": "4.29.1", - "fsevents": "~2.3.2" + "cpu-features": "~0.0.10", + "nan": "^2.20.0" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "optional": true, + "peer": true, "dependencies": { - "queue-microtask": "^1.2.2" + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safe-regex2": { - "version": "3.1.0", - "license": "MIT", + "node_modules/ssri/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "optional": true, "peer": true, "dependencies": { - "ret": "~0.4.0" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/safe-stable-stringify": { - "version": "2.5.0", - "license": "MIT", + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "peer": true, "engines": { - "node": ">=10" + "node": ">= 0.8" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/search-insights": { - "version": "2.17.3", - "dev": true, - "license": "MIT", - "peer": true + "node_modules/stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } }, - "node_modules/secure-json-parse": { - "version": "2.7.0", - "license": "BSD-3-Clause", - "peer": true + "node_modules/stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", + "dependencies": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + } }, - "node_modules/semver": { - "version": "7.6.3", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "node_modules/stream-http": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", + "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" } }, - "node_modules/send": { - "version": "0.19.0", - "license": "MIT", - "peer": true, + "node_modules/stream-http/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 6" } }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "peer": true, + "node_modules/stream-shift": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==" + }, + "node_modules/stream-splicer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz", + "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==", "dependencies": { - "ms": "2.0.0" + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" } }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "license": "MIT", - "peer": true + "node_modules/streamx": { + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", + "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", + "dependencies": { + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.8" + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" } }, - "node_modules/send/node_modules/mime": { - "version": "1.6.0", - "license": "MIT", - "peer": true, - "bin": { - "mime": "cli.js" + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/serve-static": { - "version": "1.16.2", - "license": "MIT", - "peer": true, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">= 0.8.0" + "node": ">=8" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "license": "ISC", - "optional": true, - "peer": true - }, - "node_modules/set-cookie-parser": { - "version": "2.7.1", - "license": "MIT", - "peer": true + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } }, - "node_modules/set-function-length": { - "version": "1.2.2", - "license": "MIT", + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "license": "ISC", - "peer": true + "node_modules/string-width/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } }, - "node_modules/sha.js": { - "version": "2.4.11", - "license": "(MIT AND BSD-3-Clause)", + "node_modules/string-width/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "ansi-regex": "^5.0.1" }, - "bin": { - "sha.js": "bin.js" + "engines": { + "node": ">=8" } }, - "node_modules/shasum": { - "version": "1.0.2", - "license": "MIT", + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dev": true, "dependencies": { - "json-stable-stringify": "~0.0.0", - "sha.js": "~2.4.4" + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/shasum-object": { - "version": "1.0.0", - "license": "Apache-2.0", + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dependencies": { - "fast-safe-stringify": "^2.0.7" + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/shebang-command": { - "version": "2.0.0", - "license": "MIT", + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { - "shebang-regex": "^3.0.0" + "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "license": "MIT", + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { "node": ">=8" } }, - "node_modules/shell-quote": { - "version": "1.8.2", - "license": "MIT", + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, "engines": { - "node": ">= 0.4" + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/shiki": { - "version": "1.26.0", - "dev": true, - "license": "MIT", + "node_modules/subarg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==", "dependencies": { - "@shikijs/core": "1.26.0", - "@shikijs/engine-javascript": "1.26.0", - "@shikijs/engine-oniguruma": "1.26.0", - "@shikijs/langs": "1.26.0", - "@shikijs/themes": "1.26.0", - "@shikijs/types": "1.26.0", - "@shikijs/vscode-textmate": "^10.0.1", - "@types/hast": "^3.0.4" + "minimist": "^1.1.0" } }, - "node_modules/side-channel": { - "version": "1.1.0", - "license": "MIT", + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" }, - "engines": { - "node": ">= 0.4" + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=16 || 14 >=14.17" } }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 6" } }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "license": "MIT", + "node_modules/sucrase/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "engines": { - "node": ">= 0.4" + "bin": { + "glob": "dist/esm/bin.mjs" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "license": "MIT", + "node_modules/sucrase/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" + "@isaacs/cliui": "^8.0.2" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/signal-exit": { - "version": "4.1.0", - "license": "ISC", + "node_modules/sucrase/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/sucrase/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, "engines": { - "node": ">=14" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/simple-concat": { - "version": "1.0.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/simple-get": { - "version": "4.0.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", + "node_modules/superagent": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-9.0.2.tgz", + "integrity": "sha512-xuW7dzkUpcJq7QnhOsnNUgtYp3xRwpt2F7abdRYIpCsAt0hhUqia0EdxyXZQQpNmGtsCzYHryaKSV3q3GJnq7w==", "peer": true, "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.4", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^3.5.1", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.11.0" + }, + "engines": { + "node": ">=14.18.0" } }, - "node_modules/single-line-log": { - "version": "1.1.2", - "license": "MIT", + "node_modules/superjson": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.2.tgz", + "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==", + "dev": true, "dependencies": { - "string-width": "^1.0.1" + "copy-anything": "^3.0.2" + }, + "engines": { + "node": ">=16" } }, - "node_modules/single-line-log/node_modules/ansi-regex": { - "version": "2.1.1", - "license": "MIT", + "node_modules/supertest": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.0.0.tgz", + "integrity": "sha512-qlsr7fIC0lSddmA3tzojvzubYxvlGtzumcdHgPwbFWMISQwL22MhM2Y3LNt+6w9Yyx7559VW5ab70dgphm8qQA==", + "peer": true, + "dependencies": { + "methods": "^1.1.2", + "superagent": "^9.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=14.18.0" } }, - "node_modules/single-line-log/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "license": "MIT", + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { - "number-is-nan": "^1.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/single-line-log/node_modules/string-width": { - "version": "1.0.2", - "license": "MIT", + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/synckit": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", + "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", + "dev": true, "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=0.10.0" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" } }, - "node_modules/single-line-log/node_modules/strip-ansi": { - "version": "3.0.1", - "license": "MIT", + "node_modules/syntax-error": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", + "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" + "acorn-node": "^1.2.0" } }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } + "node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", + "dev": true }, - "node_modules/socks": { - "version": "2.8.3", - "license": "MIT", - "optional": true, + "node_modules/tachyons": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/tachyons/-/tachyons-4.12.0.tgz", + "integrity": "sha512-2nA2IrYFy3raCM9fxJ2KODRGHVSZNTW3BR0YnlGsLUf1DA3pk3YfWZ/DdfbnZK6zLZS+jUenlUGJsKcA5fUiZg==" + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "peer": true, "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" }, "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" + "node": ">=10" } }, - "node_modules/socks-proxy-agent": { - "version": "6.2.1", - "license": "MIT", - "optional": true, - "peer": true, + "node_modules/tar-fs": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.8.tgz", + "integrity": "sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==", "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" + "pump": "^3.0.0", + "tar-stream": "^3.1.5" }, - "engines": { - "node": ">= 10" + "optionalDependencies": { + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0" } }, - "node_modules/sonic-boom": { - "version": "4.2.0", - "license": "MIT", - "peer": true, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", "dependencies": { - "atomic-sleep": "^1.0.0" + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" } }, - "node_modules/source-map": { - "version": "0.5.7", - "license": "BSD-3-Clause", + "node_modules/tar/node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "peer": true, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/source-map-js": { - "version": "1.2.1", - "dev": true, - "license": "BSD-3-Clause", + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "peer": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "license": "MIT" + "node_modules/testcontainers": { + "version": "10.18.0", + "resolved": "https://registry.npmjs.org/testcontainers/-/testcontainers-10.18.0.tgz", + "integrity": "sha512-MnwWsPjsN5QVe+lSU1LwLZVOyjgwSwv1INzkw8FekdwgvOtvJ7FThQEkbmzRcguQootgwmA9FG54NoTChZDRvA==", + "dependencies": { + "@balena/dockerignore": "^1.0.2", + "@types/dockerode": "^3.3.29", + "archiver": "^7.0.1", + "async-lock": "^1.4.1", + "byline": "^5.0.0", + "debug": "^4.3.5", + "docker-compose": "^0.24.8", + "dockerode": "^3.3.5", + "get-port": "^5.1.1", + "proper-lockfile": "^4.1.2", + "properties-reader": "^2.3.0", + "ssh-remote-port-forward": "^1.0.4", + "tar-fs": "^3.0.6", + "tmp": "^0.2.3", + "undici": "^5.28.5" + } }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/text-decoder": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "dependencies": { + "b4a": "^1.6.4" } }, - "node_modules/sparse-bitfield": { - "version": "3.0.3", - "license": "MIT", - "peer": true, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, "dependencies": { - "memory-pager": "^1.0.2" + "any-promise": "^1.0.0" } }, - "node_modules/speakingurl": { - "version": "14.0.1", + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", "dev": true, - "license": "BSD-3-Clause", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, "engines": { - "node": ">=0.10.0" + "node": ">=0.8" } }, - "node_modules/split-ca": { - "version": "1.0.1", - "license": "ISC" + "node_modules/thread-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz", + "integrity": "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==", + "peer": true, + "dependencies": { + "real-require": "^0.2.0" + } }, - "node_modules/split2": { - "version": "3.2.2", - "license": "ISC", + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dependencies": { - "readable-stream": "^3.0.0" + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, - "node_modules/split2/node_modules/readable-stream": { - "version": "3.6.2", - "license": "MIT", + "node_modules/timers-browserify": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", + "integrity": "sha512-PIxwAupJZiYU4JmVZYwXp9FKsHMXb5h0ZEFyuXTAn8WLHOlcij+FEcbrvDsom1o5dr1YggEtFbECvGCW2sT53Q==", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "process": "~0.11.0" }, "engines": { - "node": ">= 6" + "node": ">=0.6.0" } }, - "node_modules/sprintf-js": { - "version": "1.1.3", - "license": "BSD-3-Clause", - "optional": true, - "peer": true + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true }, - "node_modules/sqlite3": { - "version": "5.1.7", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "peer": true, + "node_modules/tinyglobby": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz", + "integrity": "sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==", + "dev": true, "dependencies": { - "bindings": "^1.5.0", - "node-addon-api": "^7.0.0", - "prebuild-install": "^7.1.1", - "tar": "^6.1.11" - }, - "optionalDependencies": { - "node-gyp": "8.x" + "fdir": "^6.4.2", + "picomatch": "^4.0.2" }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", + "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", + "dev": true, "peerDependencies": { - "node-gyp": "8.x" + "picomatch": "^3 || ^4" }, "peerDependenciesMeta": { - "node-gyp": { + "picomatch": { "optional": true } } }, - "node_modules/ssh-remote-port-forward": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "@types/ssh2": "^0.5.48", - "ssh2": "^1.4.0" + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/ssh-remote-port-forward/node_modules/@types/ssh2": { - "version": "0.5.52", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/ssh2-streams": "*" + "node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "engines": { + "node": ">=14.14" } }, - "node_modules/ssh2": { - "version": "1.16.0", - "hasInstallScript": true, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, "dependencies": { - "asn1": "^0.2.6", - "bcrypt-pbkdf": "^1.0.2" + "is-number": "^7.0.0" }, "engines": { - "node": ">=10.16.0" - }, - "optionalDependencies": { - "cpu-features": "~0.0.10", - "nan": "^2.20.0" + "node": ">=8.0" } }, - "node_modules/ssri": { - "version": "8.0.1", - "license": "ISC", - "optional": true, + "node_modules/toad-cache": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.0.tgz", + "integrity": "sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==", "peer": true, - "dependencies": { - "minipass": "^3.1.1" - }, "engines": { - "node": ">= 8" + "node": ">=12" } }, - "node_modules/ssri/node_modules/minipass": { - "version": "3.3.6", - "license": "ISC", - "optional": true, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "peer": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", "peer": true, "dependencies": { - "yallist": "^4.0.0" + "punycode": "^2.3.1" }, "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/statuses": { - "version": "2.0.1", - "license": "MIT", + "node_modules/tr46/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "peer": true, "engines": { - "node": ">= 0.8" - } - }, - "node_modules/stream-browserify": { - "version": "2.0.2", - "license": "MIT", - "dependencies": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" + "node": ">=6" } }, - "node_modules/stream-combiner2": { - "version": "1.1.1", - "license": "MIT", + "node_modules/transform-ast": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/transform-ast/-/transform-ast-2.4.4.tgz", + "integrity": "sha512-AxjeZAcIOUO2lev2GDe3/xZ1Q0cVGjIMk5IsriTy8zbWlsEnjeB025AhkhBJHoy997mXpLd4R+kRbvnnQVuQHQ==", "dependencies": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" + "acorn-node": "^1.3.0", + "convert-source-map": "^1.5.1", + "dash-ast": "^1.0.0", + "is-buffer": "^2.0.0", + "magic-string": "^0.23.2", + "merge-source-map": "1.0.4", + "nanobench": "^2.1.1" } }, - "node_modules/stream-http": { - "version": "3.2.0", - "license": "MIT", - "dependencies": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "xtend": "^4.0.2" - } + "node_modules/transform-ast/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, - "node_modules/stream-http/node_modules/readable-stream": { - "version": "3.6.2", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, + "node_modules/transform-ast/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "engines": { - "node": ">= 6" + "node": ">=4" } }, - "node_modules/stream-shift": { - "version": "1.0.3", - "license": "MIT" + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } }, - "node_modules/stream-splicer": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.2" + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/streamx": { - "version": "2.21.1", - "license": "MIT", - "dependencies": { - "fast-fifo": "^1.3.2", - "queue-tick": "^1.0.1", - "text-decoder": "^1.1.0" + "node_modules/ts-api-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.1.tgz", + "integrity": "sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==", + "dev": true, + "engines": { + "node": ">=18.12" }, - "optionalDependencies": { - "bare-events": "^2.2.0" + "peerDependencies": { + "typescript": ">=4.8.4" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "license": "MIT", + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dependencies": { - "safe-buffer": "~5.2.0" + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "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 + } } }, - "node_modules/string-width": { - "version": "4.2.3", - "license": "MIT", + "node_modules/ts-node/node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "acorn": "^8.11.0" }, "engines": { - "node": ">=8" + "node": ">=0.4.0" } }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "license": "MIT", + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "license": "MIT", - "engines": { - "node": ">=8" - } + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "license": "MIT", + "node_modules/tsup": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.3.6.tgz", + "integrity": "sha512-XkVtlDV/58S9Ye0JxUUTcrQk4S+EqlOHKzg6Roa62rdjL1nGWNUstG0xgI4vanHdfIpjP448J8vlN0oK6XOJ5g==", + "dev": true, "dependencies": { - "ansi-regex": "^5.0.1" + "bundle-require": "^5.0.0", + "cac": "^6.7.14", + "chokidar": "^4.0.1", + "consola": "^3.2.3", + "debug": "^4.3.7", + "esbuild": "^0.24.0", + "joycon": "^3.1.1", + "picocolors": "^1.1.1", + "postcss-load-config": "^6.0.1", + "resolve-from": "^5.0.0", + "rollup": "^4.24.0", + "source-map": "0.8.0-beta.0", + "sucrase": "^3.35.0", + "tinyexec": "^0.3.1", + "tinyglobby": "^0.2.9", + "tree-kill": "^1.2.2" + }, + "bin": { + "tsup": "dist/cli-default.js", + "tsup-node": "dist/cli-node.js" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "peerDependencies": { + "@microsoft/api-extractor": "^7.36.0", + "@swc/core": "^1", + "postcss": "^8.4.12", + "typescript": ">=4.5.0" + }, + "peerDependenciesMeta": { + "@microsoft/api-extractor": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "postcss": { + "optional": true + }, + "typescript": { + "optional": true + } } }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "5.0.1", - "license": "MIT", + "node_modules/tsup/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tsup/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, "engines": { "node": ">=8" } }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "6.0.1", - "license": "MIT", + "node_modules/tsup/node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "dev": true, "dependencies": { - "ansi-regex": "^5.0.1" + "whatwg-url": "^7.0.0" }, "engines": { - "node": ">=8" + "node": ">= 8" } }, - "node_modules/stringify-entities": { - "version": "4.0.4", + "node_modules/tsup/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", "dev": true, - "license": "MIT", "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "punycode": "^2.1.0" } }, - "node_modules/strip-ansi": { + "node_modules/tsup/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "node_modules/tsup/node_modules/whatwg-url": { "version": "7.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "license": "MIT", + "node_modules/tsx": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.2.tgz", + "integrity": "sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==", + "dev": true, "dependencies": { - "ansi-regex": "^5.0.1" + "esbuild": "~0.23.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" }, "engines": { - "node": ">=8" + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" } }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "license": "MIT", + "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", + "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/strip-bom": { - "version": "3.0.0", + "node_modules/tsx/node_modules/@esbuild/android-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", + "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", + "cpu": [ + "arm" + ], "dev": true, - "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=4" + "node": ">=18" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", + "node_modules/tsx/node_modules/@esbuild/android-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", + "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/subarg": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "minimist": "^1.1.0" + "node_modules/tsx/node_modules/@esbuild/android-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", + "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" } }, - "node_modules/sucrase": { - "version": "3.35.0", + "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", + "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=18" } }, - "node_modules/sucrase/node_modules/commander": { - "version": "4.1.1", + "node_modules/tsx/node_modules/@esbuild/darwin-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", + "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">= 6" + "node": ">=18" } }, - "node_modules/sucrase/node_modules/glob": { - "version": "10.4.5", + "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", + "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/sucrase/node_modules/jackspeak": { - "version": "3.4.3", + "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", + "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", + "cpu": [ + "x64" + ], "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/sucrase/node_modules/lru-cache": { - "version": "10.4.3", + "node_modules/tsx/node_modules/@esbuild/linux-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", + "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", + "cpu": [ + "arm" + ], "dev": true, - "license": "ISC" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/sucrase/node_modules/path-scurry": { - "version": "1.11.1", + "node_modules/tsx/node_modules/@esbuild/linux-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", + "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=18" } }, - "node_modules/superagent": { - "version": "9.0.2", - "license": "MIT", - "peer": true, - "dependencies": { - "component-emitter": "^1.3.0", - "cookiejar": "^2.1.4", - "debug": "^4.3.4", - "fast-safe-stringify": "^2.1.1", - "form-data": "^4.0.0", - "formidable": "^3.5.1", - "methods": "^1.1.2", - "mime": "2.6.0", - "qs": "^6.11.0" - }, + "node_modules/tsx/node_modules/@esbuild/linux-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", + "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=14.18.0" + "node": ">=18" } }, - "node_modules/superjson": { - "version": "2.2.2", + "node_modules/tsx/node_modules/@esbuild/linux-loong64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", + "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", + "cpu": [ + "loong64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "copy-anything": "^3.0.2" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=16" + "node": ">=18" } }, - "node_modules/supertest": { - "version": "7.0.0", - "license": "MIT", - "peer": true, - "dependencies": { - "methods": "^1.1.2", - "superagent": "^9.0.1" - }, + "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", + "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=14.18.0" + "node": ">=18" } }, - "node_modules/supports-color": { - "version": "7.2.0", + "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", + "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", + "cpu": [ + "ppc64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "license": "MIT", + "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", + "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18" } }, - "node_modules/synckit": { - "version": "0.9.2", + "node_modules/tsx/node_modules/@esbuild/linux-s390x": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", + "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", + "cpu": [ + "s390x" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/syntax-error": { - "version": "1.4.0", - "license": "MIT", - "dependencies": { - "acorn-node": "^1.2.0" + "node": ">=18" } }, - "node_modules/tabbable": { - "version": "6.2.0", + "node_modules/tsx/node_modules/@esbuild/linux-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", + "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT" - }, - "node_modules/tachyons": { - "version": "4.12.0", - "license": "MIT" - }, - "node_modules/tar": { - "version": "6.2.1", - "license": "ISC", - "peer": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10" + "node": ">=18" } }, - "node_modules/tar-fs": { - "version": "3.0.6", - "license": "MIT", - "dependencies": { - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - }, - "optionalDependencies": { - "bare-fs": "^2.1.1", - "bare-path": "^2.1.0" + "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", + "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/tar-stream": { - "version": "3.1.7", - "license": "MIT", - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" + "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", + "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/tar/node_modules/chownr": { - "version": "2.0.0", - "license": "ISC", - "peer": true, + "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", + "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=10" + "node": ">=18" } }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "license": "ISC", - "peer": true, + "node_modules/tsx/node_modules/@esbuild/sunos-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", + "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/testcontainers": { - "version": "10.16.0", - "license": "MIT", - "dependencies": { - "@balena/dockerignore": "^1.0.2", - "@types/dockerode": "^3.3.29", - "archiver": "^7.0.1", - "async-lock": "^1.4.1", - "byline": "^5.0.0", - "debug": "^4.3.5", - "docker-compose": "^0.24.8", - "dockerode": "^3.3.5", - "get-port": "^5.1.1", - "proper-lockfile": "^4.1.2", - "properties-reader": "^2.3.0", - "ssh-remote-port-forward": "^1.0.4", - "tar-fs": "^3.0.6", - "tmp": "^0.2.3", - "undici": "^5.28.4" + "node_modules/tsx/node_modules/@esbuild/win32-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", + "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, - "node_modules/text-decoder": { - "version": "1.2.3", - "license": "Apache-2.0", - "dependencies": { - "b4a": "^1.6.4" + "node_modules/tsx/node_modules/@esbuild/win32-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", + "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, - "node_modules/thenify": { - "version": "3.3.1", + "node_modules/tsx/node_modules/@esbuild/win32-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", + "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, - "node_modules/thenify-all": { - "version": "1.6.0", + "node_modules/tsx/node_modules/esbuild": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", + "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", "dev": true, - "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" }, "engines": { - "node": ">=0.8" - } - }, - "node_modules/thread-stream": { - "version": "3.1.0", - "license": "MIT", - "peer": true, - "dependencies": { - "real-require": "^0.2.0" - } - }, - "node_modules/through": { - "version": "2.3.8", - "license": "MIT" - }, - "node_modules/through2": { - "version": "2.0.5", - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.23.1", + "@esbuild/android-arm": "0.23.1", + "@esbuild/android-arm64": "0.23.1", + "@esbuild/android-x64": "0.23.1", + "@esbuild/darwin-arm64": "0.23.1", + "@esbuild/darwin-x64": "0.23.1", + "@esbuild/freebsd-arm64": "0.23.1", + "@esbuild/freebsd-x64": "0.23.1", + "@esbuild/linux-arm": "0.23.1", + "@esbuild/linux-arm64": "0.23.1", + "@esbuild/linux-ia32": "0.23.1", + "@esbuild/linux-loong64": "0.23.1", + "@esbuild/linux-mips64el": "0.23.1", + "@esbuild/linux-ppc64": "0.23.1", + "@esbuild/linux-riscv64": "0.23.1", + "@esbuild/linux-s390x": "0.23.1", + "@esbuild/linux-x64": "0.23.1", + "@esbuild/netbsd-x64": "0.23.1", + "@esbuild/openbsd-arm64": "0.23.1", + "@esbuild/openbsd-x64": "0.23.1", + "@esbuild/sunos-x64": "0.23.1", + "@esbuild/win32-arm64": "0.23.1", + "@esbuild/win32-ia32": "0.23.1", + "@esbuild/win32-x64": "0.23.1" } }, - "node_modules/timers-browserify": { - "version": "1.4.2", + "node_modules/tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "peer": true, "dependencies": { - "process": "~0.11.0" + "safe-buffer": "^5.0.1" }, "engines": { - "node": ">=0.6.0" + "node": "*" } }, - "node_modules/tinyexec": { - "version": "0.3.2", - "dev": true, - "license": "MIT" + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" }, - "node_modules/tinyglobby": { - "version": "0.2.10", + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, - "license": "MIT", "dependencies": { - "fdir": "^6.4.2", - "picomatch": "^4.0.2" + "prelude-ls": "^1.2.1" }, "engines": { - "node": ">=12.0.0" + "node": ">= 0.8.0" } }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.2", - "dev": true, - "license": "MIT", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } + "node_modules/type-component": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/type-component/-/type-component-0.0.1.tgz", + "integrity": "sha512-mDZRBQS2yZkwRQKfjJvQ8UIYJeBNNWCq+HBNstl9N5s9jZ4dkVYXEGkVPsSCEh5Ld4JM1kmrZTzjnrqSAIQ7dw==" }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "peer": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/tmp": { - "version": "0.2.3", - "license": "MIT", "engines": { - "node": ">=14.14" + "node": ">= 0.6" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "node_modules/typescript": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">=8.0" + "node": ">=14.17" } }, - "node_modules/toad-cache": { - "version": "3.7.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=12" + "node_modules/umd": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", + "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", + "bin": { + "umd": "bin/cli.js" } }, - "node_modules/toidentifier": { - "version": "1.0.1", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.6" + "node_modules/undeclared-identifiers": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz", + "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==", + "dependencies": { + "acorn-node": "^1.3.0", + "dash-ast": "^1.0.0", + "get-assigned-identifiers": "^1.2.0", + "simple-concat": "^1.0.0", + "xtend": "^4.0.1" + }, + "bin": { + "undeclared-identifiers": "bin.js" } }, - "node_modules/tr46": { - "version": "4.1.1", - "license": "MIT", - "peer": true, + "node_modules/undici": { + "version": "5.28.5", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.5.tgz", + "integrity": "sha512-zICwjrDrcrUE0pyyJc1I2QzBkLM8FINsgOrt6WjA+BgajVq9Nxu2PbFFXUrAggLfDXlZGZBVZYw7WNV5KiBiBA==", "dependencies": { - "punycode": "^2.3.0" + "@fastify/busboy": "^2.0.0" }, "engines": { - "node": ">=14" + "node": ">=14.0" } }, - "node_modules/tr46/node_modules/punycode": { - "version": "2.3.1", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" }, - "node_modules/transform-ast": { - "version": "2.4.4", - "license": "MIT", + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "optional": true, + "peer": true, "dependencies": { - "acorn-node": "^1.3.0", - "convert-source-map": "^1.5.1", - "dash-ast": "^1.0.0", - "is-buffer": "^2.0.0", - "magic-string": "^0.23.2", - "merge-source-map": "1.0.4", - "nanobench": "^2.1.1" - } - }, - "node_modules/transform-ast/node_modules/convert-source-map": { - "version": "1.9.0", - "license": "MIT" - }, - "node_modules/transform-ast/node_modules/is-buffer": { - "version": "2.0.5", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "engines": { - "node": ">=4" + "unique-slug": "^2.0.0" } }, - "node_modules/tree-kill": { - "version": "1.2.2", - "dev": true, - "license": "MIT", - "bin": { - "tree-kill": "cli.js" + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "optional": true, + "peer": true, + "dependencies": { + "imurmurhash": "^0.1.4" } }, - "node_modules/trim-lines": { - "version": "3.0.1", + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", "dev": true, - "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/ts-api-utils": { - "version": "1.4.3", + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" + "dependencies": { + "@types/unist": "^3.0.0" }, - "peerDependencies": { - "typescript": ">=4.2.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", "dev": true, - "license": "Apache-2.0" - }, - "node_modules/ts-node": { - "version": "10.9.2", - "license": "MIT", "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" + "@types/unist": "^3.0.0" }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/ts-node/node_modules/acorn-walk": { - "version": "8.3.4", - "license": "MIT", + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dev": true, "dependencies": { - "acorn": "^8.11.0" + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" }, - "engines": { - "node": ">=0.4.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/tsconfig-paths": { - "version": "4.2.0", + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", "dev": true, - "license": "MIT", "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "peer": true, "engines": { - "node": ">=6" + "node": ">= 0.8" } }, - "node_modules/tslib": { - "version": "2.8.1", - "dev": true, - "license": "0BSD" + "node_modules/upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==" }, - "node_modules/tsup": { - "version": "8.3.5", - "dev": true, - "license": "MIT", + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dependencies": { - "bundle-require": "^5.0.0", - "cac": "^6.7.14", - "chokidar": "^4.0.1", - "consola": "^3.2.3", - "debug": "^4.3.7", - "esbuild": "^0.24.0", - "joycon": "^3.1.1", - "picocolors": "^1.1.1", - "postcss-load-config": "^6.0.1", - "resolve-from": "^5.0.0", - "rollup": "^4.24.0", - "source-map": "0.8.0-beta.0", - "sucrase": "^3.35.0", - "tinyexec": "^0.3.1", - "tinyglobby": "^0.2.9", - "tree-kill": "^1.2.2" - }, - "bin": { - "tsup": "dist/cli-default.js", - "tsup-node": "dist/cli-node.js" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@microsoft/api-extractor": "^7.36.0", - "@swc/core": "^1", - "postcss": "^8.4.12", - "typescript": ">=4.5.0" - }, - "peerDependenciesMeta": { - "@microsoft/api-extractor": { - "optional": true - }, - "@swc/core": { - "optional": true - }, - "postcss": { - "optional": true - }, - "typescript": { - "optional": true - } + "punycode": "^2.1.0" } }, - "node_modules/tsup/node_modules/punycode": { + "node_modules/uri-js/node_modules/punycode": { "version": "2.3.1", - "dev": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "engines": { "node": ">=6" } }, - "node_modules/tsup/node_modules/resolve-from": { - "version": "5.0.0", - "dev": true, - "license": "MIT", + "node_modules/url": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz", + "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", + "dependencies": { + "punycode": "^1.4.1", + "qs": "^6.12.3" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/tsup/node_modules/source-map": { - "version": "0.8.0-beta.0", - "dev": true, - "license": "BSD-3-Clause", + "node_modules/util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", "dependencies": { - "whatwg-url": "^7.0.0" - }, - "engines": { - "node": ">= 8" + "inherits": "2.0.3" } }, - "node_modules/tsup/node_modules/tr46": { + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/util-extend": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/util-extend/-/util-extend-1.0.3.tgz", + "integrity": "sha512-mLs5zAK+ctllYBj+iAQvlDCwoxU/WDOUaJkcFudeiAX6OajC6BKXJUa9a+tbtkC11dz2Ufb7h0lyvIOVn4LADA==" + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/utils-merge": { "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.1.0" + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "peer": true, + "engines": { + "node": ">= 0.4.0" } }, - "node_modules/tsup/node_modules/webidl-conversions": { - "version": "4.0.2", - "dev": true, - "license": "BSD-2-Clause" + "node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } }, - "node_modules/tsup/node_modules/whatwg-url": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "peer": true, + "engines": { + "node": ">= 0.8" } }, - "node_modules/tsx": { - "version": "4.19.2", + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", "dev": true, - "license": "MIT", "dependencies": { - "esbuild": "~0.23.0", - "get-tsconfig": "^4.7.5" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" }, - "optionalDependencies": { - "fsevents": "~2.3.3" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/tsx/node_modules/@esbuild/linux-x64": { - "version": "0.23.1", - "cpu": [ - "x64" - ], + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/tsx/node_modules/esbuild": { - "version": "0.23.1", + "node_modules/vite": { + "version": "5.4.14", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.14.tgz", + "integrity": "sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==", "dev": true, - "hasInstallScript": true, - "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, "bin": { - "esbuild": "bin/esbuild" + "vite": "bin/vite.js" }, "engines": { - "node": ">=18" + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.23.1", - "@esbuild/android-arm": "0.23.1", - "@esbuild/android-arm64": "0.23.1", - "@esbuild/android-x64": "0.23.1", - "@esbuild/darwin-arm64": "0.23.1", - "@esbuild/darwin-x64": "0.23.1", - "@esbuild/freebsd-arm64": "0.23.1", - "@esbuild/freebsd-x64": "0.23.1", - "@esbuild/linux-arm": "0.23.1", - "@esbuild/linux-arm64": "0.23.1", - "@esbuild/linux-ia32": "0.23.1", - "@esbuild/linux-loong64": "0.23.1", - "@esbuild/linux-mips64el": "0.23.1", - "@esbuild/linux-ppc64": "0.23.1", - "@esbuild/linux-riscv64": "0.23.1", - "@esbuild/linux-s390x": "0.23.1", - "@esbuild/linux-x64": "0.23.1", - "@esbuild/netbsd-x64": "0.23.1", - "@esbuild/openbsd-arm64": "0.23.1", - "@esbuild/openbsd-x64": "0.23.1", - "@esbuild/sunos-x64": "0.23.1", - "@esbuild/win32-arm64": "0.23.1", - "@esbuild/win32-ia32": "0.23.1", - "@esbuild/win32-x64": "0.23.1" - } - }, - "node_modules/tty-browserify": { - "version": "0.0.1", - "license": "MIT" - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "safe-buffer": "^5.0.1" + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" }, - "engines": { - "node": "*" + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } } }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "license": "Unlicense" - }, - "node_modules/type-check": { - "version": "0.4.0", + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">= 0.8.0" + "node": ">=12" } }, - "node_modules/type-component": { - "version": "0.0.1" - }, - "node_modules/type-is": { - "version": "1.6.18", - "license": "MIT", - "peer": true, - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">= 0.6" + "node": ">=12" } }, - "node_modules/typedarray": { - "version": "0.0.6", - "license": "MIT" - }, - "node_modules/typescript": { - "version": "5.7.2", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=14.17" - } - }, - "node_modules/umd": { - "version": "3.0.3", - "license": "MIT", - "bin": { - "umd": "bin/cli.js" - } - }, - "node_modules/undeclared-identifiers": { - "version": "1.1.3", - "license": "Apache-2.0", - "dependencies": { - "acorn-node": "^1.3.0", - "dash-ast": "^1.0.0", - "get-assigned-identifiers": "^1.2.0", - "simple-concat": "^1.0.0", - "xtend": "^4.0.1" - }, - "bin": { - "undeclared-identifiers": "bin.js" + "node": ">=12" } }, - "node_modules/undici": { - "version": "5.28.4", - "license": "MIT", - "dependencies": { - "@fastify/busboy": "^2.0.0" - }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=14.0" + "node": ">=12" } }, - "node_modules/undici-types": { - "version": "6.20.0", - "license": "MIT" - }, - "node_modules/unique-filename": { - "version": "1.1.1", - "license": "ISC", + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, "optional": true, - "peer": true, - "dependencies": { - "unique-slug": "^2.0.0" + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" } }, - "node_modules/unique-slug": { - "version": "2.0.2", - "license": "ISC", + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, "optional": true, - "peer": true, - "dependencies": { - "imurmurhash": "^0.1.4" + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" } }, - "node_modules/unist-util-is": { - "version": "6.0.0", + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/unist-util-position": { - "version": "5.0.0", + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/unist-util-stringify-position": { - "version": "4.0.0", + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/unist-util-visit": { - "version": "5.0.0", + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/unist-util-visit-parents": { - "version": "6.0.1", + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/unpipe": { - "version": "1.0.0", - "license": "MIT", - "peer": true, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.8" + "node": ">=12" } }, - "node_modules/upper-case": { - "version": "1.1.3", - "license": "MIT" - }, - "node_modules/uri-js": { - "version": "4.4.1", - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/uri-js/node_modules/punycode": { - "version": "2.3.1", - "license": "MIT", + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6" + "node": ">=12" } }, - "node_modules/url": { - "version": "0.11.4", - "license": "MIT", - "dependencies": { - "punycode": "^1.4.1", - "qs": "^6.12.3" - }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.4" + "node": ">=12" } }, - "node_modules/util": { - "version": "0.10.4", - "license": "MIT", - "dependencies": { - "inherits": "2.0.3" + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/util-extend": { - "version": "1.0.3", - "license": "MIT" - }, - "node_modules/util/node_modules/inherits": { - "version": "2.0.3", - "license": "ISC" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "license": "MIT", - "peer": true, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.4.0" + "node": ">=12" } }, - "node_modules/uuid": { - "version": "10.0.0", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "license": "MIT" - }, - "node_modules/vary": { - "version": "1.1.2", - "license": "MIT", - "peer": true, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">= 0.8" + "node": ">=12" } }, - "node_modules/vfile": { - "version": "6.0.3", + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" } }, - "node_modules/vfile-message": { - "version": "4.0.2", + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, - "node_modules/vite": { - "version": "5.4.11", + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } + "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { + "node_modules/vite/node_modules/@esbuild/win32-x64": { "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ - "linux" + "win32" ], "engines": { "node": ">=12" @@ -10424,9 +12799,10 @@ }, "node_modules/vite/node_modules/esbuild": { "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, - "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -10460,28 +12836,29 @@ } }, "node_modules/vitepress": { - "version": "1.5.0", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.6.3.tgz", + "integrity": "sha512-fCkfdOk8yRZT8GD9BFqusW3+GggWYZ/rYncOfmgcDtP3ualNHCAg+Robxp2/6xfH1WwPHtGpPwv7mbA3qomtBw==", "dev": true, - "license": "MIT", "dependencies": { - "@docsearch/css": "^3.6.2", - "@docsearch/js": "^3.6.2", - "@iconify-json/simple-icons": "^1.2.10", - "@shikijs/core": "^1.22.2", - "@shikijs/transformers": "^1.22.2", - "@shikijs/types": "^1.22.2", + "@docsearch/css": "3.8.2", + "@docsearch/js": "3.8.2", + "@iconify-json/simple-icons": "^1.2.21", + "@shikijs/core": "^2.1.0", + "@shikijs/transformers": "^2.1.0", + "@shikijs/types": "^2.1.0", "@types/markdown-it": "^14.1.2", - "@vitejs/plugin-vue": "^5.1.4", - "@vue/devtools-api": "^7.5.4", - "@vue/shared": "^3.5.12", - "@vueuse/core": "^11.1.0", - "@vueuse/integrations": "^11.1.0", - "focus-trap": "^7.6.0", + "@vitejs/plugin-vue": "^5.2.1", + "@vue/devtools-api": "^7.7.0", + "@vue/shared": "^3.5.13", + "@vueuse/core": "^12.4.0", + "@vueuse/integrations": "^12.4.0", + "focus-trap": "^7.6.4", "mark.js": "8.11.1", - "minisearch": "^7.1.0", - "shiki": "^1.22.2", - "vite": "^5.4.10", - "vue": "^3.5.12" + "minisearch": "^7.1.1", + "shiki": "^2.1.0", + "vite": "^5.4.14", + "vue": "^3.5.13" }, "bin": { "vitepress": "bin/vitepress.js" @@ -10501,12 +12878,14 @@ }, "node_modules/vm-browserify": { "version": "1.1.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" }, "node_modules/vue": { "version": "3.5.13", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz", + "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==", "dev": true, - "license": "MIT", "dependencies": { "@vue/compiler-dom": "3.5.13", "@vue/compiler-sfc": "3.5.13", @@ -10524,8 +12903,9 @@ } }, "node_modules/web-streams-polyfill": { - "version": "4.0.0", - "license": "MIT", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.1.0.tgz", + "integrity": "sha512-A7Jxrg7+eV+eZR/CIdESDnRGFb6/bcKukGvJBB5snI6cw3is1c2qamkYstC1bY1p08TyMRlN9eTMkxmnKJBPBw==", "peer": true, "engines": { "node": ">= 8" @@ -10533,27 +12913,30 @@ }, "node_modules/webidl-conversions": { "version": "7.0.0", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", "peer": true, "engines": { "node": ">=12" } }, "node_modules/whatwg-url": { - "version": "13.0.0", - "license": "MIT", + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.1.1.tgz", + "integrity": "sha512-mDGf9diDad/giZ/Sm9Xi2YcyzaFpbdLpJPr+E9fSkyQ7KpQD4SdFcugkRQYzhmfI4KeV4Qpnn2sKPdo+kmsgRQ==", "peer": true, "dependencies": { - "tr46": "^4.1.1", + "tr46": "^5.0.0", "webidl-conversions": "^7.0.0" }, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/which": { "version": "1.3.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dependencies": { "isexe": "^2.0.0" }, @@ -10563,7 +12946,8 @@ }, "node_modules/wide-align": { "version": "1.1.5", - "license": "ISC", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "optional": true, "peer": true, "dependencies": { @@ -10572,15 +12956,17 @@ }, "node_modules/word-wrap": { "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/wrap-ansi": { "version": "8.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -10596,7 +12982,8 @@ "node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -10611,14 +12998,16 @@ }, "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { "version": "5.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { "node": ">=8" } }, "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { "version": "6.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -10628,7 +13017,8 @@ }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "6.2.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "engines": { "node": ">=12" }, @@ -10638,11 +13028,13 @@ }, "node_modules/wrap-ansi/node_modules/emoji-regex": { "version": "9.2.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, "node_modules/wrap-ansi/node_modules/string-width": { "version": "5.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -10657,30 +13049,35 @@ }, "node_modules/wrappy": { "version": "1.0.2", - "license": "ISC" + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/xtend": { "version": "4.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "engines": { "node": ">=0.4" } }, "node_modules/y18n": { "version": "5.0.8", - "license": "ISC", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "engines": { "node": ">=10" } }, "node_modules/yallist": { "version": "4.0.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "peer": true }, "node_modules/yaml": { "version": "2.7.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", + "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", "bin": { "yaml": "bin.mjs" }, @@ -10690,7 +13087,8 @@ }, "node_modules/yargs": { "version": "17.7.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -10706,22 +13104,25 @@ }, "node_modules/yargs-parser": { "version": "21.1.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "engines": { "node": ">=12" } }, "node_modules/yn": { "version": "3.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "engines": { "node": ">=6" } }, "node_modules/yocto-queue": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -10731,7 +13132,8 @@ }, "node_modules/zip-stream": { "version": "6.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", + "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", "dependencies": { "archiver-utils": "^5.0.0", "compress-commons": "^6.0.2", @@ -10743,6 +13145,8 @@ }, "node_modules/zip-stream/node_modules/buffer": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "funding": [ { "type": "github", @@ -10757,7 +13161,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -10765,14 +13168,16 @@ }, "node_modules/zip-stream/node_modules/events": { "version": "3.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "engines": { "node": ">=0.8.x" } }, "node_modules/zip-stream/node_modules/readable-stream": { - "version": "4.6.0", - "license": "MIT", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -10786,8 +13191,9 @@ }, "node_modules/zwitch": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", "dev": true, - "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -10795,7 +13201,7 @@ }, "packages/emmett": { "name": "@event-driven-io/emmett", - "version": "0.26.0", + "version": "0.34.0", "bin": { "emmett": "dist/cli.js" }, @@ -10811,21 +13217,21 @@ }, "packages/emmett-esdb": { "name": "@event-driven-io/emmett-esdb", - "version": "0.26.0", + "version": "0.34.0", "devDependencies": { - "@event-driven-io/emmett-testcontainers": "0.26.0" + "@event-driven-io/emmett-testcontainers": "0.34.0" }, "peerDependencies": { - "@event-driven-io/emmett": "0.26.0", + "@event-driven-io/emmett": "0.34.0", "@eventstore/db-client": "^6.2.1" } }, "packages/emmett-expressjs": { "name": "@event-driven-io/emmett-expressjs", - "version": "0.26.0", + "version": "0.34.0", "devDependencies": {}, "peerDependencies": { - "@event-driven-io/emmett": "0.26.0", + "@event-driven-io/emmett": "0.34.0", "@types/express": "^4.17.21", "@types/supertest": "^6.0.2", "express": "^4.19.2", @@ -10836,10 +13242,10 @@ }, "packages/emmett-fastify": { "name": "@event-driven-io/emmett-fastify", - "version": "0.26.0", + "version": "0.34.0", "devDependencies": {}, "peerDependencies": { - "@event-driven-io/emmett": "0.26.0", + "@event-driven-io/emmett": "0.34.0", "@fastify/compress": "^7.0.3", "@fastify/etag": "^5.2.0", "@fastify/formbody": "^7.4.0", @@ -10849,31 +13255,31 @@ }, "packages/emmett-mongodb": { "name": "@event-driven-io/emmett-mongodb", - "version": "0.26.0", + "version": "0.34.0", "devDependencies": { - "@event-driven-io/emmett-testcontainers": "0.26.0", + "@event-driven-io/emmett-testcontainers": "0.34.0", "@testcontainers/mongodb": "^10.13.2" }, "peerDependencies": { - "@event-driven-io/emmett": "0.26.0", + "@event-driven-io/emmett": "0.34.0", "mongodb": "^6.10.0" } }, "packages/emmett-postgresql": { "name": "@event-driven-io/emmett-postgresql", - "version": "0.26.0", + "version": "0.34.0", "devDependencies": { - "@event-driven-io/emmett-testcontainers": "0.26.0", + "@event-driven-io/emmett-testcontainers": "0.34.0", "@testcontainers/postgresql": "^10.12.0" }, "peerDependencies": { - "@event-driven-io/emmett": "0.26.0", + "@event-driven-io/emmett": "0.34.0", "@event-driven-io/pongo": "0.16.4" } }, "packages/emmett-shims": { "name": "@event-driven-io/emmett-shims", - "version": "0.26.0", + "version": "0.34.0", "devDependencies": { "@types/node": "^20.11.30" }, @@ -10896,20 +13302,20 @@ }, "packages/emmett-sqlite": { "name": "@event-driven-io/emmett-sqlite", - "version": "0.26.0", + "version": "0.34.0", "devDependencies": { "@types/sqlite3": "^3.1.11" }, "peerDependencies": { - "@event-driven-io/emmett": "0.26.0", + "@event-driven-io/emmett": "0.34.0", "sqlite3": "^5.1.7" } }, "packages/emmett-testcontainers": { "name": "@event-driven-io/emmett-testcontainers", - "version": "0.26.0", + "version": "0.34.0", "dependencies": { - "@event-driven-io/emmett": "0.26.0", + "@event-driven-io/emmett": "0.34.0", "testcontainers": "^10.12.0" }, "devDependencies": { @@ -10918,12 +13324,13 @@ }, "packages/emmett-tests": { "name": "@event-driven-io/emmett-tests", - "version": "0.26.0", + "version": "0.34.0", "devDependencies": { - "@event-driven-io/emmett": "0.26.0", - "@event-driven-io/emmett-esdb": "0.26.0", - "@event-driven-io/emmett-postgresql": "0.26.0", - "@event-driven-io/emmett-testcontainers": "0.26.0", + "@event-driven-io/emmett": "0.34.0", + "@event-driven-io/emmett-esdb": "0.34.0", + "@event-driven-io/emmett-postgresql": "0.34.0", + "@event-driven-io/emmett-sqlite": "0.34.0", + "@event-driven-io/emmett-testcontainers": "0.34.0", "@testcontainers/postgresql": "^10.12.0" } } diff --git a/src/package.json b/src/package.json index 96db7e0a..2d8a318c 100644 --- a/src/package.json +++ b/src/package.json @@ -1,7 +1,7 @@ { "name": "@event-driven-io/core", "type": "module", - "version": "0.26.0", + "version": "0.34.0", "description": "Emmett - Event Sourcing development made simple", "engines": { "node": ">=20.11.1" diff --git a/src/packages/emmett-esdb/package.json b/src/packages/emmett-esdb/package.json index 9b537381..5d67b3f1 100644 --- a/src/packages/emmett-esdb/package.json +++ b/src/packages/emmett-esdb/package.json @@ -1,7 +1,7 @@ { "name": "@event-driven-io/emmett-esdb", "type": "module", - "version": "0.26.0", + "version": "0.34.0", "description": "Emmett - EventStoreDB - Event Sourcing development made simple", "scripts": { "build": "tsup", @@ -48,10 +48,10 @@ ], "dependencies": {}, "devDependencies": { - "@event-driven-io/emmett-testcontainers": "0.26.0" + "@event-driven-io/emmett-testcontainers": "0.34.0" }, "peerDependencies": { - "@event-driven-io/emmett": "0.26.0", + "@event-driven-io/emmett": "0.34.0", "@eventstore/db-client": "^6.2.1" } } diff --git a/src/packages/emmett-esdb/src/eventStore/consumers/eventStoreDBEventStoreConsumer.handling.int.spec.ts b/src/packages/emmett-esdb/src/eventStore/consumers/eventStoreDBEventStoreConsumer.handling.int.spec.ts new file mode 100644 index 00000000..88d85b87 --- /dev/null +++ b/src/packages/emmett-esdb/src/eventStore/consumers/eventStoreDBEventStoreConsumer.handling.int.spec.ts @@ -0,0 +1,409 @@ +import { assertThatArray, type Event } from '@event-driven-io/emmett'; +import { + EventStoreDBContainer, + StartedEventStoreDBContainer, +} from '@event-driven-io/emmett-testcontainers'; +import { after, before, describe, it } from 'node:test'; +import { v4 as uuid } from 'uuid'; +import { + type EventStoreDBEventStore, + getEventStoreDBEventStore, +} from '../eventstoreDBEventStore'; +import { + $all, + eventStoreDBEventStoreConsumer, + type EventStoreDBEventStoreConsumerType, +} from './eventStoreDBEventStoreConsumer'; +import type { EventStoreDBEventStoreProcessorOptions } from './eventStoreDBEventStoreProcessor'; + +const withDeadline = { timeout: 5000 }; + +void describe('EventStoreDB event store started consumer', () => { + let eventStoreDB: StartedEventStoreDBContainer; + let connectionString: string; + let eventStore: EventStoreDBEventStore; + + before(async () => { + eventStoreDB = await new EventStoreDBContainer().start(); + connectionString = eventStoreDB.getConnectionString(); + eventStore = getEventStoreDBEventStore(eventStoreDB.getClient()); + }); + + after(async () => { + try { + await eventStoreDB.stop(); + } catch (error) { + console.log(error); + } + }); + + const consumeFrom: [ + string, + (streamName: string) => EventStoreDBEventStoreConsumerType, + ][] = [ + ['all', () => ({ stream: $all })], + ['stream', (streamName) => ({ stream: streamName })], + ]; + + consumeFrom.forEach(([displayName, from]) => { + void describe('eachMessage', () => { + void it( + `handles all events from ${displayName} appended to event store BEFORE processor was started`, + withDeadline, + async () => { + // Given + const guestId = uuid(); + const streamName = `guestStay-${guestId}`; + const events: GuestStayEvent[] = [ + { type: 'GuestCheckedIn', data: { guestId } }, + { type: 'GuestCheckedOut', data: { guestId } }, + ]; + const appendResult = await eventStore.appendToStream( + streamName, + events, + ); + + const result: GuestStayEvent[] = []; + + // When + const consumer = eventStoreDBEventStoreConsumer({ + connectionString, + from: from(streamName), + }); + consumer.processor({ + processorId: uuid(), + stopAfter: (event) => + event.metadata.globalPosition === + appendResult.lastEventGlobalPosition, + eachMessage: (event) => { + result.push(event); + }, + }); + + try { + await consumer.start(); + + assertThatArray(result).containsElementsMatching(events); + } finally { + await consumer.close(); + } + }, + ); + + void it( + `handles all events from ${displayName} appended to event store AFTER processor was started`, + withDeadline, + async () => { + // Given + + const result: GuestStayEvent[] = []; + let stopAfterPosition: bigint | undefined = undefined; + + const guestId = uuid(); + const streamName = `guestStay-${guestId}`; + + // When + const consumer = eventStoreDBEventStoreConsumer({ + connectionString, + from: from(streamName), + }); + consumer.processor({ + processorId: uuid(), + stopAfter: (event) => + event.metadata.globalPosition === stopAfterPosition, + eachMessage: (event) => { + result.push(event); + }, + }); + + const events: GuestStayEvent[] = [ + { type: 'GuestCheckedIn', data: { guestId } }, + { type: 'GuestCheckedOut', data: { guestId } }, + ]; + + try { + const consumerPromise = consumer.start(); + + const appendResult = await eventStore.appendToStream( + streamName, + events, + ); + stopAfterPosition = appendResult.lastEventGlobalPosition; + + await consumerPromise; + + assertThatArray(result).containsElementsMatching(events); + } finally { + await consumer.close(); + } + }, + ); + + void it( + `handles ONLY events from ${displayName} AFTER provided global position`, + withDeadline, + async () => { + // Given + const guestId = uuid(); + const otherGuestId = uuid(); + const streamName = `guestStay-${guestId}`; + + const initialEvents: GuestStayEvent[] = [ + { type: 'GuestCheckedIn', data: { guestId } }, + { type: 'GuestCheckedOut', data: { guestId } }, + ]; + const { lastEventGlobalPosition: startPosition } = + await eventStore.appendToStream(streamName, initialEvents); + + const events: GuestStayEvent[] = [ + { type: 'GuestCheckedIn', data: { guestId: otherGuestId } }, + { type: 'GuestCheckedOut', data: { guestId: otherGuestId } }, + ]; + + const result: GuestStayEvent[] = []; + let stopAfterPosition: bigint | undefined = undefined; + + // When + const consumer = eventStoreDBEventStoreConsumer({ + connectionString, + from: from(streamName), + }); + consumer.processor({ + processorId: uuid(), + startFrom: { position: startPosition }, + stopAfter: (event) => + event.metadata.globalPosition === stopAfterPosition, + eachMessage: (event) => { + result.push(event); + }, + }); + + try { + const consumerPromise = consumer.start(); + + const appendResult = await eventStore.appendToStream( + streamName, + events, + ); + stopAfterPosition = appendResult.lastEventGlobalPosition; + + await consumerPromise; + + assertThatArray(result).containsOnlyElementsMatching(events); + } finally { + await consumer.close(); + } + }, + ); + + void it( + `handles all events from ${displayName} when CURRENT position is NOT stored`, + withDeadline, + async () => { + // Given + const guestId = uuid(); + const otherGuestId = uuid(); + const streamName = `guestStay-${guestId}`; + + const initialEvents: GuestStayEvent[] = [ + { type: 'GuestCheckedIn', data: { guestId } }, + { type: 'GuestCheckedOut', data: { guestId } }, + ]; + + await eventStore.appendToStream(streamName, initialEvents); + + const events: GuestStayEvent[] = [ + { type: 'GuestCheckedIn', data: { guestId: otherGuestId } }, + { type: 'GuestCheckedOut', data: { guestId: otherGuestId } }, + ]; + + const result: GuestStayEvent[] = []; + let stopAfterPosition: bigint | undefined = undefined; + + // When + const consumer = eventStoreDBEventStoreConsumer({ + connectionString, + from: from(streamName), + }); + consumer.processor({ + processorId: uuid(), + startFrom: 'CURRENT', + stopAfter: (event) => + event.metadata.globalPosition === stopAfterPosition, + eachMessage: (event) => { + result.push(event); + }, + }); + + try { + const consumerPromise = consumer.start(); + + const appendResult = await eventStore.appendToStream( + streamName, + events, + ); + stopAfterPosition = appendResult.lastEventGlobalPosition; + + await consumerPromise; + + assertThatArray(result).containsElementsMatching([ + ...initialEvents, + ...events, + ]); + } finally { + await consumer.close(); + } + }, + ); + + void it.skip( + `handles only new events when CURRENT position is stored for restarted consumer from ${displayName}`, + withDeadline, + async () => { + // Given + const guestId = uuid(); + const otherGuestId = uuid(); + const streamName = `guestStay-${guestId}`; + + const initialEvents: GuestStayEvent[] = [ + { type: 'GuestCheckedIn', data: { guestId } }, + { type: 'GuestCheckedOut', data: { guestId } }, + ]; + const { lastEventGlobalPosition } = await eventStore.appendToStream( + streamName, + initialEvents, + ); + + const events: GuestStayEvent[] = [ + { type: 'GuestCheckedIn', data: { guestId: otherGuestId } }, + { type: 'GuestCheckedOut', data: { guestId: otherGuestId } }, + ]; + + let result: GuestStayEvent[] = []; + let stopAfterPosition: bigint | undefined = lastEventGlobalPosition; + + // When + const consumer = eventStoreDBEventStoreConsumer({ + connectionString, + from: from(streamName), + }); + consumer.processor({ + processorId: uuid(), + startFrom: 'CURRENT', + stopAfter: (event) => + event.metadata.globalPosition === stopAfterPosition, + eachMessage: (event) => { + result.push(event); + }, + }); + + await consumer.start(); + await consumer.stop(); + + result = []; + + stopAfterPosition = undefined; + + try { + const consumerPromise = consumer.start(); + + const appendResult = await eventStore.appendToStream( + streamName, + events, + ); + stopAfterPosition = appendResult.lastEventGlobalPosition; + + await consumerPromise; + + assertThatArray(result).containsOnlyElementsMatching(events); + } finally { + await consumer.close(); + } + }, + ); + + void it.skip( + `handles only new events when CURRENT position is stored for a new consumer from ${displayName}`, + withDeadline, + async () => { + // Given + const guestId = uuid(); + const otherGuestId = uuid(); + const streamName = `guestStay-${guestId}`; + + const initialEvents: GuestStayEvent[] = [ + { type: 'GuestCheckedIn', data: { guestId } }, + { type: 'GuestCheckedOut', data: { guestId } }, + ]; + const { lastEventGlobalPosition } = await eventStore.appendToStream( + streamName, + initialEvents, + ); + + const events: GuestStayEvent[] = [ + { type: 'GuestCheckedIn', data: { guestId: otherGuestId } }, + { type: 'GuestCheckedOut', data: { guestId: otherGuestId } }, + ]; + + let result: GuestStayEvent[] = []; + let stopAfterPosition: bigint | undefined = lastEventGlobalPosition; + + const processorOptions: EventStoreDBEventStoreProcessorOptions = + { + processorId: uuid(), + startFrom: 'CURRENT', + stopAfter: (event) => + event.metadata.globalPosition === stopAfterPosition, + eachMessage: (event) => { + result.push(event); + }, + }; + + // When + const consumer = eventStoreDBEventStoreConsumer({ + connectionString, + from: from(streamName), + }); + try { + consumer.processor(processorOptions); + + await consumer.start(); + } finally { + await consumer.close(); + } + + result = []; + + stopAfterPosition = undefined; + + const newConsumer = eventStoreDBEventStoreConsumer({ + connectionString, + from: from(streamName), + }); + newConsumer.processor(processorOptions); + + try { + const consumerPromise = newConsumer.start(); + + const appendResult = await eventStore.appendToStream( + streamName, + events, + ); + stopAfterPosition = appendResult.lastEventGlobalPosition; + + await consumerPromise; + + assertThatArray(result).containsOnlyElementsMatching(events); + } finally { + await newConsumer.close(); + } + }, + ); + }); + }); +}); + +type GuestCheckedIn = Event<'GuestCheckedIn', { guestId: string }>; +type GuestCheckedOut = Event<'GuestCheckedOut', { guestId: string }>; + +type GuestStayEvent = GuestCheckedIn | GuestCheckedOut; diff --git a/src/packages/emmett-esdb/src/eventStore/consumers/eventStoreDBEventStoreConsumer.int.spec.ts b/src/packages/emmett-esdb/src/eventStore/consumers/eventStoreDBEventStoreConsumer.int.spec.ts new file mode 100644 index 00000000..c6d5eb2f --- /dev/null +++ b/src/packages/emmett-esdb/src/eventStore/consumers/eventStoreDBEventStoreConsumer.int.spec.ts @@ -0,0 +1,142 @@ +import { + assertFails, + assertFalse, + assertThrowsAsync, + assertTrue, + EmmettError, +} from '@event-driven-io/emmett'; +import { + EventStoreDBContainer, + StartedEventStoreDBContainer, +} from '@event-driven-io/emmett-testcontainers'; +import { after, afterEach, before, beforeEach, describe, it } from 'node:test'; +import { v4 as uuid } from 'uuid'; +import { + eventStoreDBEventStoreConsumer, + type EventStoreDBEventStoreConsumer, +} from './eventStoreDBEventStoreConsumer'; +import type { EventStoreDBEventStoreProcessor } from './eventStoreDBEventStoreProcessor'; + +void describe('EventStoreDB event store consumer', () => { + let eventStoreDB: StartedEventStoreDBContainer; + let connectionString: string; + const dummyProcessor: EventStoreDBEventStoreProcessor = { + id: uuid(), + start: () => Promise.resolve('BEGINNING'), + handle: () => Promise.resolve(), + isActive: false, + }; + + before(async () => { + eventStoreDB = await new EventStoreDBContainer().start(); + connectionString = eventStoreDB.getConnectionString(); + }); + + after(async () => { + try { + await eventStoreDB.stop(); + } catch (error) { + console.log(error); + } + }); + + void it('creates not-started consumer for the specified connection string', () => { + const consumer = eventStoreDBEventStoreConsumer({ + connectionString, + processors: [dummyProcessor], + }); + + assertFalse(consumer.isRunning); + }); + + void it('creates not-started consumer if connection string targets not existing EventStoreDB database', () => { + const connectionStringToNotExistingDB = + 'esdb://not-existing:2113?tls=false'; + const consumer = eventStoreDBEventStoreConsumer({ + connectionString: connectionStringToNotExistingDB, + processors: [dummyProcessor], + }); + + assertFalse(consumer.isRunning); + }); + + void describe('created consumer', () => { + let consumer: EventStoreDBEventStoreConsumer; + + beforeEach(() => { + consumer = eventStoreDBEventStoreConsumer({ + connectionString, + processors: [dummyProcessor], + }); + }); + afterEach(() => consumer.stop()); + + void it('subscribes to existing event store', () => { + consumer.start().catch(() => assertFails()); + + assertTrue(consumer.isRunning); + }); + + void it('fails to start if connection string targets not existing EventStoreDB database', async () => { + const connectionStringToNotExistingDB = + 'esdb://not-existing:2113?tls=false'; + const consumerToNotExistingServer = eventStoreDBEventStoreConsumer({ + connectionString: connectionStringToNotExistingDB, + processors: [dummyProcessor], + }); + await assertThrowsAsync( + () => consumerToNotExistingServer.start(), + (error) => { + return 'type' in error && error.type === 'unavailable'; + }, + ); + }); + + void it('fails to start if there are no processors', async () => { + const consumerToNotExistingServer = eventStoreDBEventStoreConsumer({ + connectionString, + processors: [], + }); + await assertThrowsAsync( + () => consumerToNotExistingServer.start(), + (error) => { + return ( + error.message === + 'Cannot start consumer without at least a single processor' + ); + }, + ); + }); + + void it(`stopping not started consumer doesn't fail`, async () => { + await consumer.stop(); + + assertFalse(consumer.isRunning); + }); + + void it(`stopping not started consumer is idempotent`, async () => { + await consumer.stop(); + await consumer.stop(); + + assertFalse(consumer.isRunning); + }); + }); + + void describe('started consumer', () => { + let consumer: EventStoreDBEventStoreConsumer; + + beforeEach(() => { + consumer = eventStoreDBEventStoreConsumer({ + connectionString, + processors: [dummyProcessor], + }); + }); + afterEach(() => consumer.stop()); + + void it('stops started consumer', async () => { + await consumer.stop(); + + assertFalse(consumer.isRunning); + }); + }); +}); diff --git a/src/packages/emmett-esdb/src/eventStore/consumers/eventStoreDBEventStoreConsumer.ts b/src/packages/emmett-esdb/src/eventStore/consumers/eventStoreDBEventStoreConsumer.ts new file mode 100644 index 00000000..f627df6a --- /dev/null +++ b/src/packages/emmett-esdb/src/eventStore/consumers/eventStoreDBEventStoreConsumer.ts @@ -0,0 +1,169 @@ +import { EmmettError, type Event } from '@event-driven-io/emmett'; +import { + EventStoreDBClient, + type SubscribeToAllOptions, + type SubscribeToStreamOptions, +} from '@eventstore/db-client'; +import { + eventStoreDBEventStoreProcessor, + type EventStoreDBEventStoreProcessor, + type EventStoreDBEventStoreProcessorOptions, +} from './eventStoreDBEventStoreProcessor'; +import { + DefaultEventStoreDBEventStoreProcessorBatchSize, + eventStoreDBSubscription, + zipEventStoreDBEventStoreMessageBatchPullerStartFrom, + type EventStoreDBEventStoreMessageBatchPuller, + type EventStoreDBEventStoreMessagesBatchHandler, +} from './subscriptions'; + +export type EventStoreDBEventStoreConsumerConfig< + ConsumerEventType extends Event = Event, +> = { + from?: EventStoreDBEventStoreConsumerType; + processors?: EventStoreDBEventStoreProcessor[]; + pulling?: { + batchSize?: number; + }; +}; + +export type EventStoreDBEventStoreConsumerOptions< + ConsumerEventType extends Event = Event, +> = EventStoreDBEventStoreConsumerConfig & + ( + | { + connectionString: string; + } + | { client: EventStoreDBClient } + ); + +export type $all = '$all'; +export const $all = '$all'; + +export type EventStoreDBEventStoreConsumerType = + | { + stream: $all; + options?: Exclude; + } + | { + stream: string; + options?: Exclude; + }; + +export type EventStoreDBEventStoreConsumer< + ConsumerEventType extends Event = Event, +> = Readonly<{ + isRunning: boolean; + processors: EventStoreDBEventStoreProcessor[]; + processor: ( + options: EventStoreDBEventStoreProcessorOptions, + ) => EventStoreDBEventStoreProcessor; + start: () => Promise; + stop: () => Promise; + close: () => Promise; +}>; + +export const eventStoreDBEventStoreConsumer = < + ConsumerEventType extends Event = Event, +>( + options: EventStoreDBEventStoreConsumerOptions, +): EventStoreDBEventStoreConsumer => { + let isRunning = false; + const { pulling } = options; + const processors = options.processors ?? []; + + let start: Promise; + + let currentSubscription: EventStoreDBEventStoreMessageBatchPuller | undefined; + + const client = + 'client' in options + ? options.client + : EventStoreDBClient.connectionString(options.connectionString); + + const eachBatch: EventStoreDBEventStoreMessagesBatchHandler< + ConsumerEventType + > = async (messagesBatch) => { + const activeProcessors = processors.filter((s) => s.isActive); + + if (activeProcessors.length === 0) + return { + type: 'STOP', + reason: 'No active processors', + }; + + const result = await Promise.allSettled( + activeProcessors.map((s) => { + // TODO: Add here filtering to only pass messages that can be handled by processor + return s.handle(messagesBatch, { client }); + }), + ); + + return result.some( + (r) => r.status === 'fulfilled' && r.value?.type !== 'STOP', + ) + ? undefined + : { + type: 'STOP', + }; + }; + + const subscription = (currentSubscription = eventStoreDBSubscription({ + client, + eachBatch, + batchSize: + pulling?.batchSize ?? DefaultEventStoreDBEventStoreProcessorBatchSize, + })); + + const stop = async () => { + if (!isRunning) return; + isRunning = false; + if (currentSubscription) { + await currentSubscription.stop(); + currentSubscription = undefined; + } + await start; + }; + + return { + processors, + get isRunning() { + return isRunning; + }, + processor: ( + options: EventStoreDBEventStoreProcessorOptions, + ): EventStoreDBEventStoreProcessor => { + const processor = eventStoreDBEventStoreProcessor(options); + + processors.push(processor); + + return processor; + }, + start: () => { + if (isRunning) return start; + + start = (async () => { + if (processors.length === 0) + return Promise.reject( + new EmmettError( + 'Cannot start consumer without at least a single processor', + ), + ); + + isRunning = true; + + const startFrom = zipEventStoreDBEventStoreMessageBatchPullerStartFrom( + await Promise.all(processors.map((o) => o.start(client))), + ); + + return subscription.start({ startFrom }); + })(); + + return start; + }, + stop, + close: async () => { + await stop(); + }, + }; +}; diff --git a/src/packages/emmett-esdb/src/eventStore/consumers/eventStoreDBEventStoreProcessor.ts b/src/packages/emmett-esdb/src/eventStore/consumers/eventStoreDBEventStoreProcessor.ts new file mode 100644 index 00000000..a10b6a36 --- /dev/null +++ b/src/packages/emmett-esdb/src/eventStore/consumers/eventStoreDBEventStoreProcessor.ts @@ -0,0 +1,165 @@ +import { + EmmettError, + type Event, + type ReadEvent, + type ReadEventMetadataWithGlobalPosition, +} from '@event-driven-io/emmett'; +import type { EventStoreDBClient } from '@eventstore/db-client'; +import { v7 as uuid } from 'uuid'; +import type { EventStoreDBSubscriptionStartFrom } from './subscriptions'; + +export type EventStoreDBEventStoreProcessorEventsBatch< + EventType extends Event = Event, +> = { + messages: ReadEvent[]; +}; + +export type EventStoreDBEventStoreProcessor = { + id: string; + start: ( + client: EventStoreDBClient, + ) => Promise; + isActive: boolean; + handle: ( + messagesBatch: EventStoreDBEventStoreProcessorEventsBatch, + context: { client: EventStoreDBClient }, + ) => Promise; +}; + +export const EventStoreDBEventStoreProcessor = { + result: { + skip: (options?: { + reason?: string; + }): EventStoreDBEventStoreProcessorMessageHandlerResult => ({ + type: 'SKIP', + ...(options ?? {}), + }), + stop: (options?: { + reason?: string; + error?: EmmettError; + }): EventStoreDBEventStoreProcessorMessageHandlerResult => ({ + type: 'STOP', + ...(options ?? {}), + }), + }, +}; + +export type EventStoreDBEventStoreProcessorMessageHandlerResult = + | void + | { type: 'SKIP'; reason?: string } + | { type: 'STOP'; reason?: string; error?: EmmettError }; + +export type EventStoreDBEventStoreProcessorEachMessageHandler< + EventType extends Event = Event, +> = ( + event: ReadEvent, +) => + | Promise + | EventStoreDBEventStoreProcessorMessageHandlerResult; + +export type EventStoreDBEventStoreProcessorStartFrom = + | EventStoreDBSubscriptionStartFrom + | 'CURRENT'; + +export type EventStoreDBEventStoreProcessorOptions< + EventType extends Event = Event, +> = { + processorId?: string; + version?: number; + partition?: string; + startFrom?: EventStoreDBEventStoreProcessorStartFrom; + stopAfter?: ( + message: ReadEvent, + ) => boolean; + eachMessage: EventStoreDBEventStoreProcessorEachMessageHandler; +}; + +export const eventStoreDBEventStoreProcessor = < + EventType extends Event = Event, +>( + options: EventStoreDBEventStoreProcessorOptions, +): EventStoreDBEventStoreProcessor => { + const { eachMessage } = options; + let isActive = true; + //let lastProcessedPosition: bigint | null = null; + + options.processorId = options.processorId ?? uuid(); + + return { + id: options.processorId, + start: ( + _client: EventStoreDBClient, + ): Promise => { + isActive = true; + if (options.startFrom !== 'CURRENT') + return Promise.resolve(options.startFrom); + + // const { lastProcessedPosition } = await readProcessorCheckpoint( + // execute, + // { + // processorId: options.processorId, + // partition: options.partition, + // }, + // ); + + // if (lastProcessedPosition === null) return 'BEGINNING'; + + // return { globalPosition: lastProcessedPosition }; + return Promise.resolve('BEGINNING'); + }, + get isActive() { + return isActive; + }, + handle: async ({ + messages, + }): Promise => { + if (!isActive) return; + + let result: + | EventStoreDBEventStoreProcessorMessageHandlerResult + | undefined = undefined; + + //let lastProcessedPosition: bigint | null = null; + + for (const message of messages) { + const typedMessage = message as ReadEvent< + EventType, + ReadEventMetadataWithGlobalPosition + >; + + const messageProcessingResult = await eachMessage(typedMessage); + + // TODO: Add correct handling of the storing checkpoint + // await storeProcessorCheckpoint(tx.execute, { + // processorId: options.processorId, + // version: options.version, + // lastProcessedPosition, + // newPosition: typedMessage.metadata.globalPosition, + // partition: options.partition, + // }); + + //lastProcessedPosition = typedMessage.metadata.globalPosition; + + if ( + messageProcessingResult && + messageProcessingResult.type === 'STOP' + ) { + isActive = false; + result = messageProcessingResult; + break; + } + + if (options.stopAfter && options.stopAfter(typedMessage)) { + isActive = false; + result = { type: 'STOP', reason: 'Stop condition reached' }; + break; + } + + if (messageProcessingResult && messageProcessingResult.type === 'SKIP') + continue; + } + + return result; + }, + }; +}; diff --git a/src/packages/emmett-esdb/src/eventStore/consumers/index.ts b/src/packages/emmett-esdb/src/eventStore/consumers/index.ts new file mode 100644 index 00000000..a6139530 --- /dev/null +++ b/src/packages/emmett-esdb/src/eventStore/consumers/index.ts @@ -0,0 +1,3 @@ +export * from './eventStoreDBEventStoreConsumer'; +export * from './eventStoreDBEventStoreProcessor'; +export * from './subscriptions'; diff --git a/src/packages/emmett-esdb/src/eventStore/consumers/subscriptions/index.ts b/src/packages/emmett-esdb/src/eventStore/consumers/subscriptions/index.ts new file mode 100644 index 00000000..96fac4b8 --- /dev/null +++ b/src/packages/emmett-esdb/src/eventStore/consumers/subscriptions/index.ts @@ -0,0 +1,183 @@ +import type { + EmmettError, + Event, + ReadEvent, + ReadEventMetadataWithGlobalPosition, +} from '@event-driven-io/emmett'; +import { + END, + EventStoreDBClient, + excludeSystemEvents, + START, + type JSONRecordedEvent, + type StreamSubscription, +} from '@eventstore/db-client'; +import { finished, Readable } from 'stream'; +import { mapFromESDBEvent } from '../../eventstoreDBEventStore'; +import { + $all, + type EventStoreDBEventStoreConsumerType, +} from '../eventStoreDBEventStoreConsumer'; + +export const DefaultEventStoreDBEventStoreProcessorBatchSize = 100; +export const DefaultEventStoreDBEventStoreProcessorPullingFrequencyInMs = 50; + +export type EventStoreDBEventStoreMessagesBatch< + EventType extends Event = Event, +> = { + messages: ReadEvent[]; +}; + +export type EventStoreDBEventStoreMessagesBatchHandlerResult = void | { + type: 'STOP'; + reason?: string; + error?: EmmettError; +}; + +export type EventStoreDBEventStoreMessagesBatchHandler< + EventType extends Event = Event, +> = ( + messagesBatch: EventStoreDBEventStoreMessagesBatch, +) => + | Promise + | EventStoreDBEventStoreMessagesBatchHandlerResult; + +export type EventStoreDBSubscriptionOptions = { + from?: EventStoreDBEventStoreConsumerType; + client: EventStoreDBClient; + batchSize: number; + eachBatch: EventStoreDBEventStoreMessagesBatchHandler; +}; + +export type EventStoreDBSubscriptionStartFrom = + | { position: bigint } + | 'BEGINNING' + | 'END'; + +export type EventStoreDBSubscriptionStartOptions = { + startFrom: EventStoreDBSubscriptionStartFrom; +}; + +export type EventStoreDBEventStoreMessageBatchPuller = { + isRunning: boolean; + start(options: EventStoreDBSubscriptionStartOptions): Promise; + stop(): Promise; +}; + +const toGlobalPosition = (startFrom: EventStoreDBSubscriptionStartFrom) => + startFrom === 'BEGINNING' + ? START + : startFrom === 'END' + ? END + : { + prepare: startFrom.position, + commit: startFrom.position, + }; + +const toStreamPosition = (startFrom: EventStoreDBSubscriptionStartFrom) => + startFrom === 'BEGINNING' + ? START + : startFrom === 'END' + ? END + : startFrom.position; + +const subscribe = ( + client: EventStoreDBClient, + from: EventStoreDBEventStoreConsumerType | undefined, + options: EventStoreDBSubscriptionStartOptions, +) => + from == undefined || from.stream == $all + ? client.subscribeToAll({ + fromPosition: toGlobalPosition(options.startFrom), + filter: excludeSystemEvents(), + ...(from?.options ?? {}), + }) + : client.subscribeToStream(from.stream, { + fromRevision: toStreamPosition(options.startFrom), + ...(from.options ?? {}), + }); + +export const eventStoreDBSubscription = ({ + client, + from, + //batchSize, + eachBatch, +}: EventStoreDBSubscriptionOptions): EventStoreDBEventStoreMessageBatchPuller => { + let isRunning = false; + + let start: Promise; + + let subscription: StreamSubscription; + + const pullMessages = async ( + options: EventStoreDBSubscriptionStartOptions, + ) => { + subscription = subscribe(client, from, options); + + return new Promise((resolve, reject) => { + finished( + subscription.on('data', async (resolvedEvent) => { + if (!resolvedEvent.event) return; + + const event = mapFromESDBEvent( + resolvedEvent.event as JSONRecordedEvent, + ); + + const result = await eachBatch({ messages: [event] }); + + if (result && result.type === 'STOP') { + await subscription.unsubscribe(); + } + }) as unknown as Readable, + (error) => { + if (!error) { + console.info(`Stopping subscription.`); + resolve(); + return; + } + console.error(`Received error: ${JSON.stringify(error)}.`); + reject(error); + }, + ); + }); + }; + + return { + get isRunning() { + return isRunning; + }, + start: (options) => { + if (isRunning) return start; + + start = (async () => { + isRunning = true; + + return pullMessages(options); + })(); + + return start; + }, + stop: async () => { + if (!isRunning) return; + isRunning = false; + await subscription?.unsubscribe(); + await start; + }, + }; +}; + +export const zipEventStoreDBEventStoreMessageBatchPullerStartFrom = ( + options: (EventStoreDBSubscriptionStartFrom | undefined)[], +): EventStoreDBSubscriptionStartFrom => { + if ( + options.length === 0 || + options.some((o) => o === undefined || o === 'BEGINNING') + ) + return 'BEGINNING'; + + if (options.every((o) => o === 'END')) return 'END'; + + return options + .filter((o) => o !== undefined && o !== 'BEGINNING' && o !== 'END') + .sort((a, b) => (a > b ? 1 : -1))[0]!; +}; diff --git a/src/packages/emmett-esdb/src/eventStore/eventstoreDBEventStore.ts b/src/packages/emmett-esdb/src/eventStore/eventstoreDBEventStore.ts index 8f62a8df..e805b71b 100644 --- a/src/packages/emmett-esdb/src/eventStore/eventstoreDBEventStore.ts +++ b/src/packages/emmett-esdb/src/eventStore/eventstoreDBEventStore.ts @@ -28,6 +28,11 @@ import { type ReadStreamOptions as ESDBReadStreamOptions, type JSONRecordedEvent, } from '@eventstore/db-client'; +import { + eventStoreDBEventStoreConsumer, + type EventStoreDBEventStoreConsumer, + type EventStoreDBEventStoreConsumerConfig, +} from './consumers'; const toEventStoreDBReadOptions = ( options: ReadStreamOptions | undefined, @@ -54,7 +59,17 @@ export type EventStoreDBReadEvent = ReadEvent< EventStoreDBReadEventMetadata >; -export type EventStoreDBEventStore = EventStore; +export interface EventStoreDBEventStore + extends EventStore { + appendToStream( + streamName: string, + events: EventType[], + options?: AppendToStreamOptions, + ): Promise; + consumer( + options?: EventStoreDBEventStoreConsumerConfig, + ): EventStoreDBEventStoreConsumer; +} export const getEventStoreDBEventStore = ( eventStore: EventStoreDBClient, @@ -195,11 +210,19 @@ export const getEventStoreDBEventStore = ( } }, + consumer: ( + options?: EventStoreDBEventStoreConsumerConfig, + ): EventStoreDBEventStoreConsumer => + eventStoreDBEventStoreConsumer({ + ...(options ?? {}), + client: eventStore, + }), + //streamEvents: streamEvents(eventStore), }; }; -const mapFromESDBEvent = ( +export const mapFromESDBEvent = ( event: JSONRecordedEvent, ): ReadEvent => { return >{ diff --git a/src/packages/emmett-esdb/src/eventStore/index.ts b/src/packages/emmett-esdb/src/eventStore/index.ts index a2782025..2b96e813 100644 --- a/src/packages/emmett-esdb/src/eventStore/index.ts +++ b/src/packages/emmett-esdb/src/eventStore/index.ts @@ -1 +1,2 @@ +export * from './consumers'; export * from './eventstoreDBEventStore'; diff --git a/src/packages/emmett-expressjs/package.json b/src/packages/emmett-expressjs/package.json index ff1e118d..c97313dc 100644 --- a/src/packages/emmett-expressjs/package.json +++ b/src/packages/emmett-expressjs/package.json @@ -1,6 +1,6 @@ { "name": "@event-driven-io/emmett-expressjs", - "version": "0.26.0", + "version": "0.34.0", "type": "module", "description": "Emmett - Event Sourcing development made simple", "scripts": { @@ -49,7 +49,7 @@ "dependencies": {}, "devDependencies": {}, "peerDependencies": { - "@event-driven-io/emmett": "0.26.0", + "@event-driven-io/emmett": "0.34.0", "@types/express": "^4.17.21", "@types/supertest": "^6.0.2", "express": "^4.19.2", diff --git a/src/packages/emmett-fastify/package.json b/src/packages/emmett-fastify/package.json index d0648952..fd33a4ba 100644 --- a/src/packages/emmett-fastify/package.json +++ b/src/packages/emmett-fastify/package.json @@ -1,6 +1,6 @@ { "name": "@event-driven-io/emmett-fastify", - "version": "0.26.0", + "version": "0.34.0", "type": "module", "description": "Emmett - Event Sourcing development made simple", "scripts": { @@ -53,7 +53,7 @@ "dependencies": {}, "devDependencies": {}, "peerDependencies": { - "@event-driven-io/emmett": "0.26.0", + "@event-driven-io/emmett": "0.34.0", "fastify": "^4.28.1", "@fastify/compress": "^7.0.3", "@fastify/etag": "^5.2.0", diff --git a/src/packages/emmett-mongodb/package.json b/src/packages/emmett-mongodb/package.json index 3f89873d..c00d427d 100644 --- a/src/packages/emmett-mongodb/package.json +++ b/src/packages/emmett-mongodb/package.json @@ -1,7 +1,7 @@ { "name": "@event-driven-io/emmett-mongodb", "type": "module", - "version": "0.26.0", + "version": "0.34.0", "description": "Emmett - MongoDB - Event Sourcing development made simple", "scripts": { "build": "tsup", @@ -47,11 +47,11 @@ "dist" ], "devDependencies": { - "@event-driven-io/emmett-testcontainers": "0.26.0", + "@event-driven-io/emmett-testcontainers": "0.34.0", "@testcontainers/mongodb": "^10.13.2" }, "peerDependencies": { - "@event-driven-io/emmett": "0.26.0", + "@event-driven-io/emmett": "0.34.0", "mongodb": "^6.10.0" } } diff --git a/src/packages/emmett-mongodb/src/eventStore/mongoDBEventStore.ts b/src/packages/emmett-mongodb/src/eventStore/mongoDBEventStore.ts index 350a1321..82731538 100644 --- a/src/packages/emmett-mongodb/src/eventStore/mongoDBEventStore.ts +++ b/src/packages/emmett-mongodb/src/eventStore/mongoDBEventStore.ts @@ -336,7 +336,7 @@ class MongoDBEventStoreImplementation implements MongoDBEventStore, Closeable { const eventsToAppend: ReadEvent[] = events.map((event) => { const metadata: MongoDBReadEventMetadata = { - eventId: uuid(), + messageId: uuid(), streamName, streamPosition: ++streamOffset, }; diff --git a/src/packages/emmett-mongodb/src/eventStore/projections/mongoDBInlineProjection.ts b/src/packages/emmett-mongodb/src/eventStore/projections/mongoDBInlineProjection.ts index 2c80beea..3edfd0be 100644 --- a/src/packages/emmett-mongodb/src/eventStore/projections/mongoDBInlineProjection.ts +++ b/src/packages/emmett-mongodb/src/eventStore/projections/mongoDBInlineProjection.ts @@ -1,9 +1,9 @@ import { type CanHandle, type Event, + type ProjectionDefinition, type ProjectionHandler, type ReadEvent, - type TypedProjectionDefinition, } from '@event-driven-io/emmett'; import type { Collection, Document, UpdateFilter } from 'mongodb'; import type { @@ -37,7 +37,7 @@ export type MongoDBInlineProjectionHandler< export type MongoDBInlineProjectionDefinition< EventType extends Event = Event, EventMetaDataType extends MongoDBReadEventMetadata = MongoDBReadEventMetadata, -> = TypedProjectionDefinition< +> = ProjectionDefinition< EventType, EventMetaDataType, MongoDBProjectionInlineHandlerContext diff --git a/src/packages/emmett-postgresql/package.json b/src/packages/emmett-postgresql/package.json index 4fafdcb5..4d5a4778 100644 --- a/src/packages/emmett-postgresql/package.json +++ b/src/packages/emmett-postgresql/package.json @@ -1,6 +1,6 @@ { "name": "@event-driven-io/emmett-postgresql", - "version": "0.26.0", + "version": "0.34.0", "type": "module", "description": "Emmett - PostgreSQL - Event Sourcing development made simple", "scripts": { @@ -70,10 +70,10 @@ ], "devDependencies": { "@testcontainers/postgresql": "^10.12.0", - "@event-driven-io/emmett-testcontainers": "0.26.0" + "@event-driven-io/emmett-testcontainers": "0.34.0" }, "peerDependencies": { - "@event-driven-io/emmett": "0.26.0", + "@event-driven-io/emmett": "0.34.0", "@event-driven-io/pongo": "0.16.4" } } diff --git a/src/packages/emmett-postgresql/src/eventStore/commandHandler.int.spec.ts b/src/packages/emmett-postgresql/src/eventStore/commandHandler.int.spec.ts index f312b0b7..f16b7b28 100644 --- a/src/packages/emmett-postgresql/src/eventStore/commandHandler.int.spec.ts +++ b/src/packages/emmett-postgresql/src/eventStore/commandHandler.int.spec.ts @@ -3,7 +3,6 @@ import { assertEqual, assertIsNotNull, CommandHandler, - projections, } from '@event-driven-io/emmett'; import { pongoClient, type PongoClient } from '@event-driven-io/pongo'; import { @@ -35,7 +34,9 @@ void describe('Postgres Projections', () => { postgres = await new PostgreSqlContainer().start(); connectionString = postgres.getConnectionUri(); eventStore = getPostgreSQLEventStore(connectionString, { - projections: projections.inline([shoppingCartShortInfoProjection]), + projections: [ + { type: 'inline', projection: shoppingCartShortInfoProjection }, + ], schema: { autoMigration: 'None', }, diff --git a/src/packages/emmett-postgresql/src/eventStore/subscriptions/index.ts b/src/packages/emmett-postgresql/src/eventStore/consumers/index.ts similarity index 63% rename from src/packages/emmett-postgresql/src/eventStore/subscriptions/index.ts rename to src/packages/emmett-postgresql/src/eventStore/consumers/index.ts index 062d4016..8e8cb601 100644 --- a/src/packages/emmett-postgresql/src/eventStore/subscriptions/index.ts +++ b/src/packages/emmett-postgresql/src/eventStore/consumers/index.ts @@ -1,3 +1,3 @@ export * from './messageBatchProcessing'; export * from './postgreSQLEventStoreConsumer'; -export * from './postgreSQLEventStoreSubscription'; +export * from './postgreSQLProcessor'; diff --git a/src/packages/emmett-postgresql/src/eventStore/subscriptions/messageBatchProcessing/index.ts b/src/packages/emmett-postgresql/src/eventStore/consumers/messageBatchProcessing/index.ts similarity index 96% rename from src/packages/emmett-postgresql/src/eventStore/subscriptions/messageBatchProcessing/index.ts rename to src/packages/emmett-postgresql/src/eventStore/consumers/messageBatchProcessing/index.ts index 334f22e9..b0fae912 100644 --- a/src/packages/emmett-postgresql/src/eventStore/subscriptions/messageBatchProcessing/index.ts +++ b/src/packages/emmett-postgresql/src/eventStore/consumers/messageBatchProcessing/index.ts @@ -11,8 +11,8 @@ import { type ReadMessagesBatchOptions, } from '../../schema/readMessagesBatch'; -export const DefaultPostgreSQLEventStoreSubscriptionBatchSize = 100; -export const DefaultPostgreSQLEventStoreSubscriptionPullingFrequencyInMs = 50; +export const DefaultPostgreSQLEventStoreProcessorBatchSize = 100; +export const DefaultPostgreSQLEventStoreProcessorPullingFrequencyInMs = 50; export type PostgreSQLEventStoreMessagesBatch = { diff --git a/src/packages/emmett-postgresql/src/eventStore/consumers/postgreSQLEventStoreConsumer.handling.int.spec.ts b/src/packages/emmett-postgresql/src/eventStore/consumers/postgreSQLEventStoreConsumer.handling.int.spec.ts new file mode 100644 index 00000000..00236536 --- /dev/null +++ b/src/packages/emmett-postgresql/src/eventStore/consumers/postgreSQLEventStoreConsumer.handling.int.spec.ts @@ -0,0 +1,388 @@ +import { assertThatArray, type Event } from '@event-driven-io/emmett'; +import { + PostgreSqlContainer, + StartedPostgreSqlContainer, +} from '@testcontainers/postgresql'; +import { after, before, describe, it } from 'node:test'; +import { v4 as uuid } from 'uuid'; +import { + getPostgreSQLEventStore, + type PostgresEventStore, +} from '../postgreSQLEventStore'; +import { postgreSQLEventStoreConsumer } from './postgreSQLEventStoreConsumer'; +import type { PostgreSQLProcessorOptions } from './postgreSQLProcessor'; + +const withDeadline = { timeout: 5000 }; + +void describe('PostgreSQL event store started consumer', () => { + let postgres: StartedPostgreSqlContainer; + let connectionString: string; + let eventStore: PostgresEventStore; + + before(async () => { + postgres = await new PostgreSqlContainer().start(); + connectionString = postgres.getConnectionUri(); + eventStore = getPostgreSQLEventStore(connectionString); + await eventStore.schema.migrate(); + }); + + after(async () => { + try { + await eventStore.close(); + await postgres.stop(); + } catch (error) { + console.log(error); + } + }); + + void describe('eachMessage', () => { + void it( + 'handles all events appended to event store BEFORE processor was started', + withDeadline, + async () => { + // Given + const guestId = uuid(); + const streamName = `guestStay-${guestId}`; + const events: GuestStayEvent[] = [ + { type: 'GuestCheckedIn', data: { guestId } }, + { type: 'GuestCheckedOut', data: { guestId } }, + ]; + const appendResult = await eventStore.appendToStream( + streamName, + events, + ); + + const result: GuestStayEvent[] = []; + + // When + const consumer = postgreSQLEventStoreConsumer({ + connectionString, + }); + consumer.processor({ + processorId: uuid(), + stopAfter: (event) => + event.metadata.globalPosition === + appendResult.lastEventGlobalPosition, + eachMessage: (event) => { + result.push(event); + }, + }); + + try { + await consumer.start(); + + assertThatArray(result).containsElementsMatching(events); + } finally { + await consumer.close(); + } + }, + ); + + void it( + 'handles all events appended to event store AFTER processor was started', + withDeadline, + async () => { + // Given + + const result: GuestStayEvent[] = []; + let stopAfterPosition: bigint | undefined = undefined; + + // When + const consumer = postgreSQLEventStoreConsumer({ + connectionString, + }); + consumer.processor({ + processorId: uuid(), + stopAfter: (event) => + event.metadata.globalPosition === stopAfterPosition, + eachMessage: (event) => { + result.push(event); + }, + }); + + const guestId = uuid(); + const streamName = `guestStay-${guestId}`; + const events: GuestStayEvent[] = [ + { type: 'GuestCheckedIn', data: { guestId } }, + { type: 'GuestCheckedOut', data: { guestId } }, + ]; + + try { + const consumerPromise = consumer.start(); + + const appendResult = await eventStore.appendToStream( + streamName, + events, + ); + stopAfterPosition = appendResult.lastEventGlobalPosition; + + await consumerPromise; + + assertThatArray(result).containsElementsMatching(events); + } finally { + await consumer.close(); + } + }, + ); + + void it( + 'handles ONLY events AFTER provided global position', + withDeadline, + async () => { + // Given + const guestId = uuid(); + const otherGuestId = uuid(); + const streamName = `guestStay-${guestId}`; + + const initialEvents: GuestStayEvent[] = [ + { type: 'GuestCheckedIn', data: { guestId } }, + { type: 'GuestCheckedOut', data: { guestId } }, + ]; + const { lastEventGlobalPosition: startPosition } = + await eventStore.appendToStream(streamName, initialEvents); + + const events: GuestStayEvent[] = [ + { type: 'GuestCheckedIn', data: { guestId: otherGuestId } }, + { type: 'GuestCheckedOut', data: { guestId: otherGuestId } }, + ]; + + const result: GuestStayEvent[] = []; + let stopAfterPosition: bigint | undefined = undefined; + + // When + const consumer = postgreSQLEventStoreConsumer({ + connectionString, + }); + consumer.processor({ + processorId: uuid(), + startFrom: { globalPosition: startPosition }, + stopAfter: (event) => + event.metadata.globalPosition === stopAfterPosition, + eachMessage: (event) => { + result.push(event); + }, + }); + + try { + const consumerPromise = consumer.start(); + + const appendResult = await eventStore.appendToStream( + streamName, + events, + ); + stopAfterPosition = appendResult.lastEventGlobalPosition; + + await consumerPromise; + + assertThatArray(result).containsOnlyElementsMatching(events); + } finally { + await consumer.close(); + } + }, + ); + + void it( + 'handles all events when CURRENT position is NOT stored', + withDeadline, + async () => { + // Given + const guestId = uuid(); + const otherGuestId = uuid(); + const streamName = `guestStay-${guestId}`; + + const initialEvents: GuestStayEvent[] = [ + { type: 'GuestCheckedIn', data: { guestId } }, + { type: 'GuestCheckedOut', data: { guestId } }, + ]; + + await eventStore.appendToStream(streamName, initialEvents); + + const events: GuestStayEvent[] = [ + { type: 'GuestCheckedIn', data: { guestId: otherGuestId } }, + { type: 'GuestCheckedOut', data: { guestId: otherGuestId } }, + ]; + + const result: GuestStayEvent[] = []; + let stopAfterPosition: bigint | undefined = undefined; + + // When + const consumer = postgreSQLEventStoreConsumer({ + connectionString, + }); + consumer.processor({ + processorId: uuid(), + startFrom: 'CURRENT', + stopAfter: (event) => + event.metadata.globalPosition === stopAfterPosition, + eachMessage: (event) => { + result.push(event); + }, + }); + + try { + const consumerPromise = consumer.start(); + + const appendResult = await eventStore.appendToStream( + streamName, + events, + ); + stopAfterPosition = appendResult.lastEventGlobalPosition; + + await consumerPromise; + + assertThatArray(result).containsElementsMatching([ + ...initialEvents, + ...events, + ]); + } finally { + await consumer.close(); + } + }, + ); + + void it( + 'handles only new events when CURRENT position is stored for restarted consumer', + withDeadline, + async () => { + // Given + const guestId = uuid(); + const otherGuestId = uuid(); + const streamName = `guestStay-${guestId}`; + + const initialEvents: GuestStayEvent[] = [ + { type: 'GuestCheckedIn', data: { guestId } }, + { type: 'GuestCheckedOut', data: { guestId } }, + ]; + const { lastEventGlobalPosition } = await eventStore.appendToStream( + streamName, + initialEvents, + ); + + const events: GuestStayEvent[] = [ + { type: 'GuestCheckedIn', data: { guestId: otherGuestId } }, + { type: 'GuestCheckedOut', data: { guestId: otherGuestId } }, + ]; + + let result: GuestStayEvent[] = []; + let stopAfterPosition: bigint | undefined = lastEventGlobalPosition; + + // When + const consumer = postgreSQLEventStoreConsumer({ + connectionString, + }); + consumer.processor({ + processorId: uuid(), + startFrom: 'CURRENT', + stopAfter: (event) => + event.metadata.globalPosition === stopAfterPosition, + eachMessage: (event) => { + result.push(event); + }, + }); + + await consumer.start(); + await consumer.stop(); + + result = []; + + stopAfterPosition = undefined; + + try { + const consumerPromise = consumer.start(); + + const appendResult = await eventStore.appendToStream( + streamName, + events, + ); + stopAfterPosition = appendResult.lastEventGlobalPosition; + + await consumerPromise; + + assertThatArray(result).containsOnlyElementsMatching(events); + } finally { + await consumer.close(); + } + }, + ); + + void it( + 'handles only new events when CURRENT position is stored for a new consumer', + withDeadline, + async () => { + // Given + const guestId = uuid(); + const otherGuestId = uuid(); + const streamName = `guestStay-${guestId}`; + + const initialEvents: GuestStayEvent[] = [ + { type: 'GuestCheckedIn', data: { guestId } }, + { type: 'GuestCheckedOut', data: { guestId } }, + ]; + const { lastEventGlobalPosition } = await eventStore.appendToStream( + streamName, + initialEvents, + ); + + const events: GuestStayEvent[] = [ + { type: 'GuestCheckedIn', data: { guestId: otherGuestId } }, + { type: 'GuestCheckedOut', data: { guestId: otherGuestId } }, + ]; + + let result: GuestStayEvent[] = []; + let stopAfterPosition: bigint | undefined = lastEventGlobalPosition; + + const processorOptions: PostgreSQLProcessorOptions = { + processorId: uuid(), + startFrom: 'CURRENT', + stopAfter: (event) => + event.metadata.globalPosition === stopAfterPosition, + eachMessage: (event) => { + result.push(event); + }, + }; + + // When + const consumer = postgreSQLEventStoreConsumer({ + connectionString, + }); + try { + consumer.processor(processorOptions); + + await consumer.start(); + } finally { + await consumer.close(); + } + + result = []; + + stopAfterPosition = undefined; + + const newConsumer = postgreSQLEventStoreConsumer({ + connectionString, + }); + newConsumer.processor(processorOptions); + + try { + const consumerPromise = newConsumer.start(); + + const appendResult = await eventStore.appendToStream( + streamName, + events, + ); + stopAfterPosition = appendResult.lastEventGlobalPosition; + + await consumerPromise; + + assertThatArray(result).containsOnlyElementsMatching(events); + } finally { + await newConsumer.close(); + } + }, + ); + }); +}); + +type GuestCheckedIn = Event<'GuestCheckedIn', { guestId: string }>; +type GuestCheckedOut = Event<'GuestCheckedOut', { guestId: string }>; + +type GuestStayEvent = GuestCheckedIn | GuestCheckedOut; diff --git a/src/packages/emmett-postgresql/src/eventStore/subscriptions/postgreSQLEventStoreConsumer.int.ts b/src/packages/emmett-postgresql/src/eventStore/consumers/postgreSQLEventStoreConsumer.int.spec.ts similarity index 87% rename from src/packages/emmett-postgresql/src/eventStore/subscriptions/postgreSQLEventStoreConsumer.int.ts rename to src/packages/emmett-postgresql/src/eventStore/consumers/postgreSQLEventStoreConsumer.int.spec.ts index 8fc30ecf..55c96215 100644 --- a/src/packages/emmett-postgresql/src/eventStore/subscriptions/postgreSQLEventStoreConsumer.int.ts +++ b/src/packages/emmett-postgresql/src/eventStore/consumers/postgreSQLEventStoreConsumer.int.spec.ts @@ -19,13 +19,13 @@ import { postgreSQLEventStoreConsumer, type PostgreSQLEventStoreConsumer, } from './postgreSQLEventStoreConsumer'; -import type { PostgreSQLEventStoreSubscription } from './postgreSQLEventStoreSubscription'; +import type { PostgreSQLProcessor } from './postgreSQLProcessor'; void describe('PostgreSQL event store consumer', () => { let postgres: StartedPostgreSqlContainer; let connectionString: string; let eventStore: PostgresEventStore; - const dummySubscription: PostgreSQLEventStoreSubscription = { + const dummyProcessor: PostgreSQLProcessor = { id: uuid(), start: () => Promise.resolve('BEGINNING'), handle: () => Promise.resolve(), @@ -51,7 +51,7 @@ void describe('PostgreSQL event store consumer', () => { void it('creates not-started consumer for the specified connection string', () => { const consumer = postgreSQLEventStoreConsumer({ connectionString, - subscriptions: [dummySubscription], + processors: [dummyProcessor], }); assertFalse(consumer.isRunning); @@ -62,7 +62,7 @@ void describe('PostgreSQL event store consumer', () => { 'postgresql://postgres:postgres@not-existing-database:5432/postgres'; const consumer = postgreSQLEventStoreConsumer({ connectionString: connectionStringToNotExistingDB, - subscriptions: [dummySubscription], + processors: [dummyProcessor], }); assertFalse(consumer.isRunning); @@ -74,7 +74,7 @@ void describe('PostgreSQL event store consumer', () => { beforeEach(() => { consumer = postgreSQLEventStoreConsumer({ connectionString, - subscriptions: [dummySubscription], + processors: [dummyProcessor], }); }); afterEach(() => consumer.stop()); @@ -90,7 +90,7 @@ void describe('PostgreSQL event store consumer', () => { 'postgresql://postgres:postgres@not-existing-database:5432/postgres'; const consumerToNotExistingServer = postgreSQLEventStoreConsumer({ connectionString: connectionStringToNotExistingDB, - subscriptions: [dummySubscription], + processors: [dummyProcessor], }); await assertThrowsAsync( () => consumerToNotExistingServer.start(), @@ -100,17 +100,17 @@ void describe('PostgreSQL event store consumer', () => { ); }); - void it('fails to start if there are no subscriptions', async () => { + void it('fails to start if there are no processors', async () => { const consumerToNotExistingServer = postgreSQLEventStoreConsumer({ connectionString, - subscriptions: [], + processors: [], }); await assertThrowsAsync( () => consumerToNotExistingServer.start(), (error) => { return ( error.message === - 'Cannot start consumer without at least a single subscription' + 'Cannot start consumer without at least a single processor' ); }, ); @@ -136,7 +136,7 @@ void describe('PostgreSQL event store consumer', () => { beforeEach(() => { consumer = postgreSQLEventStoreConsumer({ connectionString, - subscriptions: [dummySubscription], + processors: [dummyProcessor], }); }); afterEach(() => consumer.stop()); diff --git a/src/packages/emmett-postgresql/src/eventStore/consumers/postgreSQLEventStoreConsumer.projections.int.spec.ts b/src/packages/emmett-postgresql/src/eventStore/consumers/postgreSQLEventStoreConsumer.projections.int.spec.ts new file mode 100644 index 00000000..60cda955 --- /dev/null +++ b/src/packages/emmett-postgresql/src/eventStore/consumers/postgreSQLEventStoreConsumer.projections.int.spec.ts @@ -0,0 +1,473 @@ +import { assertDeepEqual, type ReadEvent } from '@event-driven-io/emmett'; +import { + pongoClient, + type PongoClient, + type PongoCollection, +} from '@event-driven-io/pongo'; +import { + PostgreSqlContainer, + StartedPostgreSqlContainer, +} from '@testcontainers/postgresql'; +import { after, before, describe, it } from 'node:test'; +import { v4 as uuid } from 'uuid'; +import type { + ProductItemAdded, + ShoppingCartConfirmed, +} from '../../testing/shoppingCart.domain'; +import { + getPostgreSQLEventStore, + type PostgresEventStore, +} from '../postgreSQLEventStore'; +import { pongoSingleStreamProjection } from '../projections'; +import { postgreSQLEventStoreConsumer } from './postgreSQLEventStoreConsumer'; +import type { PostgreSQLProcessorOptions } from './postgreSQLProcessor'; + +const withDeadline = { timeout: 5000 }; + +void describe('PostgreSQL event store started consumer', () => { + let postgres: StartedPostgreSqlContainer; + let connectionString: string; + let eventStore: PostgresEventStore; + let pongo: PongoClient; + let summaries: PongoCollection; + const productItem = { price: 10, productId: uuid(), quantity: 10 }; + const confirmedAt = new Date(); + + before(async () => { + postgres = await new PostgreSqlContainer().start(); + connectionString = postgres.getConnectionUri(); + eventStore = getPostgreSQLEventStore(connectionString); + pongo = pongoClient(connectionString); + summaries = pongo.db().collection(shoppingCartsSummaryCollectionName); + await eventStore.schema.migrate(); + }); + + after(async () => { + try { + await eventStore.close(); + await pongo.close(); + await postgres.stop(); + } catch (error) { + console.log(error); + } + }); + + void describe('eachMessage', () => { + void it( + 'handles all events appended to event store BEFORE processor was started', + withDeadline, + async () => { + // Given + const shoppingCartId = `shoppingCart:${uuid()}`; + const streamName = `shopping_cart-${shoppingCartId}`; + const events: ShoppingCartSummaryEvent[] = [ + { type: 'ProductItemAdded', data: { productItem } }, + { type: 'ShoppingCartConfirmed', data: { confirmedAt } }, + ]; + const appendResult = await eventStore.appendToStream( + streamName, + events, + ); + + // When + const consumer = postgreSQLEventStoreConsumer({ + connectionString, + }); + consumer.processor({ + processorId: uuid(), + projection: shoppingCartsSummaryProjection, + stopAfter: (event) => + event.metadata.globalPosition === + appendResult.lastEventGlobalPosition, + }); + + try { + await consumer.start(); + + const summary = await summaries.findOne({ _id: streamName }); + + assertDeepEqual(summary, { + _id: streamName, + status: 'confirmed', + _version: 2n, + productItemsCount: productItem.quantity, + }); + } finally { + await consumer.close(); + } + }, + ); + + void it( + 'handles all events appended to event store AFTER processor was started', + withDeadline, + async () => { + // Given + let stopAfterPosition: bigint | undefined = undefined; + + // When + const consumer = postgreSQLEventStoreConsumer({ + connectionString, + }); + consumer.processor({ + processorId: uuid(), + projection: shoppingCartsSummaryProjection, + stopAfter: (event) => + event.metadata.globalPosition === stopAfterPosition, + }); + + const shoppingCartId = `shoppingCart:${uuid()}`; + const streamName = `shopping_cart-${shoppingCartId}`; + const events: ShoppingCartSummaryEvent[] = [ + { + type: 'ProductItemAdded', + data: { + productItem, + }, + }, + { + type: 'ShoppingCartConfirmed', + data: { confirmedAt }, + }, + ]; + + try { + const consumerPromise = consumer.start(); + + const appendResult = await eventStore.appendToStream( + streamName, + events, + ); + stopAfterPosition = appendResult.lastEventGlobalPosition; + + await consumerPromise; + + const summary = await summaries.findOne({ _id: streamName }); + + assertDeepEqual(summary, { + _id: streamName, + status: 'confirmed', + _version: 2n, + productItemsCount: productItem.quantity, + }); + } finally { + await consumer.close(); + } + }, + ); + + void it( + 'handles ONLY events AFTER provided global position', + withDeadline, + async () => { + // Given + const shoppingCartId = `shoppingCart:${uuid()}`; + const streamName = `shopping_cart-${shoppingCartId}`; + + const initialEvents: ShoppingCartSummaryEvent[] = [ + { type: 'ProductItemAdded', data: { productItem } }, + { type: 'ProductItemAdded', data: { productItem } }, + ]; + const { lastEventGlobalPosition: startPosition } = + await eventStore.appendToStream(streamName, initialEvents); + + const events: ShoppingCartSummaryEvent[] = [ + { type: 'ProductItemAdded', data: { productItem } }, + { + type: 'ShoppingCartConfirmed', + data: { confirmedAt }, + }, + ]; + + let stopAfterPosition: bigint | undefined = undefined; + + // When + const consumer = postgreSQLEventStoreConsumer({ + connectionString, + }); + consumer.processor({ + processorId: uuid(), + projection: shoppingCartsSummaryProjection, + startFrom: { globalPosition: startPosition }, + stopAfter: (event) => + event.metadata.globalPosition === stopAfterPosition, + }); + + try { + const consumerPromise = consumer.start(); + + const appendResult = await eventStore.appendToStream( + streamName, + events, + ); + stopAfterPosition = appendResult.lastEventGlobalPosition; + + await consumerPromise; + + const summary = await summaries.findOne({ _id: streamName }); + + assertDeepEqual(summary, { + _id: streamName, + status: 'confirmed', + _version: 2n, + productItemsCount: productItem.quantity, + }); + } finally { + await consumer.close(); + } + }, + ); + + void it( + 'handles all events when CURRENT position is NOT stored', + withDeadline, + async () => { + // Given + const shoppingCartId = `shoppingCart:${uuid()}`; + const streamName = `shopping_cart-${shoppingCartId}`; + + const initialEvents: ShoppingCartSummaryEvent[] = [ + { type: 'ProductItemAdded', data: { productItem } }, + { type: 'ProductItemAdded', data: { productItem } }, + ]; + + await eventStore.appendToStream(streamName, initialEvents); + + const events: ShoppingCartSummaryEvent[] = [ + { type: 'ProductItemAdded', data: { productItem } }, + { + type: 'ShoppingCartConfirmed', + data: { confirmedAt }, + }, + ]; + + let stopAfterPosition: bigint | undefined = undefined; + + // When + const consumer = postgreSQLEventStoreConsumer({ + connectionString, + }); + consumer.processor({ + processorId: uuid(), + projection: shoppingCartsSummaryProjection, + startFrom: 'CURRENT', + stopAfter: (event) => + event.metadata.globalPosition === stopAfterPosition, + }); + + try { + const consumerPromise = consumer.start(); + + const appendResult = await eventStore.appendToStream( + streamName, + events, + ); + stopAfterPosition = appendResult.lastEventGlobalPosition; + + await consumerPromise; + + const summary = await summaries.findOne({ _id: streamName }); + + assertDeepEqual(summary, { + _id: streamName, + status: 'confirmed', + _version: 4n, + productItemsCount: productItem.quantity * 3, + }); + } finally { + await consumer.close(); + } + }, + ); + + void it( + 'handles only new events when CURRENT position is stored for restarted consumer', + withDeadline, + async () => { + // Given + const shoppingCartId = `shoppingCart:${uuid()}`; + const streamName = `shopping_cart-${shoppingCartId}`; + + const initialEvents: ShoppingCartSummaryEvent[] = [ + { type: 'ProductItemAdded', data: { productItem } }, + { type: 'ProductItemAdded', data: { productItem } }, + ]; + const { lastEventGlobalPosition } = await eventStore.appendToStream( + streamName, + initialEvents, + ); + + const events: ShoppingCartSummaryEvent[] = [ + { type: 'ProductItemAdded', data: { productItem } }, + { + type: 'ShoppingCartConfirmed', + data: { confirmedAt }, + }, + ]; + + let stopAfterPosition: bigint | undefined = lastEventGlobalPosition; + + // When + const consumer = postgreSQLEventStoreConsumer({ + connectionString, + }); + consumer.processor({ + processorId: uuid(), + projection: shoppingCartsSummaryProjection, + startFrom: 'CURRENT', + stopAfter: (event) => + event.metadata.globalPosition === stopAfterPosition, + }); + + await consumer.start(); + await consumer.stop(); + + stopAfterPosition = undefined; + + try { + const consumerPromise = consumer.start(); + + const appendResult = await eventStore.appendToStream( + streamName, + events, + ); + stopAfterPosition = appendResult.lastEventGlobalPosition; + + await consumerPromise; + + const summary = await summaries.findOne({ _id: streamName }); + + assertDeepEqual(summary, { + _id: streamName, + status: 'confirmed', + _version: 4n, + productItemsCount: productItem.quantity * 3, + }); + } finally { + await consumer.close(); + } + }, + ); + + void it( + 'handles only new events when CURRENT position is stored for a new consumer', + withDeadline, + async () => { + // Given + const shoppingCartId = `shoppingCart:${uuid()}`; + const streamName = `shopping_cart-${shoppingCartId}`; + + const initialEvents: ShoppingCartSummaryEvent[] = [ + { type: 'ProductItemAdded', data: { productItem } }, + { type: 'ProductItemAdded', data: { productItem } }, + ]; + const { lastEventGlobalPosition } = await eventStore.appendToStream( + streamName, + initialEvents, + ); + + const events: ShoppingCartSummaryEvent[] = [ + { type: 'ProductItemAdded', data: { productItem } }, + { + type: 'ShoppingCartConfirmed', + data: { confirmedAt }, + }, + ]; + + let stopAfterPosition: bigint | undefined = lastEventGlobalPosition; + + const processorOptions: PostgreSQLProcessorOptions = + { + processorId: uuid(), + projection: shoppingCartsSummaryProjection, + startFrom: 'CURRENT', + stopAfter: (event) => + event.metadata.globalPosition === stopAfterPosition, + }; + + // When + const consumer = postgreSQLEventStoreConsumer({ + connectionString, + }); + try { + consumer.processor(processorOptions); + + await consumer.start(); + } finally { + await consumer.close(); + } + + stopAfterPosition = undefined; + + const newConsumer = postgreSQLEventStoreConsumer({ + connectionString, + }); + newConsumer.processor(processorOptions); + + try { + const consumerPromise = newConsumer.start(); + + const appendResult = await eventStore.appendToStream( + streamName, + events, + ); + stopAfterPosition = appendResult.lastEventGlobalPosition; + + await consumerPromise; + + const summary = await summaries.findOne({ _id: streamName }); + + assertDeepEqual(summary, { + _id: streamName, + status: 'confirmed', + _version: 4n, + productItemsCount: productItem.quantity * 3, + }); + } finally { + await newConsumer.close(); + } + }, + ); + }); +}); + +type ShoppingCartSummary = { + _id?: string; + productItemsCount: number; + status: string; +}; + +const shoppingCartsSummaryCollectionName = 'shoppingCartsSummary'; + +export type ShoppingCartSummaryEvent = ProductItemAdded | ShoppingCartConfirmed; + +const evolve = ( + document: ShoppingCartSummary, + { type, data }: ReadEvent, +): ShoppingCartSummary => { + switch (type) { + case 'ProductItemAdded': + return { + ...document, + productItemsCount: + document.productItemsCount + data.productItem.quantity, + }; + case 'ShoppingCartConfirmed': + return { + ...document, + status: 'confirmed', + }; + default: + return document; + } +}; + +const shoppingCartsSummaryProjection = pongoSingleStreamProjection({ + collectionName: shoppingCartsSummaryCollectionName, + evolve, + canHandle: ['ProductItemAdded', 'ShoppingCartConfirmed'], + initialState: () => ({ + status: 'pending', + productItemsCount: 0, + }), +}); diff --git a/src/packages/emmett-postgresql/src/eventStore/consumers/postgreSQLEventStoreConsumer.ts b/src/packages/emmett-postgresql/src/eventStore/consumers/postgreSQLEventStoreConsumer.ts new file mode 100644 index 00000000..e17a1f40 --- /dev/null +++ b/src/packages/emmett-postgresql/src/eventStore/consumers/postgreSQLEventStoreConsumer.ts @@ -0,0 +1,156 @@ +import { dumbo, type Dumbo } from '@event-driven-io/dumbo'; +import { EmmettError, type Event } from '@event-driven-io/emmett'; +import { + DefaultPostgreSQLEventStoreProcessorBatchSize, + DefaultPostgreSQLEventStoreProcessorPullingFrequencyInMs, + postgreSQLEventStoreMessageBatchPuller, + zipPostgreSQLEventStoreMessageBatchPullerStartFrom, + type PostgreSQLEventStoreMessageBatchPuller, + type PostgreSQLEventStoreMessagesBatchHandler, +} from './messageBatchProcessing'; +import { + postgreSQLProcessor, + type PostgreSQLProcessor, + type PostgreSQLProcessorOptions, +} from './postgreSQLProcessor'; + +export type PostgreSQLEventStoreConsumerConfig< + ConsumerEventType extends Event = Event, +> = { + processors?: PostgreSQLProcessor[]; + pulling?: { + batchSize?: number; + pullingFrequencyInMs?: number; + }; +}; +export type PostgreSQLEventStoreConsumerOptions< + ConsumerEventType extends Event = Event, +> = PostgreSQLEventStoreConsumerConfig & { + connectionString: string; + pool?: Dumbo; +}; + +export type PostgreSQLEventStoreConsumer< + ConsumerEventType extends Event = Event, +> = Readonly<{ + isRunning: boolean; + processors: PostgreSQLProcessor[]; + processor: ( + options: PostgreSQLProcessorOptions, + ) => PostgreSQLProcessor; + start: () => Promise; + stop: () => Promise; + close: () => Promise; +}>; + +export const postgreSQLEventStoreConsumer = < + ConsumerEventType extends Event = Event, +>( + options: PostgreSQLEventStoreConsumerOptions, +): PostgreSQLEventStoreConsumer => { + let isRunning = false; + const { pulling } = options; + const processors = options.processors ?? []; + + let start: Promise; + + let currentMessagePuller: PostgreSQLEventStoreMessageBatchPuller | undefined; + + const pool = options.pool + ? options.pool + : dumbo({ connectionString: options.connectionString }); + + const eachBatch: PostgreSQLEventStoreMessagesBatchHandler< + ConsumerEventType + > = async (messagesBatch) => { + const activeProcessors = processors.filter((s) => s.isActive); + + if (activeProcessors.length === 0) + return { + type: 'STOP', + reason: 'No active processors', + }; + + const result = await Promise.allSettled( + activeProcessors.map((s) => { + // TODO: Add here filtering to only pass messages that can be handled by processor + return s.handle(messagesBatch, { + pool, + connectionString: options.connectionString, + }); + }), + ); + + return result.some( + (r) => r.status === 'fulfilled' && r.value?.type !== 'STOP', + ) + ? undefined + : { + type: 'STOP', + }; + }; + + const messagePooler = (currentMessagePuller = + postgreSQLEventStoreMessageBatchPuller({ + executor: pool.execute, + eachBatch, + batchSize: + pulling?.batchSize ?? DefaultPostgreSQLEventStoreProcessorBatchSize, + pullingFrequencyInMs: + pulling?.pullingFrequencyInMs ?? + DefaultPostgreSQLEventStoreProcessorPullingFrequencyInMs, + })); + + const stop = async () => { + if (!isRunning) return; + isRunning = false; + if (currentMessagePuller) { + await currentMessagePuller.stop(); + currentMessagePuller = undefined; + } + await start; + }; + + return { + processors, + get isRunning() { + return isRunning; + }, + processor: ( + options: PostgreSQLProcessorOptions, + ): PostgreSQLProcessor => { + const processor = postgreSQLProcessor(options); + + processors.push(processor); + + return processor; + }, + start: () => { + if (isRunning) return start; + + start = (async () => { + if (processors.length === 0) + return Promise.reject( + new EmmettError( + 'Cannot start consumer without at least a single processor', + ), + ); + + isRunning = true; + + const startFrom = zipPostgreSQLEventStoreMessageBatchPullerStartFrom( + await Promise.all(processors.map((o) => o.start(pool.execute))), + ); + + return messagePooler.start({ startFrom }); + })(); + + return start; + }, + stop, + close: async () => { + await stop(); + await pool.close(); + }, + }; +}; diff --git a/src/packages/emmett-postgresql/src/eventStore/consumers/postgreSQLProcessor.ts b/src/packages/emmett-postgresql/src/eventStore/consumers/postgreSQLProcessor.ts new file mode 100644 index 00000000..dd818a53 --- /dev/null +++ b/src/packages/emmett-postgresql/src/eventStore/consumers/postgreSQLProcessor.ts @@ -0,0 +1,352 @@ +import { + dumbo, + type Dumbo, + type NodePostgresClient, + type NodePostgresClientConnection, + type NodePostgresConnector, + type NodePostgresPool, + type NodePostgresPoolClientConnection, + type NodePostgresTransaction, + type SQLExecutor, +} from '@event-driven-io/dumbo'; +import { + EmmettError, + type Event, + type ReadEvent, + type ReadEventMetadataWithGlobalPosition, +} from '@event-driven-io/emmett'; +import pg from 'pg'; +import type { PostgreSQLProjectionDefinition } from '../projections'; +import { readProcessorCheckpoint, storeProcessorCheckpoint } from '../schema'; +import type { PostgreSQLEventStoreMessageBatchPullerStartFrom } from './messageBatchProcessing'; + +export type PostgreSQLProcessorEventsBatch = { + messages: ReadEvent[]; +}; + +export type PostgreSQLProcessorHandlerContext = { + execute: SQLExecutor; + connection: { + connectionString: string; + client: NodePostgresClient; + transaction: NodePostgresTransaction; + pool: Dumbo; + }; +}; + +export type PostgreSQLProcessor = { + id: string; + start: ( + execute: SQLExecutor, + ) => Promise; + isActive: boolean; + handle: ( + messagesBatch: PostgreSQLProcessorEventsBatch, + context: { pool?: Dumbo; connectionString?: string }, + ) => Promise; +}; + +export const PostgreSQLProcessor = { + result: { + skip: (options?: { + reason?: string; + }): PostgreSQLProcessorMessageHandlerResult => ({ + type: 'SKIP', + ...(options ?? {}), + }), + stop: (options?: { + reason?: string; + error?: EmmettError; + }): PostgreSQLProcessorMessageHandlerResult => ({ + type: 'STOP', + ...(options ?? {}), + }), + }, +}; + +export type PostgreSQLProcessorMessageHandlerResult = + | void + | { type: 'SKIP'; reason?: string } + | { type: 'STOP'; reason?: string; error?: EmmettError }; + +export type PostgreSQLProcessorEachMessageHandler< + EventType extends Event = Event, +> = ( + event: ReadEvent, + context: PostgreSQLProcessorHandlerContext, +) => + | Promise + | PostgreSQLProcessorMessageHandlerResult; + +export type PostgreSQLProcessorEachBatchHandler< + EventType extends Event = Event, +> = ( + event: ReadEvent[], + context: PostgreSQLProcessorHandlerContext, +) => + | Promise + | PostgreSQLProcessorMessageHandlerResult; + +export type PostgreSQLProcessorStartFrom = + | PostgreSQLEventStoreMessageBatchPullerStartFrom + | 'CURRENT'; + +type PostgreSQLProcessorPooledOptions = + | { + connector?: NodePostgresConnector; + database?: string; + pooled: true; + pool: pg.Pool; + } + | { + connector?: NodePostgresConnector; + database?: string; + pool: pg.Pool; + } + | { + connector?: NodePostgresConnector; + database?: string; + pooled: true; + } + | { + connector?: NodePostgresConnector; + database?: string; + }; + +type PostgreSQLProcessorNotPooledOptions = + | { + connector?: NodePostgresConnector; + database?: string; + pooled: false; + client: pg.Client; + } + | { + connector?: NodePostgresConnector; + database?: string; + client: pg.Client; + } + | { + connector?: NodePostgresConnector; + database?: string; + pooled: false; + } + | { + connector?: NodePostgresConnector; + database?: string; + connection: + | NodePostgresPoolClientConnection + | NodePostgresClientConnection; + pooled?: false; + } + | { + connector?: NodePostgresConnector; + database?: string; + dumbo: NodePostgresPool; + pooled?: false; + }; + +export type PostgreSQLProcessorConnectionOptions = { + connectionString: string; +} & (PostgreSQLProcessorPooledOptions | PostgreSQLProcessorNotPooledOptions); + +export type GenericPostgreSQLProcessorOptions = + { + processorId: string; + version?: number; + partition?: string; + startFrom?: PostgreSQLProcessorStartFrom; + stopAfter?: ( + message: ReadEvent, + ) => boolean; + eachMessage: PostgreSQLProcessorEachMessageHandler; + connectionOptions?: PostgreSQLProcessorConnectionOptions; + // TODO: Add eachBatch + }; + +export type PostgreSQLProjectionProcessorOptions< + EventType extends Event = Event, +> = { + processorId?: string; + version?: number; + projection: PostgreSQLProjectionDefinition; + partition?: string; + startFrom?: PostgreSQLProcessorStartFrom; + stopAfter?: ( + message: ReadEvent, + ) => boolean; + connectionOptions?: PostgreSQLProcessorConnectionOptions; +}; + +export type PostgreSQLProcessorOptions = + | GenericPostgreSQLProcessorOptions + | PostgreSQLProjectionProcessorOptions; + +const genericPostgreSQLProcessor = ( + options: GenericPostgreSQLProcessorOptions, +): PostgreSQLProcessor => { + const { eachMessage } = options; + let isActive = true; + //let lastProcessedPosition: bigint | null = null; + + const poolOptions = { + ...(options.connectionOptions ? options.connectionOptions : {}), + }; + const processorConnectionString = + 'connectionString' in poolOptions ? poolOptions.connectionString : null; + + const processorPool = + 'dumbo' in poolOptions + ? (poolOptions.dumbo as NodePostgresPool) + : processorConnectionString + ? dumbo({ + connectionString: processorConnectionString, + ...poolOptions, + }) + : null; + + const getPool = (context: { + pool?: Dumbo; + connectionString?: string; + }): { pool: Dumbo; connectionString: string } => { + const connectionString = + processorConnectionString ?? context.connectionString; + + if (!connectionString) + throw new EmmettError( + `PostgreSQL processor '${options.processorId}' is missing connection string. Ensure that you passed it through options`, + ); + + const pool = + (!processorConnectionString || + connectionString == processorConnectionString + ? context?.pool + : processorPool) ?? processorPool; + + if (!pool) + throw new EmmettError( + `PostgreSQL processor '${options.processorId}' is missing connection string. Ensure that you passed it through options`, + ); + + return { + connectionString, + pool: pool, + }; + }; + + return { + id: options.processorId, + start: async ( + execute: SQLExecutor, + ): Promise => { + isActive = true; + if (options.startFrom !== 'CURRENT') return options.startFrom; + + const { lastProcessedPosition } = await readProcessorCheckpoint(execute, { + processorId: options.processorId, + partition: options.partition, + }); + + if (lastProcessedPosition === null) return 'BEGINNING'; + + return { globalPosition: lastProcessedPosition }; + }, + get isActive() { + return isActive; + }, + handle: async ( + { messages }, + context, + ): Promise => { + if (!isActive) return; + + const { pool, connectionString } = getPool(context); + + return pool.withTransaction(async (transaction) => { + let result: PostgreSQLProcessorMessageHandlerResult | undefined = + undefined; + + let lastProcessedPosition: bigint | null = null; + + for (const message of messages) { + const typedMessage = message as ReadEvent< + EventType, + ReadEventMetadataWithGlobalPosition + >; + + const client = + (await transaction.connection.open()) as NodePostgresClient; + + const messageProcessingResult = await eachMessage(typedMessage, { + execute: transaction.execute, + connection: { + connectionString, + pool, + transaction: transaction, + client, + }, + }); + + // TODO: Add correct handling of the storing checkpoint + await storeProcessorCheckpoint(transaction.execute, { + processorId: options.processorId, + version: options.version, + lastProcessedPosition, + newPosition: typedMessage.metadata.globalPosition, + partition: options.partition, + }); + + lastProcessedPosition = typedMessage.metadata.globalPosition; + + if ( + messageProcessingResult && + messageProcessingResult.type === 'STOP' + ) { + isActive = false; + result = messageProcessingResult; + break; + } + + if (options.stopAfter && options.stopAfter(typedMessage)) { + isActive = false; + result = { type: 'STOP', reason: 'Stop condition reached' }; + break; + } + + if ( + messageProcessingResult && + messageProcessingResult.type === 'SKIP' + ) + continue; + } + + return result; + }); + }, + }; +}; + +export const postgreSQLProjectionProcessor = ( + options: PostgreSQLProjectionProcessorOptions, +): PostgreSQLProcessor => { + const projection = options.projection; + + return genericPostgreSQLProcessor({ + processorId: options.processorId ?? `projection:${projection.name}`, + eachMessage: async (event, context) => { + if (!projection.canHandle.includes(event.type)) return; + + await projection.handle([event], context); + }, + ...options, + }); +}; + +export const postgreSQLProcessor = ( + options: PostgreSQLProcessorOptions, +): PostgreSQLProcessor => { + if ('projection' in options) { + return postgreSQLProjectionProcessor(options); + } + + return genericPostgreSQLProcessor(options); +}; diff --git a/src/packages/emmett-postgresql/src/eventStore/index.ts b/src/packages/emmett-postgresql/src/eventStore/index.ts index d629e1f1..1a6f46db 100644 --- a/src/packages/emmett-postgresql/src/eventStore/index.ts +++ b/src/packages/emmett-postgresql/src/eventStore/index.ts @@ -1,4 +1,4 @@ export * from './postgreSQLEventStore'; export * from './projections'; export * from './schema'; -export * from './subscriptions'; +export * from './consumers'; diff --git a/src/packages/emmett-postgresql/src/eventStore/postgreSQLEventStore.ts b/src/packages/emmett-postgresql/src/eventStore/postgreSQLEventStore.ts index 7a2eb307..2cbf9a8b 100644 --- a/src/packages/emmett-postgresql/src/eventStore/postgreSQLEventStore.ts +++ b/src/packages/emmett-postgresql/src/eventStore/postgreSQLEventStore.ts @@ -25,6 +25,11 @@ import { type ReadStreamResult, } from '@event-driven-io/emmett'; import pg from 'pg'; +import { + postgreSQLEventStoreConsumer, + type PostgreSQLEventStoreConsumer, + type PostgreSQLEventStoreConsumerConfig, +} from './consumers'; import { handleProjections, type PostgreSQLProjectionHandlerContext, @@ -34,7 +39,7 @@ import { createEventStoreSchema, readStream, schemaSQL, - type AppendToStreamPreCommitHook, + type AppendToStreamBeforeCommitHook, } from './schema'; export interface PostgresEventStore @@ -45,6 +50,9 @@ export interface PostgresEventStore events: EventType[], options?: AppendToStreamOptions, ): Promise; + consumer( + options?: PostgreSQLEventStoreConsumerConfig, + ): PostgreSQLEventStoreConsumer; close(): Promise; schema: { sql(): string; @@ -172,13 +180,14 @@ export const getPostgreSQLEventStore = ( .filter(({ type }) => type === 'inline') .map(({ projection }) => projection); - const preCommitHook: AppendToStreamPreCommitHook | undefined = + const beforeCommitHook: AppendToStreamBeforeCommitHook | undefined = inlineProjections.length > 0 ? (events, { transaction }) => handleProjections({ projections: inlineProjections, connection: { connectionString, + pool, transaction, }, // TODO: Add proper handling of global data @@ -258,7 +267,7 @@ export const getPostgreSQLEventStore = ( events, { ...options, - preCommitHook, + beforeCommitHook, }, ); @@ -275,6 +284,14 @@ export const getPostgreSQLEventStore = ( appendResult.nextStreamPosition >= BigInt(events.length), }; }, + consumer: ( + options?: PostgreSQLEventStoreConsumerConfig, + ): PostgreSQLEventStoreConsumer => + postgreSQLEventStoreConsumer({ + ...(options ?? {}), + pool, + connectionString, + }), close: () => pool.close(), async withSession( diff --git a/src/packages/emmett-postgresql/src/eventStore/projections/index.ts b/src/packages/emmett-postgresql/src/eventStore/projections/index.ts index a1c304fc..a4f2e54e 100644 --- a/src/packages/emmett-postgresql/src/eventStore/projections/index.ts +++ b/src/packages/emmett-postgresql/src/eventStore/projections/index.ts @@ -1,4 +1,5 @@ import { + type Dumbo, type NodePostgresClient, type NodePostgresTransaction, type SQL, @@ -8,17 +9,20 @@ import { projection, type CanHandle, type Event, + type ProjectionDefinition, type ProjectionHandler, type ReadEvent, - type TypedProjectionDefinition, } from '@event-driven-io/emmett'; import type { PostgresReadEventMetadata } from '../postgreSQLEventStore'; export type PostgreSQLProjectionHandlerContext = { - connectionString: string; - client: NodePostgresClient; execute: SQLExecutor; - transaction: NodePostgresTransaction; + connection: { + connectionString: string; + client: NodePostgresClient; + transaction: NodePostgresTransaction; + pool: Dumbo; + }; }; export type PostgreSQLProjectionHandler< @@ -31,40 +35,32 @@ export type PostgreSQLProjectionHandler< PostgreSQLProjectionHandlerContext >; -export type PostgreSQLProjectionDefinition< - EventType extends Event = Event, - EventMetaDataType extends - PostgresReadEventMetadata = PostgresReadEventMetadata, -> = TypedProjectionDefinition< - EventType, - EventMetaDataType, - PostgreSQLProjectionHandlerContext ->; +export type PostgreSQLProjectionDefinition = + ProjectionDefinition< + EventType, + PostgresReadEventMetadata, + PostgreSQLProjectionHandlerContext + >; -export type ProjectionHandlerOptions< +export type PostgreSQLProjectionHandlerOptions< EventType extends Event = Event, - EventMetaDataType extends - PostgresReadEventMetadata = PostgresReadEventMetadata, > = { - events: ReadEvent[]; - projections: PostgreSQLProjectionDefinition[]; + events: ReadEvent[]; + projections: PostgreSQLProjectionDefinition[]; connection: { connectionString: string; transaction: NodePostgresTransaction; + pool: Dumbo; }; }; -export const handleProjections = async < - EventType extends Event = Event, - EventMetaDataType extends - PostgresReadEventMetadata = PostgresReadEventMetadata, ->( - options: ProjectionHandlerOptions, +export const handleProjections = async ( + options: PostgreSQLProjectionHandlerOptions, ): Promise => { const { projections: allProjections, events, - connection: { transaction, connectionString }, + connection: { pool, transaction, connectionString }, } = options; const eventTypes = events.map((e) => e.type); @@ -77,27 +73,25 @@ export const handleProjections = async < for (const projection of projections) { await projection.handle(events, { - connectionString, - client, - transaction, + connection: { + connectionString, + pool, + client, + transaction, + }, execute: transaction.execute, }); } }; -export const postgreSQLProjection = < - EventType extends Event, - EventMetaDataType extends - PostgresReadEventMetadata = PostgresReadEventMetadata, ->( - definition: PostgreSQLProjectionDefinition, -): PostgreSQLProjectionDefinition => +export const postgreSQLProjection = ( + definition: PostgreSQLProjectionDefinition, +): PostgreSQLProjectionDefinition => projection< EventType, - EventMetaDataType, - PostgreSQLProjectionHandlerContext, - PostgreSQLProjectionDefinition - >(definition) as PostgreSQLProjectionDefinition; + PostgresReadEventMetadata, + PostgreSQLProjectionHandlerContext + >(definition); export const postgreSQLRawBatchSQLProjection = ( handle: ( @@ -105,7 +99,7 @@ export const postgreSQLRawBatchSQLProjection = ( context: PostgreSQLProjectionHandlerContext, ) => Promise | SQL[], ...canHandle: CanHandle -): PostgreSQLProjectionDefinition => +): PostgreSQLProjectionDefinition => postgreSQLProjection({ canHandle, handle: async (events, context) => { @@ -121,7 +115,7 @@ export const postgreSQLRawSQLProjection = ( context: PostgreSQLProjectionHandlerContext, ) => Promise | SQL, ...canHandle: CanHandle -): PostgreSQLProjectionDefinition => +): PostgreSQLProjectionDefinition => postgreSQLRawBatchSQLProjection( async (events, context) => { const sqls: SQL[] = []; diff --git a/src/packages/emmett-postgresql/src/eventStore/projections/pongo/projections.ts b/src/packages/emmett-postgresql/src/eventStore/projections/pongo/projections.ts index 4c2a22db..68aad923 100644 --- a/src/packages/emmett-postgresql/src/eventStore/projections/pongo/projections.ts +++ b/src/packages/emmett-postgresql/src/eventStore/projections/pongo/projections.ts @@ -59,33 +59,24 @@ export type PongoDocumentEvolve< | PongoWithNotNullDocumentEvolve | PongoWithNullableDocumentEvolve; -export type PongoProjectionOptions< - EventType extends Event, - EventMetaDataType extends - PostgresReadEventMetadata = PostgresReadEventMetadata, -> = { +export type PongoProjectionOptions = { handle: ( - events: ReadEvent[], + events: ReadEvent[], context: PongoProjectionHandlerContext, ) => Promise; canHandle: CanHandle; }; -export const pongoProjection = < - EventType extends Event, - EventMetaDataType extends - PostgresReadEventMetadata = PostgresReadEventMetadata, ->({ +export const pongoProjection = ({ handle, canHandle, -}: PongoProjectionOptions< - EventType, - EventMetaDataType ->): PostgreSQLProjectionDefinition => - postgreSQLProjection({ +}: PongoProjectionOptions): PostgreSQLProjectionDefinition => + postgreSQLProjection({ canHandle, handle: async (events, context) => { - const { connectionString, client } = context; + const { + connection: { connectionString, client }, + } = context; const pongo = pongoClient(connectionString, { connectionOptions: { client }, }); @@ -135,7 +126,7 @@ export const pongoMultiStreamProjection = < EventType, EventMetaDataType >, -): PostgreSQLProjectionDefinition => { +): PostgreSQLProjectionDefinition => { const { collectionName, getDocumentId, canHandle } = options; return pongoProjection({ @@ -167,6 +158,7 @@ export type PongoSingleStreamProjectionOptions< PostgresReadEventMetadata = PostgresReadEventMetadata, > = { canHandle: CanHandle; + getDocumentId?: (event: ReadEvent) => string; collectionName: string; } & ( @@ -198,9 +190,10 @@ export const pongoSingleStreamProjection = < EventType, EventMetaDataType >, -): PostgreSQLProjectionDefinition => { +): PostgreSQLProjectionDefinition => { return pongoMultiStreamProjection({ ...options, - getDocumentId: (event) => event.metadata.streamName, + getDocumentId: + options.getDocumentId ?? ((event) => event.metadata.streamName), }); }; diff --git a/src/packages/emmett-postgresql/src/eventStore/projections/postgresProjection.customid.int.spec.ts b/src/packages/emmett-postgresql/src/eventStore/projections/postgresProjection.customid.int.spec.ts new file mode 100644 index 00000000..23fe7521 --- /dev/null +++ b/src/packages/emmett-postgresql/src/eventStore/projections/postgresProjection.customid.int.spec.ts @@ -0,0 +1,115 @@ +import type { Event } from '@event-driven-io/emmett'; +import { + PostgreSqlContainer, + StartedPostgreSqlContainer, +} from '@testcontainers/postgresql'; +import { after, before, beforeEach, describe, it } from 'node:test'; +import { v4 as uuid } from 'uuid'; +import { + expectPongoDocuments, + pongoSingleStreamProjection, + PostgreSQLProjectionSpec, +} from '.'; +import type { PricedProductItem } from '../../testing/shoppingCart.domain'; + +export type ProductItemAdded = Event< + 'ProductItemAdded', + { productItem: PricedProductItem; shoppingCartId: string } +>; + +void describe('Postgres Projections', () => { + let postgres: StartedPostgreSqlContainer; + let connectionString: string; + let given: PostgreSQLProjectionSpec; + let shoppingCartId: string; + let streamName: string; + + before(async () => { + postgres = await new PostgreSqlContainer().start(); + connectionString = postgres.getConnectionUri(); + + given = PostgreSQLProjectionSpec.for({ + projection: shoppingCartShortInfoProjection, + connectionString, + }); + }); + + beforeEach(() => { + shoppingCartId = uuid(); + streamName = `shoppingCart:${shoppingCartId}`; + }); + + after(async () => { + try { + await postgres.stop(); + } catch (error) { + console.log(error); + } + }); + + void it('uses custom document id instead of stream name assigned in projection evolve', () => + given([]) + .when([ + { + type: 'ProductItemAdded', + data: { + productItem: { price: 100, productId: 'shoes', quantity: 100 }, + shoppingCartId, + }, + metadata: { + streamName, + }, + }, + ]) + .then( + expectPongoDocuments + .fromCollection( + shoppingCartShortInfoCollectionName, + ) + .withId(shoppingCartId) + .toBeEqual({ + _id: shoppingCartId, + productItemsCount: 100, + totalAmount: 10000, + }), + )); +}); + +type ShoppingCartShortInfo = { + _id?: string; + productItemsCount: number; + totalAmount: number; +}; + +const shoppingCartShortInfoCollectionName = 'shoppingCartShortInfo'; + +const evolve = ( + document: ShoppingCartShortInfo, + { type, data: event }: ProductItemAdded, +): ShoppingCartShortInfo => { + switch (type) { + case 'ProductItemAdded': + return { + ...document, + _id: event.shoppingCartId, + totalAmount: + document.totalAmount + + event.productItem.price * event.productItem.quantity, + productItemsCount: + document.productItemsCount + event.productItem.quantity, + }; + default: + return document; + } +}; + +const shoppingCartShortInfoProjection = pongoSingleStreamProjection({ + collectionName: shoppingCartShortInfoCollectionName, + evolve, + getDocumentId: (event) => event.data.shoppingCartId, + canHandle: ['ProductItemAdded'], + initialState: () => ({ + productItemsCount: 0, + totalAmount: 0, + }), +}); diff --git a/src/packages/emmett-postgresql/src/eventStore/projections/postgresProjection.multi.int.spec.ts b/src/packages/emmett-postgresql/src/eventStore/projections/postgresProjection.multi.int.spec.ts index 747bddbd..b3d1eedc 100644 --- a/src/packages/emmett-postgresql/src/eventStore/projections/postgresProjection.multi.int.spec.ts +++ b/src/packages/emmett-postgresql/src/eventStore/projections/postgresProjection.multi.int.spec.ts @@ -15,7 +15,6 @@ import { PostgreSQLProjectionSpec, } from '.'; import { - type DiscountApplied, type ProductItemAdded, type ShoppingCartConfirmed, } from '../../testing/shoppingCart.domain'; @@ -23,7 +22,7 @@ import { void describe('Postgres Projections', () => { let postgres: StartedPostgreSqlContainer; let connectionString: string; - let given: PostgreSQLProjectionSpec; + let given: PostgreSQLProjectionSpec; let shoppingCartId: string; let clientId: string; diff --git a/src/packages/emmett-postgresql/src/eventStore/projections/postgresProjectionSpec.ts b/src/packages/emmett-postgresql/src/eventStore/projections/postgresProjectionSpec.ts index 01054f24..e54ca396 100644 --- a/src/packages/emmett-postgresql/src/eventStore/projections/postgresProjectionSpec.ts +++ b/src/packages/emmett-postgresql/src/eventStore/projections/postgresProjectionSpec.ts @@ -52,13 +52,13 @@ export type PostgreSQLProjectionAssert = (options: { connectionString: string; }) => Promise; -export type PostgreSQLProjectionSpecOptions = { - projection: PostgreSQLProjectionDefinition; +export type PostgreSQLProjectionSpecOptions = { + projection: PostgreSQLProjectionDefinition; } & DumboOptions; export const PostgreSQLProjectionSpec = { for: ( - options: PostgreSQLProjectionSpecOptions, + options: PostgreSQLProjectionSpecOptions, ): PostgreSQLProjectionSpec => { { const { projection, ...dumoOptions } = options; @@ -85,11 +85,12 @@ export const PostgreSQLProjectionSpec = { globalPosition: ++globalPosition, streamPosition: globalPosition, streamName: `test-${uuid()}`, - eventId: uuid(), + messageId: uuid(), }; allEvents.push({ ...event, + kind: 'Event', metadata: { ...metadata, ...('metadata' in event ? (event.metadata ?? {}) : {}), @@ -105,6 +106,7 @@ export const PostgreSQLProjectionSpec = { events: allEvents, projections: [projection], connection: { + pool, connectionString, transaction, }, diff --git a/src/packages/emmett-postgresql/src/eventStore/schema/appendToStream.int.spec.ts b/src/packages/emmett-postgresql/src/eventStore/schema/appendToStream.int.spec.ts index d4384000..ba60d777 100644 --- a/src/packages/emmett-postgresql/src/eventStore/schema/appendToStream.int.spec.ts +++ b/src/packages/emmett-postgresql/src/eventStore/schema/appendToStream.int.spec.ts @@ -133,7 +133,7 @@ void describe('appendEvent', () => { assertFalse(secondResult.success); const resultEvents = await pool.execute.query( - sql(`SELECT * FROM emt_events WHERE stream_id = %L`, streamId), + sql(`SELECT * FROM emt_messages WHERE stream_id = %L`, streamId), ); assertEqual(events.length, resultEvents.rows.length); @@ -178,7 +178,7 @@ void describe('appendEvent', () => { assertFalse(secondResult.success); const resultEvents = await pool.execute.query( - sql(`SELECT * FROM emt_events WHERE stream_id = %L`, streamId), + sql(`SELECT * FROM emt_messages WHERE stream_id = %L`, streamId), ); assertEqual(events.length * 2, resultEvents.rows.length); @@ -215,7 +215,7 @@ void describe('appendEvent', () => { assertTrue(secondResult.success); const resultEvents = await pool.execute.query( - sql(`SELECT * FROM emt_events WHERE stream_id = %L`, streamId), + sql(`SELECT * FROM emt_messages WHERE stream_id = %L`, streamId), ); assertEqual(events.length * 2, resultEvents.rows.length); diff --git a/src/packages/emmett-postgresql/src/eventStore/schema/appendToStream.ts b/src/packages/emmett-postgresql/src/eventStore/schema/appendToStream.ts index 40faea17..af1b2771 100644 --- a/src/packages/emmett-postgresql/src/eventStore/schema/appendToStream.ts +++ b/src/packages/emmett-postgresql/src/eventStore/schema/appendToStream.ts @@ -12,20 +12,21 @@ import { STREAM_DOES_NOT_EXIST, STREAM_EXISTS, type AppendToStreamOptions, - type Event, type ExpectedStreamVersion, - type ReadEvent, + type Message, + type RecordedMessage, } from '@event-driven-io/emmett'; import { v4 as uuid } from 'uuid'; -import { defaultTag, eventsTable, streamsTable } from './typing'; +import { defaultTag, messagesTable, streamsTable } from './typing'; -export const appendEventsSQL = rawSql( - `CREATE OR REPLACE FUNCTION emt_append_event( - v_event_ids text[], - v_events_data jsonb[], - v_events_metadata jsonb[], - v_event_schema_versions text[], - v_event_types text[], +export const appendToStreamSQL = rawSql( + `CREATE OR REPLACE FUNCTION emt_append_to_stream( + v_message_ids text[], + v_messages_data jsonb[], + v_messages_metadata jsonb[], + v_message_schema_versions text[], + v_message_types text[], + v_message_kinds text[], v_stream_id text, v_stream_type text, v_expected_stream_position bigint DEFAULT NULL, @@ -44,42 +45,15 @@ export const appendEventsSQL = rawSql( v_transaction_id xid8; v_last_global_position bigint; BEGIN + v_transaction_id := pg_current_xact_id(); + IF v_expected_stream_position IS NULL THEN SELECT COALESCE(max(stream_position), 0) INTO v_expected_stream_position FROM ${streamsTable.name} WHERE stream_id = v_stream_id AND partition = v_partition; END IF; - v_next_stream_position := v_expected_stream_position + array_upper(v_events_data, 1); - v_transaction_id := pg_current_xact_id(); - - WITH ev AS ( - SELECT row_number() OVER () + v_expected_stream_position AS stream_position, - event_data, - event_metadata, - schema_version, - event_id, - event_type - FROM ( - SELECT * - FROM - unnest(v_event_ids, v_events_data, v_events_metadata, v_event_schema_versions, v_event_types) - AS event(event_id, event_data, event_metadata, schema_version, event_type) - ) AS event - ), - all_events_insert AS ( - INSERT INTO ${eventsTable.name} - (stream_id, stream_position, partition, event_data, event_metadata, event_schema_version, event_type, event_id, transaction_id) - SELECT - v_stream_id, ev.stream_position, v_partition, ev.event_data, ev.event_metadata, ev.schema_version, ev.event_type, ev.event_id, v_transaction_id - FROM ev - RETURNING global_position - ) - SELECT - max(global_position) INTO v_last_global_position - FROM - all_events_insert; - + v_next_stream_position := v_expected_stream_position + array_upper(v_messages_data, 1); IF v_expected_stream_position = 0 THEN INSERT INTO ${streamsTable.name} @@ -99,13 +73,41 @@ export const appendEventsSQL = rawSql( END IF; END IF; + WITH ev AS ( + SELECT row_number() OVER () + v_expected_stream_position AS stream_position, + message_data, + message_metadata, + schema_version, + message_id, + message_type, + message_kind + FROM ( + SELECT * + FROM + unnest(v_message_ids, v_messages_data, v_messages_metadata, v_message_schema_versions, v_message_types, v_message_kinds) + AS message(message_id, message_data, message_metadata, schema_version, message_type, message_kind) + ) AS message + ), + all_messages_insert AS ( + INSERT INTO ${messagesTable.name} + (stream_id, stream_position, partition, message_data, message_metadata, message_schema_version, message_type, message_kind, message_id, transaction_id) + SELECT + v_stream_id, ev.stream_position, v_partition, ev.message_data, ev.message_metadata, ev.schema_version, ev.message_type, ev.message_kind, ev.message_id, v_transaction_id + FROM ev + RETURNING global_position + ) + SELECT + max(global_position) INTO v_last_global_position + FROM + all_messages_insert; + RETURN QUERY SELECT TRUE, v_next_stream_position, v_last_global_position, v_transaction_id; END; $$; `, ); -type AppendEventResult = +type AppendToStreamResult = | { success: true; nextStreamPosition: bigint; @@ -114,8 +116,8 @@ type AppendEventResult = } | { success: false }; -export type AppendToStreamPreCommitHook = ( - events: ReadEvent[], +export type AppendToStreamBeforeCommitHook = ( + messages: RecordedMessage[], context: { transaction: NodePostgresTransaction; }, @@ -125,48 +127,49 @@ export const appendToStream = ( pool: NodePostgresPool, streamName: string, streamType: string, - events: Event[], + messages: Message[], options?: AppendToStreamOptions & { partition?: string; - preCommitHook?: AppendToStreamPreCommitHook; + beforeCommitHook?: AppendToStreamBeforeCommitHook; }, -): Promise => - pool.withTransaction(async (transaction) => { +): Promise => + pool.withTransaction(async (transaction) => { const { execute } = transaction; - if (events.length === 0) + if (messages.length === 0) return { success: false, result: { success: false } }; - let appendResult: AppendEventSqlResult; + let appendResult: AppendToStreamSqlResult; try { const expectedStreamVersion = toExpectedVersion( options?.expectedStreamVersion, ); - const eventsToAppend: ReadEvent[] = events.map((e, i) => ({ + const messagesToAppend: RecordedMessage[] = messages.map((e, i) => ({ ...e, + kind: e.kind ?? 'Event', metadata: { streamName, - eventId: uuid(), + messageId: uuid(), streamPosition: BigInt(i), ...('metadata' in e ? (e.metadata ?? {}) : {}), }, - })); + })) as RecordedMessage[]; // TODO: return global positions from append raw and other generated data appendResult = await appendEventsRaw( execute, streamName, streamType, - eventsToAppend, + messagesToAppend, { expectedStreamVersion, }, ); - if (options?.preCommitHook) - await options.preCommitHook(eventsToAppend, { transaction }); + if (options?.beforeCommitHook) + await options.beforeCommitHook(messagesToAppend, { transaction }); } catch (error) { if (!isOptimisticConcurrencyError(error)) throw error; @@ -221,7 +224,7 @@ const toExpectedVersion = ( const isOptimisticConcurrencyError = (error: unknown): boolean => error instanceof Error && 'code' in error && error.code === '23505'; -type AppendEventSqlResult = { +type AppendToStreamSqlResult = { success: boolean; next_stream_position: string | null; last_global_position: string | null; @@ -232,33 +235,37 @@ const appendEventsRaw = ( execute: SQLExecutor, streamId: string, streamType: string, - events: ReadEvent[], + messages: RecordedMessage[], options?: { expectedStreamVersion: bigint | null; partition?: string; }, -): Promise => +): Promise => single( - execute.command( + execute.command( sql( - `SELECT * FROM emt_append_event( + `SELECT * FROM emt_append_to_stream( ARRAY[%s]::text[], ARRAY[%s]::jsonb[], ARRAY[%s]::jsonb[], ARRAY[%s]::text[], ARRAY[%s]::text[], + ARRAY[%s]::text[], %L::text, %L::text, %s::bigint, %L::text )`, - events.map((e) => sql('%L', e.metadata.eventId)).join(','), - events.map((e) => sql('%L', JSONParser.stringify(e.data))).join(','), - events + messages.map((e) => sql('%L', e.metadata.messageId)).join(','), + messages.map((e) => sql('%L', JSONParser.stringify(e.data))).join(','), + messages .map((e) => sql('%L', JSONParser.stringify(e.metadata ?? {}))) .join(','), - events.map(() => `'1'`).join(','), - events.map((e) => sql('%L', e.type)).join(','), + messages.map(() => `'1'`).join(','), + messages.map((e) => sql('%L', e.type)).join(','), + messages + .map((e) => sql('%L', e.kind === 'Event' ? 'E' : 'C')) + .join(','), streamId, streamType, options?.expectedStreamVersion ?? 'NULL', diff --git a/src/packages/emmett-postgresql/src/eventStore/schema/createEventStoreSchema.int.spec.ts b/src/packages/emmett-postgresql/src/eventStore/schema/createEventStoreSchema.int.spec.ts index 43d93a7d..85a745ac 100644 --- a/src/packages/emmett-postgresql/src/eventStore/schema/createEventStoreSchema.int.spec.ts +++ b/src/packages/emmett-postgresql/src/eventStore/schema/createEventStoreSchema.int.spec.ts @@ -42,7 +42,7 @@ void describe('createEventStoreSchema', () => { }); void it('creates the events table', async () => { - assert.ok(await tableExists(pool, 'emt_events')); + assert.ok(await tableExists(pool, 'emt_messages')); }); void it('creates the subscriptions table', async () => { @@ -50,21 +50,21 @@ void describe('createEventStoreSchema', () => { }); void it('creates the events default partition', async () => { - assert.ok(await tableExists(pool, 'emt_events_emt_default')); + assert.ok(await tableExists(pool, 'emt_messages_emt_default')); }); void it('creates the events secondary level active partition', async () => { - assert.ok(await tableExists(pool, 'emt_events_emt_default_active')); + assert.ok(await tableExists(pool, 'emt_messages_emt_default_active')); }); void it('creates the events secondary level archived partition', async () => { - assert.ok(await tableExists(pool, 'emt_events_emt_default_archived')); + assert.ok(await tableExists(pool, 'emt_messages_emt_default_archived')); }); }); void describe('creates functions', () => { void it('creates the append_event function', async () => { - assert.ok(await functionExists(pool, 'emt_append_event')); + assert.ok(await functionExists(pool, 'emt_append_to_stream')); }); void it('creates the emt_add_partition function', async () => { @@ -96,7 +96,7 @@ void describe('createEventStoreSchema', () => { rawSql(` SELECT EXISTS ( SELECT FROM pg_tables - WHERE tablename = 'emt_events_test_module__global' + WHERE tablename = 'emt_messages_test_module__global' ) AS exists; `), ), @@ -115,7 +115,7 @@ void describe('createEventStoreSchema', () => { rawSql(` SELECT EXISTS ( SELECT FROM pg_tables - WHERE tablename = 'emt_events_test_module__test_tenant' + WHERE tablename = 'emt_messages_test_module__test_tenant' ) AS exists;`), ), ); @@ -126,7 +126,7 @@ void describe('createEventStoreSchema', () => { // void it('should allow adding a module for all tenants', async () => { // await createEventStoreSchema(pool); - // await pool.query(`INSERT INTO emt_events (stream_id, stream_position, partition, event_data, event_metadata, event_schema_version, event_type, event_id, transaction_id) + // await pool.query(`INSERT INTO emt_messages (stream_id, stream_position, partition, message_data, message_metadata, message_schema_version, message_type, message_id, transaction_id) // VALUES ('test_stream', 0, 'global__global', '{}', '{}', '1.0', 'test', '${uuid()}', pg_current_xact_id())`); // await pool.query(`SELECT add_module_for_all_tenants('new_module')`); @@ -134,7 +134,7 @@ void describe('createEventStoreSchema', () => { // const res = await pool.query(` // SELECT EXISTS ( // SELECT FROM pg_tables - // WHERE tablename = 'emt_events_new_module__existing_tenant' + // WHERE tablename = 'emt_messages_new_module__existing_tenant' // ) AS exists; // `); @@ -149,7 +149,7 @@ void describe('createEventStoreSchema', () => { // void it('should allow adding a tenant for all modules', async () => { // await createEventStoreSchema(pool); - // await pool.query(`INSERT INTO emt_events (stream_id, stream_position, partition, event_data, event_metadata, event_schema_version, event_type, event_id, transaction_id) + // await pool.query(`INSERT INTO emt_messages (stream_id, stream_position, partition, message_data, message_metadata, message_schema_version, message_type, message_id, transaction_id) // VALUES ('test_stream', 0, '${emmettPrefix}:partition:existing_module:existing_tenant', '{}', '{}', '1.0', 'test', '${uuid()}', 0)`); // await pool.query(`SELECT add_tenant_for_all_modules('new_tenant')`); @@ -157,7 +157,7 @@ void describe('createEventStoreSchema', () => { // const res = await pool.query(` // SELECT EXISTS ( // SELECT FROM pg_tables - // WHERE tablename = 'emt_events_existing_module_new_tenant' + // WHERE tablename = 'emt_messages_existing_module_new_tenant' // ) AS exists; // `); diff --git a/src/packages/emmett-postgresql/src/eventStore/schema/index.ts b/src/packages/emmett-postgresql/src/eventStore/schema/index.ts index cf9cb79c..71202e74 100644 --- a/src/packages/emmett-postgresql/src/eventStore/schema/index.ts +++ b/src/packages/emmett-postgresql/src/eventStore/schema/index.ts @@ -1,15 +1,16 @@ import { type NodePostgresPool, type SQL } from '@event-driven-io/dumbo'; -import { appendEventsSQL } from './appendToStream'; -import { storeSubscriptionCheckpointSQL } from './storeSubscriptionCheckpoint'; +import { appendToStreamSQL } from './appendToStream'; +import { storeSubscriptionCheckpointSQL } from './storeProcessorCheckpoint'; import { - addDefaultPartition, - addEventsPartitions, + addDefaultPartitionSQL, addModuleForAllTenantsSQL, addModuleSQL, + addPartitionSQL, addTablePartitions, addTenantForAllModulesSQL, addTenantSQL, - eventsTableSQL, + messagesTableSQL, + migrationFromEventsToMessagesSQL, sanitizeNameSQL, streamsTableSQL, subscriptionsTableSQL, @@ -18,25 +19,26 @@ import { export * from './appendToStream'; export * from './readLastMessageGlobalPosition'; export * from './readMessagesBatch'; +export * from './readProcessorCheckpoint'; export * from './readStream'; -export * from './readSubscriptionCheckpoint'; -export * from './storeSubscriptionCheckpoint'; +export * from './storeProcessorCheckpoint'; export * from './tables'; export * from './typing'; export const schemaSQL: SQL[] = [ + migrationFromEventsToMessagesSQL, streamsTableSQL, - eventsTableSQL, + messagesTableSQL, subscriptionsTableSQL, sanitizeNameSQL, addTablePartitions, - addEventsPartitions, + addPartitionSQL, addModuleSQL, addTenantSQL, addModuleForAllTenantsSQL, addTenantForAllModulesSQL, - appendEventsSQL, - addDefaultPartition, + appendToStreamSQL, + addDefaultPartitionSQL, storeSubscriptionCheckpointSQL, ]; diff --git a/src/packages/emmett-postgresql/src/eventStore/schema/readLastMessageGlobalPosition.ts b/src/packages/emmett-postgresql/src/eventStore/schema/readLastMessageGlobalPosition.ts index bd737b82..348de0b9 100644 --- a/src/packages/emmett-postgresql/src/eventStore/schema/readLastMessageGlobalPosition.ts +++ b/src/packages/emmett-postgresql/src/eventStore/schema/readLastMessageGlobalPosition.ts @@ -1,5 +1,5 @@ import { singleOrNull, sql, type SQLExecutor } from '@event-driven-io/dumbo'; -import { defaultTag, eventsTable } from './typing'; +import { defaultTag, messagesTable } from './typing'; type ReadLastMessageGlobalPositionSqlResult = { global_position: string; @@ -17,7 +17,7 @@ export const readLastMessageGlobalPosition = async ( execute.query( sql( `SELECT global_position - FROM ${eventsTable.name} + FROM ${messagesTable.name} WHERE partition = %L AND is_archived = FALSE AND transaction_id < pg_snapshot_xmin(pg_current_snapshot()) ORDER BY transaction_id, global_position LIMIT 1`, diff --git a/src/packages/emmett-postgresql/src/eventStore/schema/readMessagesBatch.ts b/src/packages/emmett-postgresql/src/eventStore/schema/readMessagesBatch.ts index 1dff2665..77e63dcf 100644 --- a/src/packages/emmett-postgresql/src/eventStore/schema/readMessagesBatch.ts +++ b/src/packages/emmett-postgresql/src/eventStore/schema/readMessagesBatch.ts @@ -9,16 +9,16 @@ import { type ReadEventMetadata, type ReadEventMetadataWithGlobalPosition, } from '@event-driven-io/emmett'; -import { defaultTag, eventsTable } from './typing'; +import { defaultTag, messagesTable } from './typing'; type ReadMessagesBatchSqlResult = { stream_position: string; stream_id: string; - event_data: EventDataOf; - event_metadata: EventMetaDataOf; - event_schema_version: string; - event_type: EventTypeOf; - event_id: string; + message_data: EventDataOf; + message_metadata: EventMetaDataOf; + message_schema_version: string; + message_type: EventTypeOf; + message_id: string; global_position: string; transaction_id: string; created: string; @@ -76,8 +76,8 @@ export const readMessagesBatch = async < const events: ReadEvent[] = await mapRows( execute.query>( sql( - `SELECT stream_id, stream_position, global_position, event_data, event_metadata, event_schema_version, event_type, event_id - FROM ${eventsTable.name} + `SELECT stream_id, stream_position, global_position, message_data, message_metadata, message_schema_version, message_type, message_id + FROM ${messagesTable.name} WHERE partition = %L AND is_archived = FALSE AND transaction_id < pg_snapshot_xmin(pg_current_snapshot()) ${fromCondition} ${toCondition} ORDER BY transaction_id, global_position ${limitCondition}`, @@ -86,14 +86,14 @@ export const readMessagesBatch = async < ), (row) => { const rawEvent = { - type: row.event_type, - data: row.event_data, - metadata: row.event_metadata, + type: row.message_type, + data: row.message_data, + metadata: row.message_metadata, } as unknown as MessageType; const metadata: ReadEventMetadataWithGlobalPosition = { ...('metadata' in rawEvent ? (rawEvent.metadata ?? {}) : {}), - eventId: row.event_id, + messageId: row.message_id, streamName: row.stream_id, streamPosition: BigInt(row.stream_position), globalPosition: BigInt(row.global_position), @@ -101,6 +101,7 @@ export const readMessagesBatch = async < return { ...rawEvent, + kind: 'Event', metadata: metadata as CombinedReadEventMetadata< MessageType, ReadEventMetadataType diff --git a/src/packages/emmett-postgresql/src/eventStore/schema/readSubscriptionCheckpoint.ts b/src/packages/emmett-postgresql/src/eventStore/schema/readProcessorCheckpoint.ts similarity index 65% rename from src/packages/emmett-postgresql/src/eventStore/schema/readSubscriptionCheckpoint.ts rename to src/packages/emmett-postgresql/src/eventStore/schema/readProcessorCheckpoint.ts index 810f75fc..fb0fd042 100644 --- a/src/packages/emmett-postgresql/src/eventStore/schema/readSubscriptionCheckpoint.ts +++ b/src/packages/emmett-postgresql/src/eventStore/schema/readProcessorCheckpoint.ts @@ -1,27 +1,27 @@ import { singleOrNull, sql, type SQLExecutor } from '@event-driven-io/dumbo'; import { defaultTag, subscriptionsTable } from './typing'; -type ReadSubscriptionCheckpointSqlResult = { +type ReadProcessorCheckpointSqlResult = { last_processed_position: string; }; -export type ReadSubscriptionCheckpointResult = { +export type ReadProcessorCheckpointResult = { lastProcessedPosition: bigint | null; }; -export const readSubscriptionCheckpoint = async ( +export const readProcessorCheckpoint = async ( execute: SQLExecutor, - options: { subscriptionId: string; partition?: string }, -): Promise => { + options: { processorId: string; partition?: string }, +): Promise => { const result = await singleOrNull( - execute.query( + execute.query( sql( `SELECT last_processed_position FROM ${subscriptionsTable.name} WHERE partition = %L AND subscription_id = %L LIMIT 1`, options?.partition ?? defaultTag, - options.subscriptionId, + options.processorId, ), ), ); diff --git a/src/packages/emmett-postgresql/src/eventStore/schema/readStream.ts b/src/packages/emmett-postgresql/src/eventStore/schema/readStream.ts index b30fc13d..faf92b5c 100644 --- a/src/packages/emmett-postgresql/src/eventStore/schema/readStream.ts +++ b/src/packages/emmett-postgresql/src/eventStore/schema/readStream.ts @@ -11,15 +11,15 @@ import { type ReadStreamResult, } from '@event-driven-io/emmett'; import { PostgreSQLEventStoreDefaultStreamVersion } from '../postgreSQLEventStore'; -import { defaultTag, eventsTable } from './typing'; +import { defaultTag, messagesTable } from './typing'; type ReadStreamSqlResult = { stream_position: string; - event_data: EventDataOf; - event_metadata: EventMetaDataOf; - event_schema_version: string; - event_type: EventTypeOf; - event_id: string; + message_data: EventDataOf; + message_metadata: EventMetaDataOf; + message_schema_version: string; + message_type: EventTypeOf; + message_id: string; global_position: string; transaction_id: string; created: string; @@ -51,8 +51,8 @@ export const readStream = async ( await mapRows( execute.query>( sql( - `SELECT stream_id, stream_position, global_position, event_data, event_metadata, event_schema_version, event_type, event_id - FROM ${eventsTable.name} + `SELECT stream_id, stream_position, global_position, message_data, message_metadata, message_schema_version, message_type, message_id + FROM ${messagesTable.name} WHERE stream_id = %L AND partition = %L AND is_archived = FALSE ${fromCondition} ${toCondition}`, streamId, options?.partition ?? defaultTag, @@ -60,14 +60,14 @@ export const readStream = async ( ), (row) => { const rawEvent = { - type: row.event_type, - data: row.event_data, - metadata: row.event_metadata, + type: row.message_type, + data: row.message_data, + metadata: row.message_metadata, } as unknown as EventType; const metadata: ReadEventMetadataWithGlobalPosition = { ...('metadata' in rawEvent ? (rawEvent.metadata ?? {}) : {}), - eventId: row.event_id, + messageId: row.message_id, streamName: streamId, streamPosition: BigInt(row.stream_position), globalPosition: BigInt(row.global_position), @@ -75,6 +75,7 @@ export const readStream = async ( return { ...rawEvent, + kind: 'Event', metadata: metadata as CombinedReadEventMetadata< EventType, ReadEventMetadataWithGlobalPosition diff --git a/src/packages/emmett-postgresql/src/eventStore/schema/storeSubscriptionCheckpoint.ts b/src/packages/emmett-postgresql/src/eventStore/schema/storeProcessorCheckpoint.ts similarity index 87% rename from src/packages/emmett-postgresql/src/eventStore/schema/storeSubscriptionCheckpoint.ts rename to src/packages/emmett-postgresql/src/eventStore/schema/storeProcessorCheckpoint.ts index aaca2986..e52643a8 100644 --- a/src/packages/emmett-postgresql/src/eventStore/schema/storeSubscriptionCheckpoint.ts +++ b/src/packages/emmett-postgresql/src/eventStore/schema/storeProcessorCheckpoint.ts @@ -62,7 +62,7 @@ END; $$ LANGUAGE plpgsql; `); -export type StoreLastProcessedSubscriptionPositionResult< +export type StoreLastProcessedProcessorPositionResult< Position extends bigint | null = bigint, > = | { @@ -71,42 +71,42 @@ export type StoreLastProcessedSubscriptionPositionResult< } | { success: false; reason: 'IGNORED' | 'MISMATCH' }; -export function storeSubscriptionCheckpoint( +export function storeProcessorCheckpoint( execute: SQLExecutor, options: { - subscriptionId: string; + processorId: string; version: number | undefined; newPosition: bigint | null; lastProcessedPosition: bigint | null; partition?: string; }, -): Promise>; -export function storeSubscriptionCheckpoint( +): Promise>; +export function storeProcessorCheckpoint( execute: SQLExecutor, options: { - subscriptionId: string; + processorId: string; version: number | undefined; newPosition: bigint; lastProcessedPosition: bigint | null; partition?: string; }, -): Promise>; -export async function storeSubscriptionCheckpoint( +): Promise>; +export async function storeProcessorCheckpoint( execute: SQLExecutor, options: { - subscriptionId: string; + processorId: string; version: number | undefined; newPosition: bigint | null; lastProcessedPosition: bigint | null; partition?: string; }, -): Promise> { +): Promise> { try { const { result } = await single( execute.command<{ result: 0 | 1 | 2 }>( sql( `SELECT store_subscription_checkpoint(%L, %s, %L, %L, pg_current_xact_id(), %L) as result;`, - options.subscriptionId, + options.processorId, options.version ?? 1, options.newPosition, options.lastProcessedPosition, diff --git a/src/packages/emmett-postgresql/src/eventStore/schema/tables.ts b/src/packages/emmett-postgresql/src/eventStore/schema/tables.ts index b40ed29d..5f7d5145 100644 --- a/src/packages/emmett-postgresql/src/eventStore/schema/tables.ts +++ b/src/packages/emmett-postgresql/src/eventStore/schema/tables.ts @@ -1,8 +1,8 @@ import { rawSql } from '@event-driven-io/dumbo'; import { defaultTag, - eventsTable, globalTag, + messagesTable, streamsTable, subscriptionsTable, } from './typing'; @@ -11,7 +11,7 @@ export const streamsTableSQL = rawSql( `CREATE TABLE IF NOT EXISTS ${streamsTable.name}( stream_id TEXT NOT NULL, stream_position BIGINT NOT NULL, - partition TEXT NOT NULL DEFAULT '${globalTag}__${globalTag}', + partition TEXT NOT NULL DEFAULT '${globalTag}', stream_type TEXT NOT NULL, stream_metadata JSONB NOT NULL, is_archived BOOLEAN NOT NULL DEFAULT FALSE, @@ -20,21 +20,22 @@ export const streamsTableSQL = rawSql( ) PARTITION BY LIST (partition);`, ); -export const eventsTableSQL = rawSql( +export const messagesTableSQL = rawSql( ` - CREATE SEQUENCE IF NOT EXISTS emt_global_event_position; + CREATE SEQUENCE IF NOT EXISTS emt_global_message_position; - CREATE TABLE IF NOT EXISTS ${eventsTable.name}( + CREATE TABLE IF NOT EXISTS ${messagesTable.name}( stream_id TEXT NOT NULL, stream_position BIGINT NOT NULL, partition TEXT NOT NULL DEFAULT '${globalTag}', - event_data JSONB NOT NULL, - event_metadata JSONB NOT NULL, - event_schema_version TEXT NOT NULL, - event_type TEXT NOT NULL, - event_id TEXT NOT NULL, + message_kind CHAR(1) NOT NULL DEFAULT 'E', + message_data JSONB NOT NULL, + message_metadata JSONB NOT NULL, + message_schema_version TEXT NOT NULL, + message_type TEXT NOT NULL, + message_id TEXT NOT NULL, is_archived BOOLEAN NOT NULL DEFAULT FALSE, - global_position BIGINT DEFAULT nextval('emt_global_event_position'), + global_position BIGINT DEFAULT nextval('emt_global_message_position'), transaction_id XID8 NOT NULL, created TIMESTAMPTZ NOT NULL DEFAULT now(), PRIMARY KEY (stream_id, stream_position, partition, is_archived) @@ -46,7 +47,7 @@ export const subscriptionsTableSQL = rawSql( CREATE TABLE IF NOT EXISTS ${subscriptionsTable.name}( subscription_id TEXT NOT NULL, version INT NOT NULL DEFAULT 1, - partition TEXT NOT NULL DEFAULT '${globalTag}__${globalTag}', + partition TEXT NOT NULL DEFAULT '${globalTag}', last_processed_position BIGINT NOT NULL, last_processed_transaction_id XID8 NOT NULL, PRIMARY KEY (subscription_id, partition, version) @@ -97,11 +98,11 @@ export const addTablePartitions = rawSql( $$ LANGUAGE plpgsql;`, ); -export const addEventsPartitions = rawSql( +export const addPartitionSQL = rawSql( ` CREATE OR REPLACE FUNCTION emt_add_partition(partition_name TEXT) RETURNS void AS $$ BEGIN - PERFORM emt_add_table_partition('${eventsTable.name}', partition_name); + PERFORM emt_add_table_partition('${messagesTable.name}', partition_name); PERFORM emt_add_table_partition('${streamsTable.name}', partition_name); EXECUTE format(' @@ -117,23 +118,23 @@ export const addModuleSQL = rawSql( ` CREATE OR REPLACE FUNCTION add_module(new_module TEXT) RETURNS void AS $$ BEGIN - -- For ${eventsTable.name} table + -- For ${messagesTable.name} table EXECUTE format(' CREATE TABLE IF NOT EXISTS %I PARTITION OF %I FOR VALUES IN (emt_sanitize_name(%L || ''__'' || %L)) PARTITION BY LIST (is_archived);', - emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || '${globalTag}'), '${eventsTable.name}', new_module, '${globalTag}' + emt_sanitize_name('${messagesTable.name}_' || new_module || '__' || '${globalTag}'), '${messagesTable.name}', new_module, '${globalTag}' ); EXECUTE format(' CREATE TABLE IF NOT EXISTS %I_active PARTITION OF %I FOR VALUES IN (FALSE);', - emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || '${globalTag}' || '_active'), emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || '${globalTag}') + emt_sanitize_name('${messagesTable.name}_' || new_module || '__' || '${globalTag}' || '_active'), emt_sanitize_name('${messagesTable.name}_' || new_module || '__' || '${globalTag}') ); EXECUTE format(' CREATE TABLE IF NOT EXISTS %I_archived PARTITION OF %I FOR VALUES IN (TRUE);', - emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || '${globalTag}' || '_archived'), emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || '${globalTag}') + emt_sanitize_name('${messagesTable.name}_' || new_module || '__' || '${globalTag}' || '_archived'), emt_sanitize_name('${messagesTable.name}_' || new_module || '__' || '${globalTag}') ); -- For ${streamsTable.name} table @@ -163,23 +164,23 @@ export const addTenantSQL = rawSql( ` CREATE OR REPLACE FUNCTION add_tenant(new_module TEXT, new_tenant TEXT) RETURNS void AS $$ BEGIN - -- For ${eventsTable.name} table + -- For ${messagesTable.name} table EXECUTE format(' CREATE TABLE IF NOT EXISTS %I PARTITION OF %I FOR VALUES IN (emt_sanitize_name(''%s__%s'')) PARTITION BY LIST (is_archived);', - emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || new_tenant), '${eventsTable.name}', new_module, new_tenant + emt_sanitize_name('${messagesTable.name}_' || new_module || '__' || new_tenant), '${messagesTable.name}', new_module, new_tenant ); EXECUTE format(' CREATE TABLE IF NOT EXISTS %I_active PARTITION OF %I FOR VALUES IN (FALSE);', - emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || new_tenant || '_active'), emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || new_tenant) + emt_sanitize_name('${messagesTable.name}_' || new_module || '__' || new_tenant || '_active'), emt_sanitize_name('${messagesTable.name}_' || new_module || '__' || new_tenant) ); EXECUTE format(' CREATE TABLE IF NOT EXISTS %I_archived PARTITION OF %I FOR VALUES IN (TRUE);', - emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || new_tenant || '_archived'), emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || new_tenant) + emt_sanitize_name('${messagesTable.name}_' || new_module || '__' || new_tenant || '_archived'), emt_sanitize_name('${messagesTable.name}_' || new_module || '__' || new_tenant) ); -- For ${streamsTable.name} table @@ -213,25 +214,25 @@ export const addModuleForAllTenantsSQL = rawSql( BEGIN PERFORM add_module(new_module); - FOR tenant_record IN SELECT DISTINCT tenant FROM ${eventsTable.name} + FOR tenant_record IN SELECT DISTINCT tenant FROM ${messagesTable.name} LOOP - -- For ${eventsTable.name} table + -- For ${messagesTable.name} table EXECUTE format(' CREATE TABLE IF NOT EXISTS %I PARTITION OF %I FOR VALUES IN (emt_sanitize_name(''%s__%s'')) PARTITION BY LIST (is_archived);', - emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || tenant_record.tenant), '${eventsTable.name}', new_module, tenant_record.tenant + emt_sanitize_name('${messagesTable.name}_' || new_module || '__' || tenant_record.tenant), '${messagesTable.name}', new_module, tenant_record.tenant ); EXECUTE format(' CREATE TABLE IF NOT EXISTS %I_active PARTITION OF %I FOR VALUES IN (FALSE);', - emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || tenant_record.tenant || '_active'), emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || tenant_record.tenant) + emt_sanitize_name('${messagesTable.name}_' || new_module || '__' || tenant_record.tenant || '_active'), emt_sanitize_name('${messagesTable.name}_' || new_module || '__' || tenant_record.tenant) ); EXECUTE format(' CREATE TABLE IF NOT EXISTS %I_archived PARTITION OF %I FOR VALUES IN (TRUE);', - emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || tenant_record.tenant || '_archived'), emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || tenant_record.tenant) + emt_sanitize_name('${messagesTable.name}_' || new_module || '__' || tenant_record.tenant || '_archived'), emt_sanitize_name('${messagesTable.name}_' || new_module || '__' || tenant_record.tenant) ); -- For ${streamsTable.name} table @@ -264,25 +265,25 @@ export const addTenantForAllModulesSQL = rawSql( DECLARE module_record RECORD; BEGIN - FOR module_record IN SELECT DISTINCT partitionname FROM pg_partman.part_config WHERE parent_table = '${eventsTable.name}' + FOR module_record IN SELECT DISTINCT partitionname FROM pg_partman.part_config WHERE parent_table = '${messagesTable.name}' LOOP - -- For ${eventsTable.name} table + -- For ${messagesTable.name} table EXECUTE format(' CREATE TABLE IF NOT EXISTS %I PARTITION OF %I FOR VALUES IN (emt_sanitize_name(''%s__%s'')) PARTITION BY LIST (is_archived);', - emt_sanitize_name('${eventsTable.name}_' || module_record.partitionname || '__' || new_tenant), '${eventsTable.name}', module_record.partitionname, new_tenant + emt_sanitize_name('${messagesTable.name}_' || module_record.partitionname || '__' || new_tenant), '${messagesTable.name}', module_record.partitionname, new_tenant ); EXECUTE format(' CREATE TABLE IF NOT EXISTS %I_active PARTITION OF %I FOR VALUES IN (FALSE);', - emt_sanitize_name('${eventsTable.name}_' || module_record.partitionname || '__' || new_tenant || '_active'), emt_sanitize_name('${eventsTable.name}_' || module_record.partitionname || '__' || new_tenant) + emt_sanitize_name('${messagesTable.name}_' || module_record.partitionname || '__' || new_tenant || '_active'), emt_sanitize_name('${messagesTable.name}_' || module_record.partitionname || '__' || new_tenant) ); EXECUTE format(' CREATE TABLE IF NOT EXISTS %I_archived PARTITION OF %I FOR VALUES IN (TRUE);', - emt_sanitize_name('${eventsTable.name}_' || module_record.partitionname || '__' || new_tenant || '_archived'), emt_sanitize_name('${eventsTable.name}_' || module_record.partitionname || '__' || new_tenant) + emt_sanitize_name('${messagesTable.name}_' || module_record.partitionname || '__' || new_tenant || '_archived'), emt_sanitize_name('${messagesTable.name}_' || module_record.partitionname || '__' || new_tenant) ); -- For ${streamsTable.name} table @@ -309,6 +310,54 @@ export const addTenantForAllModulesSQL = rawSql( `, ); -export const addDefaultPartition = rawSql( +export const addDefaultPartitionSQL = rawSql( `SELECT emt_add_partition('${defaultTag}');`, ); + +export const migrationFromEventsToMessagesSQL = rawSql(` +DO $$ +DECLARE + partition_record RECORD; +BEGIN + -- Rename the main table and its columns if it exists + IF EXISTS (SELECT 1 FROM pg_tables WHERE tablename = 'emt_events') THEN + -- Rename all partitions first + FOR partition_record IN + SELECT tablename + FROM pg_tables + WHERE tablename LIKE 'emt_events_%' + ORDER BY tablename DESC -- to handle child partitions first + LOOP + EXECUTE format('ALTER TABLE %I RENAME TO %I', + partition_record.tablename, + REPLACE(partition_record.tablename, 'events', 'messages')); + END LOOP; + + -- Rename the main table + ALTER TABLE emt_events RENAME TO emt_messages; + + -- Rename columns + ALTER TABLE emt_messages + RENAME COLUMN event_data TO message_data; + ALTER TABLE emt_messages + RENAME COLUMN event_metadata TO message_metadata; + ALTER TABLE emt_messages + RENAME COLUMN event_schema_version TO message_schema_version; + ALTER TABLE emt_messages + RENAME COLUMN event_type TO message_type; + ALTER TABLE emt_messages + RENAME COLUMN event_id TO message_id; + ALTER TABLE emt_messages + ADD COLUMN message_kind CHAR(1) NOT NULL DEFAULT 'E'; + + -- Rename sequence if it exists + IF EXISTS (SELECT 1 FROM pg_sequences WHERE sequencename = 'emt_global_event_position') THEN + ALTER SEQUENCE emt_global_event_position + RENAME TO emt_global_message_position; + + ALTER TABLE emt_messages + ALTER COLUMN global_position + SET DEFAULT nextval('emt_global_message_position'); + END IF; + END IF; +END $$;`); diff --git a/src/packages/emmett-postgresql/src/eventStore/schema/typing.ts b/src/packages/emmett-postgresql/src/eventStore/schema/typing.ts index 8a70f228..ab26826d 100644 --- a/src/packages/emmett-postgresql/src/eventStore/schema/typing.ts +++ b/src/packages/emmett-postgresql/src/eventStore/schema/typing.ts @@ -23,8 +23,8 @@ export const streamsTable = { }, }; -export const eventsTable = { - name: `${emmettPrefix}_events`, +export const messagesTable = { + name: `${emmettPrefix}_messages`, columns: { partition: columns.partition, isArchived: columns.isArchived, diff --git a/src/packages/emmett-postgresql/src/eventStore/subscriptions/postgreSQLEventStoreConsumer.handling.int.ts b/src/packages/emmett-postgresql/src/eventStore/subscriptions/postgreSQLEventStoreConsumer.handling.int.ts deleted file mode 100644 index ef1d0d19..00000000 --- a/src/packages/emmett-postgresql/src/eventStore/subscriptions/postgreSQLEventStoreConsumer.handling.int.ts +++ /dev/null @@ -1,360 +0,0 @@ -import { assertThatArray, type Event } from '@event-driven-io/emmett'; -import { - PostgreSqlContainer, - StartedPostgreSqlContainer, -} from '@testcontainers/postgresql'; -import { after, before, describe, it } from 'node:test'; -import { v4 as uuid } from 'uuid'; -import { - getPostgreSQLEventStore, - type PostgresEventStore, -} from '../postgreSQLEventStore'; -import { postgreSQLEventStoreConsumer } from './postgreSQLEventStoreConsumer'; -import type { PostgreSQLEventStoreSubscriptionOptions } from './postgreSQLEventStoreSubscription'; - -void describe('PostgreSQL event store started consumer', () => { - let postgres: StartedPostgreSqlContainer; - let connectionString: string; - let eventStore: PostgresEventStore; - - before(async () => { - postgres = await new PostgreSqlContainer().start(); - connectionString = postgres.getConnectionUri(); - eventStore = getPostgreSQLEventStore(connectionString); - await eventStore.schema.migrate(); - }); - - after(async () => { - try { - await eventStore.close(); - await postgres.stop(); - } catch (error) { - console.log(error); - } - }); - - void describe('eachMessage', () => { - void it('handles all events appended to event store BEFORE subscription was started', async () => { - // Given - const guestId = uuid(); - const streamName = `guestStay-${guestId}`; - const events: GuestStayEvent[] = [ - { type: 'GuestCheckedIn', data: { guestId } }, - { type: 'GuestCheckedOut', data: { guestId } }, - ]; - const appendResult = await eventStore.appendToStream(streamName, events); - - const result: GuestStayEvent[] = []; - - // When - const consumer = postgreSQLEventStoreConsumer({ - connectionString, - }); - consumer.subscribe({ - subscriptionId: uuid(), - stopAfter: (event) => - event.metadata.globalPosition === - appendResult.lastEventGlobalPosition, - eachMessage: (event) => { - result.push(event); - }, - }); - - try { - await consumer.start(); - - assertThatArray(result).containsElementsMatching(events); - } finally { - await consumer.close(); - } - }); - - void it('handles all events appended to event store AFTER subscription was started', async () => { - // Given - - const result: GuestStayEvent[] = []; - let stopAfterPosition: bigint | undefined = undefined; - - // When - const consumer = postgreSQLEventStoreConsumer({ - connectionString, - }); - consumer.subscribe({ - subscriptionId: uuid(), - stopAfter: (event) => - event.metadata.globalPosition === stopAfterPosition, - eachMessage: (event) => { - result.push(event); - }, - }); - - const guestId = uuid(); - const streamName = `guestStay-${guestId}`; - const events: GuestStayEvent[] = [ - { type: 'GuestCheckedIn', data: { guestId } }, - { type: 'GuestCheckedOut', data: { guestId } }, - ]; - - try { - const consumerPromise = consumer.start(); - - const appendResult = await eventStore.appendToStream( - streamName, - events, - ); - stopAfterPosition = appendResult.lastEventGlobalPosition; - - await consumerPromise; - - assertThatArray(result).containsElementsMatching(events); - } finally { - await consumer.close(); - } - }); - - void it('handles ONLY events AFTER provided global position', async () => { - // Given - const guestId = uuid(); - const otherGuestId = uuid(); - const streamName = `guestStay-${guestId}`; - - const initialEvents: GuestStayEvent[] = [ - { type: 'GuestCheckedIn', data: { guestId } }, - { type: 'GuestCheckedOut', data: { guestId } }, - ]; - const { lastEventGlobalPosition: startPosition } = - await eventStore.appendToStream(streamName, initialEvents); - - const events: GuestStayEvent[] = [ - { type: 'GuestCheckedIn', data: { guestId: otherGuestId } }, - { type: 'GuestCheckedOut', data: { guestId: otherGuestId } }, - ]; - - const result: GuestStayEvent[] = []; - let stopAfterPosition: bigint | undefined = undefined; - - // When - const consumer = postgreSQLEventStoreConsumer({ - connectionString, - }); - consumer.subscribe({ - subscriptionId: uuid(), - startFrom: { globalPosition: startPosition }, - stopAfter: (event) => - event.metadata.globalPosition === stopAfterPosition, - eachMessage: (event) => { - result.push(event); - }, - }); - - try { - const consumerPromise = consumer.start(); - - const appendResult = await eventStore.appendToStream( - streamName, - events, - ); - stopAfterPosition = appendResult.lastEventGlobalPosition; - - await consumerPromise; - - assertThatArray(result).containsOnlyElementsMatching(events); - } finally { - await consumer.close(); - } - }); - - void it('handles all events when CURRENT position is NOT stored', async () => { - // Given - const guestId = uuid(); - const otherGuestId = uuid(); - const streamName = `guestStay-${guestId}`; - - const initialEvents: GuestStayEvent[] = [ - { type: 'GuestCheckedIn', data: { guestId } }, - { type: 'GuestCheckedOut', data: { guestId } }, - ]; - - await eventStore.appendToStream(streamName, initialEvents); - - const events: GuestStayEvent[] = [ - { type: 'GuestCheckedIn', data: { guestId: otherGuestId } }, - { type: 'GuestCheckedOut', data: { guestId: otherGuestId } }, - ]; - - const result: GuestStayEvent[] = []; - let stopAfterPosition: bigint | undefined = undefined; - - // When - const consumer = postgreSQLEventStoreConsumer({ - connectionString, - }); - consumer.subscribe({ - subscriptionId: uuid(), - startFrom: 'CURRENT', - stopAfter: (event) => - event.metadata.globalPosition === stopAfterPosition, - eachMessage: (event) => { - result.push(event); - }, - }); - - try { - const consumerPromise = consumer.start(); - - const appendResult = await eventStore.appendToStream( - streamName, - events, - ); - stopAfterPosition = appendResult.lastEventGlobalPosition; - - await consumerPromise; - - assertThatArray(result).containsElementsMatching([ - ...initialEvents, - ...events, - ]); - } finally { - await consumer.close(); - } - }); - - void it('handles only new events when CURRENT position is stored for restarted consumer', async () => { - // Given - const guestId = uuid(); - const otherGuestId = uuid(); - const streamName = `guestStay-${guestId}`; - - const initialEvents: GuestStayEvent[] = [ - { type: 'GuestCheckedIn', data: { guestId } }, - { type: 'GuestCheckedOut', data: { guestId } }, - ]; - const { lastEventGlobalPosition } = await eventStore.appendToStream( - streamName, - initialEvents, - ); - - const events: GuestStayEvent[] = [ - { type: 'GuestCheckedIn', data: { guestId: otherGuestId } }, - { type: 'GuestCheckedOut', data: { guestId: otherGuestId } }, - ]; - - let result: GuestStayEvent[] = []; - let stopAfterPosition: bigint | undefined = lastEventGlobalPosition; - - // When - const consumer = postgreSQLEventStoreConsumer({ - connectionString, - }); - consumer.subscribe({ - subscriptionId: uuid(), - startFrom: 'CURRENT', - stopAfter: (event) => - event.metadata.globalPosition === stopAfterPosition, - eachMessage: (event) => { - result.push(event); - }, - }); - - await consumer.start(); - await consumer.stop(); - - result = []; - - stopAfterPosition = undefined; - - try { - const consumerPromise = consumer.start(); - - const appendResult = await eventStore.appendToStream( - streamName, - events, - ); - stopAfterPosition = appendResult.lastEventGlobalPosition; - - await consumerPromise; - - assertThatArray(result).containsOnlyElementsMatching(events); - } finally { - await consumer.close(); - } - }); - - void it('handles only new events when CURRENT position is stored for a new consumer', async () => { - // Given - const guestId = uuid(); - const otherGuestId = uuid(); - const streamName = `guestStay-${guestId}`; - - const initialEvents: GuestStayEvent[] = [ - { type: 'GuestCheckedIn', data: { guestId } }, - { type: 'GuestCheckedOut', data: { guestId } }, - ]; - const { lastEventGlobalPosition } = await eventStore.appendToStream( - streamName, - initialEvents, - ); - - const events: GuestStayEvent[] = [ - { type: 'GuestCheckedIn', data: { guestId: otherGuestId } }, - { type: 'GuestCheckedOut', data: { guestId: otherGuestId } }, - ]; - - let result: GuestStayEvent[] = []; - let stopAfterPosition: bigint | undefined = lastEventGlobalPosition; - - const subscriptionOptions: PostgreSQLEventStoreSubscriptionOptions = - { - subscriptionId: uuid(), - startFrom: 'CURRENT', - stopAfter: (event) => - event.metadata.globalPosition === stopAfterPosition, - eachMessage: (event) => { - result.push(event); - }, - }; - - // When - const consumer = postgreSQLEventStoreConsumer({ - connectionString, - }); - try { - consumer.subscribe(subscriptionOptions); - - await consumer.start(); - } finally { - await consumer.close(); - } - - result = []; - - stopAfterPosition = undefined; - - const newConsumer = postgreSQLEventStoreConsumer({ - connectionString, - }); - newConsumer.subscribe(subscriptionOptions); - - try { - const consumerPromise = newConsumer.start(); - - const appendResult = await eventStore.appendToStream( - streamName, - events, - ); - stopAfterPosition = appendResult.lastEventGlobalPosition; - - await consumerPromise; - - assertThatArray(result).containsOnlyElementsMatching(events); - } finally { - await newConsumer.close(); - } - }); - }); -}); - -type GuestCheckedIn = Event<'GuestCheckedIn', { guestId: string }>; -type GuestCheckedOut = Event<'GuestCheckedOut', { guestId: string }>; - -type GuestStayEvent = GuestCheckedIn | GuestCheckedOut; diff --git a/src/packages/emmett-postgresql/src/eventStore/subscriptions/postgreSQLEventStoreConsumer.ts b/src/packages/emmett-postgresql/src/eventStore/subscriptions/postgreSQLEventStoreConsumer.ts deleted file mode 100644 index fadc81bd..00000000 --- a/src/packages/emmett-postgresql/src/eventStore/subscriptions/postgreSQLEventStoreConsumer.ts +++ /dev/null @@ -1,142 +0,0 @@ -import { dumbo } from '@event-driven-io/dumbo'; -import { EmmettError, type Event } from '@event-driven-io/emmett'; -import { - DefaultPostgreSQLEventStoreSubscriptionBatchSize, - DefaultPostgreSQLEventStoreSubscriptionPullingFrequencyInMs, - postgreSQLEventStoreMessageBatchPuller, - zipPostgreSQLEventStoreMessageBatchPullerStartFrom, - type PostgreSQLEventStoreMessageBatchPuller, - type PostgreSQLEventStoreMessagesBatchHandler, -} from './messageBatchProcessing'; -import { - postgreSQLEventStoreSubscription, - type PostgreSQLEventStoreSubscription, - type PostgreSQLEventStoreSubscriptionOptions, -} from './postgreSQLEventStoreSubscription'; - -export type PostgreSQLEventStoreConsumerOptions = { - connectionString: string; - subscriptions?: PostgreSQLEventStoreSubscription[]; - pooling?: { - batchSize?: number; - pullingFrequencyInMs?: number; - }; -}; - -export type PostgreSQLEventStoreConsumer = Readonly<{ - connectionString: string; - isRunning: boolean; - subscriptions: PostgreSQLEventStoreSubscription[]; - subscribe: ( - options: PostgreSQLEventStoreSubscriptionOptions, - ) => PostgreSQLEventStoreSubscription; - start: () => Promise; - stop: () => Promise; - close: () => Promise; -}>; - -export const postgreSQLEventStoreConsumer = ( - options: PostgreSQLEventStoreConsumerOptions, -): PostgreSQLEventStoreConsumer => { - let isRunning = false; - const { connectionString, pooling } = options; - const subscriptions = options.subscriptions ?? []; - - let start: Promise; - - let currentMessagePooler: PostgreSQLEventStoreMessageBatchPuller | undefined; - - const pool = dumbo({ connectionString }); - - const eachBatch: PostgreSQLEventStoreMessagesBatchHandler = async ( - messagesBatch, - ) => { - const activeSubscriptions = subscriptions.filter((s) => s.isActive); - - if (activeSubscriptions.length === 0) - return { - type: 'STOP', - reason: 'No active subscriptions', - }; - - const result = await Promise.allSettled( - activeSubscriptions.map((s) => { - // TODO: Add here filtering to only pass messages that can be handled by subscription - return s.handle(messagesBatch, { pool }); - }), - ); - - return result.some( - (r) => r.status === 'fulfilled' && r.value?.type !== 'STOP', - ) - ? undefined - : { - type: 'STOP', - }; - }; - - const messagePooler = (currentMessagePooler = - postgreSQLEventStoreMessageBatchPuller({ - executor: pool.execute, - eachBatch, - batchSize: - pooling?.batchSize ?? DefaultPostgreSQLEventStoreSubscriptionBatchSize, - pullingFrequencyInMs: - pooling?.pullingFrequencyInMs ?? - DefaultPostgreSQLEventStoreSubscriptionPullingFrequencyInMs, - })); - - const stop = async () => { - if (!isRunning) return; - isRunning = false; - if (currentMessagePooler) { - await currentMessagePooler.stop(); - currentMessagePooler = undefined; - } - await start; - }; - - return { - connectionString, - subscriptions, - get isRunning() { - return isRunning; - }, - subscribe: ( - options: PostgreSQLEventStoreSubscriptionOptions, - ): PostgreSQLEventStoreSubscription => { - const subscription = postgreSQLEventStoreSubscription(options); - - subscriptions.push(subscription); - - return subscription; - }, - start: () => { - if (isRunning) return start; - - start = (async () => { - if (subscriptions.length === 0) - return Promise.reject( - new EmmettError( - 'Cannot start consumer without at least a single subscription', - ), - ); - - isRunning = true; - - const startFrom = zipPostgreSQLEventStoreMessageBatchPullerStartFrom( - await Promise.all(subscriptions.map((o) => o.start(pool.execute))), - ); - - return messagePooler.start({ startFrom }); - })(); - - return start; - }, - stop, - close: async () => { - await stop(); - await pool.close(); - }, - }; -}; diff --git a/src/packages/emmett-postgresql/src/eventStore/subscriptions/postgreSQLEventStoreSubscription.ts b/src/packages/emmett-postgresql/src/eventStore/subscriptions/postgreSQLEventStoreSubscription.ts deleted file mode 100644 index dfa9e990..00000000 --- a/src/packages/emmett-postgresql/src/eventStore/subscriptions/postgreSQLEventStoreSubscription.ts +++ /dev/null @@ -1,171 +0,0 @@ -import { type Dumbo, type SQLExecutor } from '@event-driven-io/dumbo'; -import { - EmmettError, - type Event, - type ReadEvent, - type ReadEventMetadataWithGlobalPosition, -} from '@event-driven-io/emmett'; -import { - readSubscriptionCheckpoint, - storeSubscriptionCheckpoint, -} from '../schema'; -import type { PostgreSQLEventStoreMessageBatchPullerStartFrom } from './messageBatchProcessing'; - -export type PostgreSQLEventStoreSubscriptionEventsBatch< - EventType extends Event = Event, -> = { - messages: ReadEvent[]; -}; - -export type PostgreSQLEventStoreSubscription = - { - id: string; - start: ( - execute: SQLExecutor, - ) => Promise; - isActive: boolean; - handle: ( - messagesBatch: PostgreSQLEventStoreSubscriptionEventsBatch, - context: { pool: Dumbo }, - ) => Promise; - }; - -export const PostgreSQLEventStoreSubscription = { - result: { - skip: (options?: { - reason?: string; - }): PostgreSQLEventStoreSubscriptionMessageHandlerResult => ({ - type: 'SKIP', - ...(options ?? {}), - }), - stop: (options?: { - reason?: string; - error?: EmmettError; - }): PostgreSQLEventStoreSubscriptionMessageHandlerResult => ({ - type: 'STOP', - ...(options ?? {}), - }), - }, -}; - -export type PostgreSQLEventStoreSubscriptionMessageHandlerResult = - | void - | { type: 'SKIP'; reason?: string } - | { type: 'STOP'; reason?: string; error?: EmmettError }; - -export type PostgreSQLEventStoreSubscriptionEachMessageHandler< - EventType extends Event = Event, -> = ( - event: ReadEvent, -) => - | Promise - | PostgreSQLEventStoreSubscriptionMessageHandlerResult; - -export type PostgreSQLEventStoreSubscriptionStartFrom = - | PostgreSQLEventStoreMessageBatchPullerStartFrom - | 'CURRENT'; - -export type PostgreSQLEventStoreSubscriptionOptions< - EventType extends Event = Event, -> = { - subscriptionId: string; - version?: number; - partition?: string; - startFrom?: PostgreSQLEventStoreSubscriptionStartFrom; - stopAfter?: ( - message: ReadEvent, - ) => boolean; - eachMessage: PostgreSQLEventStoreSubscriptionEachMessageHandler; -}; - -export const postgreSQLEventStoreSubscription = < - EventType extends Event = Event, ->( - options: PostgreSQLEventStoreSubscriptionOptions, -): PostgreSQLEventStoreSubscription => { - const { eachMessage } = options; - let isActive = true; - //let lastProcessedPosition: bigint | null = null; - - return { - id: options.subscriptionId, - start: async ( - execute: SQLExecutor, - ): Promise => { - isActive = true; - if (options.startFrom !== 'CURRENT') return options.startFrom; - - const { lastProcessedPosition } = await readSubscriptionCheckpoint( - execute, - { - subscriptionId: options.subscriptionId, - partition: options.partition, - }, - ); - - if (lastProcessedPosition === null) return 'BEGINNING'; - - return { globalPosition: lastProcessedPosition }; - }, - get isActive() { - return isActive; - }, - handle: async ( - { messages }, - { pool }, - ): Promise => { - if (!isActive) return; - - return pool.withTransaction(async (tx) => { - let result: - | PostgreSQLEventStoreSubscriptionMessageHandlerResult - | undefined = undefined; - - let lastProcessedPosition: bigint | null = null; - - for (const message of messages) { - const typedMessage = message as ReadEvent< - EventType, - ReadEventMetadataWithGlobalPosition - >; - - const messageProcessingResult = await eachMessage(typedMessage); - - // TODO: Add correct handling of the storing checkpoint - await storeSubscriptionCheckpoint(tx.execute, { - subscriptionId: options.subscriptionId, - version: options.version, - lastProcessedPosition, - newPosition: typedMessage.metadata.globalPosition, - partition: options.partition, - }); - - lastProcessedPosition = typedMessage.metadata.globalPosition; - - if ( - messageProcessingResult && - messageProcessingResult.type === 'STOP' - ) { - isActive = false; - result = messageProcessingResult; - break; - } - - if (options.stopAfter && options.stopAfter(typedMessage)) { - isActive = false; - result = { type: 'STOP', reason: 'Stop condition reached' }; - break; - } - - if ( - messageProcessingResult && - messageProcessingResult.type === 'SKIP' - ) - continue; - } - - return result; - }); - }, - }; -}; diff --git a/src/packages/emmett-shims/package.json b/src/packages/emmett-shims/package.json index ae2f35e5..4d7ea306 100644 --- a/src/packages/emmett-shims/package.json +++ b/src/packages/emmett-shims/package.json @@ -1,6 +1,6 @@ { "name": "@event-driven-io/emmett-shims", - "version": "0.26.0", + "version": "0.34.0", "type": "module", "description": "Emmett - Event Sourcing development made simple", "scripts": { diff --git a/src/packages/emmett-sqlite/package.json b/src/packages/emmett-sqlite/package.json index da86c53c..fd50f8d1 100644 --- a/src/packages/emmett-sqlite/package.json +++ b/src/packages/emmett-sqlite/package.json @@ -1,6 +1,6 @@ { "name": "@event-driven-io/emmett-sqlite", - "version": "0.26.0", + "version": "0.34.0", "type": "module", "description": "Emmett - SQLite - Event Sourcing development made simple", "scripts": { @@ -72,7 +72,7 @@ "@types/sqlite3": "^3.1.11" }, "peerDependencies": { - "@event-driven-io/emmett": "0.26.0", + "@event-driven-io/emmett": "0.34.0", "sqlite3": "^5.1.7" } } diff --git a/src/packages/emmett-sqlite/src/connection/index.ts b/src/packages/emmett-sqlite/src/connection/index.ts new file mode 100644 index 00000000..77911132 --- /dev/null +++ b/src/packages/emmett-sqlite/src/connection/index.ts @@ -0,0 +1 @@ +export * from './sqliteConnection'; diff --git a/src/packages/emmett-sqlite/src/sqliteConnection.ts b/src/packages/emmett-sqlite/src/connection/sqliteConnection.ts similarity index 73% rename from src/packages/emmett-sqlite/src/sqliteConnection.ts rename to src/packages/emmett-sqlite/src/connection/sqliteConnection.ts index 2742f6de..7591dd67 100644 --- a/src/packages/emmett-sqlite/src/sqliteConnection.ts +++ b/src/packages/emmett-sqlite/src/connection/sqliteConnection.ts @@ -1,8 +1,9 @@ -import type sqlite3 from 'sqlite3'; +import sqlite3 from 'sqlite3'; export type Parameters = object | string | bigint | number | boolean | null; export type SQLiteConnection = { + close: () => void; command: (sql: string, values?: Parameters[]) => Promise; query: (sql: string, values?: Parameters[]) => Promise; querySingle: (sql: string, values?: Parameters[]) => Promise; @@ -20,10 +21,21 @@ export const isSQLiteError = (error: unknown): error is SQLiteError => { return false; }; -export const sqliteConnection = (conn: sqlite3.Database): SQLiteConnection => { - const db = conn; +export type InMemorySQLiteDatabase = ':memory:'; +export const InMemorySQLiteDatabase = ':memory:'; + +type SQLiteConnectionOptions = { + // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents + fileName: InMemorySQLiteDatabase | string | undefined; +}; + +export const sqliteConnection = ( + options: SQLiteConnectionOptions, +): SQLiteConnection => { + const db = new sqlite3.Database(options.fileName ?? InMemorySQLiteDatabase); return { + close: (): void => db.close(), command: (sql: string, params?: Parameters[]) => new Promise((resolve, reject) => { db.run(sql, params ?? [], (err: Error | null) => { diff --git a/src/packages/emmett-sqlite/src/eventStore/SQLiteEventStore.e2e.spec.ts b/src/packages/emmett-sqlite/src/eventStore/SQLiteEventStore.e2e.spec.ts index 14ff4fe9..4939dd45 100644 --- a/src/packages/emmett-sqlite/src/eventStore/SQLiteEventStore.e2e.spec.ts +++ b/src/packages/emmett-sqlite/src/eventStore/SQLiteEventStore.e2e.spec.ts @@ -5,10 +5,12 @@ import { assertThrowsAsync, ExpectedVersionConflictError, } from '@event-driven-io/emmett'; +import fs from 'fs'; import { afterEach, beforeEach, describe, it } from 'node:test'; -import sqlite3 from 'sqlite3'; +import path from 'path'; +import { fileURLToPath } from 'url'; import { v4 as uuid } from 'uuid'; -import { sqliteConnection, type SQLiteConnection } from '../sqliteConnection'; +import { InMemorySQLiteDatabase, sqliteConnection } from '../connection'; import { type DiscountApplied, type PricedProductItem, @@ -16,111 +18,155 @@ import { type ShoppingCartEvent, } from '../testing/shoppingCart.domain'; import { createEventStoreSchema } from './schema'; -import { getSQLiteEventStore } from './SQLiteEventStore'; - -void describe('EventStoreDBEventStore', () => { - let db: SQLiteConnection; - let conn: sqlite3.Database; - - beforeEach(() => { - conn = new sqlite3.Database(':memory:'); - db = sqliteConnection(conn); - }); +import { + getSQLiteEventStore, + type SQLiteEventStoreOptions, +} from './SQLiteEventStore'; + +void describe('SQLiteEventStore', () => { + const testDatabasePath = path.resolve( + path.dirname(fileURLToPath(import.meta.url)), + '..', + 'testing', + ); + const fileName = path.resolve(testDatabasePath, 'test.db'); afterEach(() => { - conn.close(); + if (!fs.existsSync(fileName)) { + return; + } + fs.unlinkSync(fileName); }); - void it('should append events', async () => { - await createEventStoreSchema(db); - const eventStore = getSQLiteEventStore(db); - - const productItem: PricedProductItem = { - productId: '123', - quantity: 10, - price: 3, + void describe('With manual Schema Creation', () => { + const config: SQLiteEventStoreOptions = { + schema: { + autoMigration: 'None', + }, + fileName, }; - const discount = 10; - const shoppingCartId = `shopping_cart-${uuid()}`; - const result = await eventStore.appendToStream( - shoppingCartId, - [{ type: 'ProductItemAdded', data: { productItem } }], - ); - - const result2 = await eventStore.appendToStream( - shoppingCartId, - [{ type: 'ProductItemAdded', data: { productItem } }], - { expectedStreamVersion: result.nextExpectedStreamVersion }, - ); - - await eventStore.appendToStream( - shoppingCartId, - [ - { - type: 'DiscountApplied', - data: { percent: discount, couponId: uuid() }, - }, - ], - { expectedStreamVersion: result2.nextExpectedStreamVersion }, - ); + beforeEach(() => createEventStoreSchema(sqliteConnection({ fileName }))); - const { events } = await eventStore.readStream(shoppingCartId); + void it('should append events', async () => { + const eventStore = getSQLiteEventStore(config); - assertIsNotNull(events); - assertEqual(3, events.length); - }); + const productItem: PricedProductItem = { + productId: '123', + quantity: 10, + price: 3, + }; + const discount = 10; + const shoppingCartId = `shopping_cart-${uuid()}`; - void it('should aggregate stream', async () => { - await createEventStoreSchema(db); - const eventStore = getSQLiteEventStore(db); + const result = await eventStore.appendToStream( + shoppingCartId, + [{ type: 'ProductItemAdded', data: { productItem } }], + ); - const productItem: PricedProductItem = { - productId: '123', - quantity: 10, - price: 3, - }; - const discount = 10; - const shoppingCartId = `shopping_cart-${uuid()}`; + const result2 = await eventStore.appendToStream( + shoppingCartId, + [{ type: 'ProductItemAdded', data: { productItem } }], + { expectedStreamVersion: result.nextExpectedStreamVersion }, + ); - const result = await eventStore.appendToStream( - shoppingCartId, - [{ type: 'ProductItemAdded', data: { productItem } }], - ); - - const result2 = await eventStore.appendToStream( - shoppingCartId, - [{ type: 'ProductItemAdded', data: { productItem } }], - { expectedStreamVersion: result.nextExpectedStreamVersion }, - ); - - await eventStore.appendToStream( - shoppingCartId, - [ - { - type: 'DiscountApplied', - data: { percent: discount, couponId: uuid() }, - }, - ], - { expectedStreamVersion: result2.nextExpectedStreamVersion }, - ); + await eventStore.appendToStream( + shoppingCartId, + [ + { + type: 'DiscountApplied', + data: { percent: discount, couponId: uuid() }, + }, + ], + { expectedStreamVersion: result2.nextExpectedStreamVersion }, + ); - const aggregation = await eventStore.aggregateStream(shoppingCartId, { - evolve, - initialState: () => null, + const { events } = await eventStore.readStream(shoppingCartId); + + assertIsNotNull(events); + assertEqual(3, events.length); }); - assertDeepEqual( - { totalAmount: 54, productItemsCount: 20 }, - aggregation.state, - ); + void it('should aggregate stream', async () => { + const eventStore = getSQLiteEventStore(config); + + const productItem: PricedProductItem = { + productId: '123', + quantity: 10, + price: 3, + }; + const discount = 10; + const shoppingCartId = `shopping_cart-${uuid()}`; + + const result = await eventStore.appendToStream( + shoppingCartId, + [{ type: 'ProductItemAdded', data: { productItem } }], + ); + + const result2 = await eventStore.appendToStream( + shoppingCartId, + [{ type: 'ProductItemAdded', data: { productItem } }], + { expectedStreamVersion: result.nextExpectedStreamVersion }, + ); + + await eventStore.appendToStream( + shoppingCartId, + [ + { + type: 'DiscountApplied', + data: { percent: discount, couponId: uuid() }, + }, + ], + { expectedStreamVersion: result2.nextExpectedStreamVersion }, + ); + + const aggregation = await eventStore.aggregateStream(shoppingCartId, { + evolve, + initialState: () => null, + }); + + assertDeepEqual( + { totalAmount: 54, productItemsCount: 20 }, + aggregation.state, + ); + }); + + void it('should throw an error if concurrency check has failed when appending stream', async () => { + const eventStore = getSQLiteEventStore(config); + + const productItem: PricedProductItem = { + productId: '123', + quantity: 10, + price: 3, + }; + + const shoppingCartId = `shopping_cart-${uuid()}`; + + await assertThrowsAsync>( + async () => { + await eventStore.appendToStream( + shoppingCartId, + [ + { + type: 'ProductItemAdded', + data: { productItem }, + }, + ], + { + expectedStreamVersion: 5n, + }, + ); + }, + ); + }); }); void it('should automatically create schema', async () => { - const eventStore = getSQLiteEventStore(db, { + const eventStore = getSQLiteEventStore({ schema: { autoMigration: 'CreateOrUpdate', }, + fileName, }); const productItem: PricedProductItem = { @@ -141,13 +187,13 @@ void describe('EventStoreDBEventStore', () => { assertEqual(1, events.length); }); - void it('should not overwrite event store if it exists', async () => { - const eventStore = getSQLiteEventStore(db, { + void it('should create the sqlite connection in memory, and not close the connection', async () => { + const eventStore = getSQLiteEventStore({ schema: { autoMigration: 'CreateOrUpdate', }, + fileName: InMemorySQLiteDatabase, }); - const productItem: PricedProductItem = { productId: '123', quantity: 10, @@ -164,23 +210,14 @@ void describe('EventStoreDBEventStore', () => { assertIsNotNull(events); assertEqual(1, events.length); - - const sameEventStore = getSQLiteEventStore(db, { - schema: { - autoMigration: 'CreateOrUpdate', - }, - }); - - const stream = await sameEventStore.readStream(shoppingCartId); - assertIsNotNull(stream.events); - assertEqual(1, stream.events.length); }); - void it('should throw an error if concurrency check has failed when appending stream', async () => { - const eventStore = getSQLiteEventStore(db, { + void it('should not overwrite event store if it exists', async () => { + const eventStore = getSQLiteEventStore({ schema: { autoMigration: 'CreateOrUpdate', }, + fileName, }); const productItem: PricedProductItem = { @@ -191,20 +228,25 @@ void describe('EventStoreDBEventStore', () => { const shoppingCartId = `shopping_cart-${uuid()}`; - await assertThrowsAsync>(async () => { - await eventStore.appendToStream( - shoppingCartId, - [ - { - type: 'ProductItemAdded', - data: { productItem }, - }, - ], - { - expectedStreamVersion: 5n, - }, - ); + await eventStore.appendToStream(shoppingCartId, [ + { type: 'ProductItemAdded', data: { productItem } }, + ]); + + const { events } = await eventStore.readStream(shoppingCartId); + + assertIsNotNull(events); + assertEqual(1, events.length); + const sameEventStore = getSQLiteEventStore({ + schema: { + autoMigration: 'CreateOrUpdate', + }, + fileName, }); + + const stream = await sameEventStore.readStream(shoppingCartId); + + assertIsNotNull(stream.events); + assertEqual(1, stream.events.length); }); }); diff --git a/src/packages/emmett-sqlite/src/eventStore/SQLiteEventStore.ts b/src/packages/emmett-sqlite/src/eventStore/SQLiteEventStore.ts index a3fc826d..33a205ed 100644 --- a/src/packages/emmett-sqlite/src/eventStore/SQLiteEventStore.ts +++ b/src/packages/emmett-sqlite/src/eventStore/SQLiteEventStore.ts @@ -1,6 +1,9 @@ import type { + AppendToStreamResultWithGlobalPosition, + BeforeEventStoreCommitHandler, BigIntStreamPosition, Event, + ProjectionRegistration, ReadEvent, ReadEventMetadataWithGlobalPosition, } from '@event-driven-io/emmett'; @@ -12,12 +15,19 @@ import { type AggregateStreamOptions, type AggregateStreamResult, type AppendToStreamOptions, - type AppendToStreamResult, type EventStore, type ReadStreamOptions, type ReadStreamResult, } from '@event-driven-io/emmett'; -import type { SQLiteConnection } from '../sqliteConnection'; +import { + InMemorySQLiteDatabase, + sqliteConnection, + type SQLiteConnection, +} from '../connection'; +import { + handleProjections, + type SQLiteProjectionHandlerContext, +} from './projections'; import { createEventStoreSchema } from './schema'; import { appendToStream } from './schema/appendToStream'; import { readStream } from './schema/readStream'; @@ -38,29 +48,92 @@ export type SQLiteReadEvent = ReadEvent< >; export type SQLiteEventStoreOptions = { + // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents + fileName: InMemorySQLiteDatabase | string | undefined; + projections?: ProjectionRegistration< + 'inline', + SQLiteReadEventMetadata, + SQLiteProjectionHandlerContext + >[]; schema?: { autoMigration?: 'None' | 'CreateOrUpdate'; }; + hooks?: { + /** + * This hook will be called **BEFORE** events were stored in the event store. + * @type {BeforeEventStoreCommitHandler} + */ + onBeforeCommit?: BeforeEventStoreCommitHandler< + SQLiteEventStore, + { connection: SQLiteConnection } + >; + }; }; export const getSQLiteEventStore = ( - db: SQLiteConnection, - options?: SQLiteEventStoreOptions, + options: SQLiteEventStoreOptions, ): SQLiteEventStore => { let schemaMigrated = false; - let autoGenerateSchema = false; + let database: SQLiteConnection | null; + const fileName = options.fileName ?? InMemorySQLiteDatabase; + + const isInMemory: boolean = fileName === InMemorySQLiteDatabase; + + const inlineProjections = (options.projections ?? []) + .filter(({ type }) => type === 'inline') + .map(({ projection }) => projection); + + const onBeforeCommitHook = options.hooks?.onBeforeCommit; + + const createConnection = () => { + if (database != null) { + return database; + } + + return sqliteConnection({ + fileName, + }); + }; + + const closeConnection = () => { + if (isInMemory) { + return; + } + if (database != null) { + database.close(); + database = null; + } + }; + + const withConnection = async ( + handler: (db: SQLiteConnection) => Promise, + ): Promise => { + if (database == null) { + database = createConnection(); + } + + try { + await ensureSchemaExists(database); + return await handler(database); + } finally { + closeConnection(); + } + }; + if (options) { autoGenerateSchema = options.schema?.autoMigration === undefined || options.schema?.autoMigration !== 'None'; } - const ensureSchemaExists = async (): Promise => { + const ensureSchemaExists = async ( + connection: SQLiteConnection, + ): Promise => { if (!autoGenerateSchema) return Promise.resolve(); if (!schemaMigrated) { - await createEventStoreSchema(db); + await createEventStoreSchema(connection); schemaMigrated = true; } @@ -83,9 +156,16 @@ export const getSQLiteEventStore = ( let state = initialState(); if (typeof streamName !== 'string') { - throw new Error('not string'); + throw new Error('Stream name is not string'); } - const result = await this.readStream(streamName, options.read); + + if (database == null) { + database = createConnection(); + } + + const result = await withConnection((db) => + readStream(db, streamName, options.read), + ); const currentStreamVersion = result.currentStreamVersion; @@ -113,29 +193,37 @@ export const getSQLiteEventStore = ( options?: ReadStreamOptions, ): Promise< ReadStreamResult - > => { - await ensureSchemaExists(); - return await readStream(db, streamName, options); - }, + > => withConnection((db) => readStream(db, streamName, options)), appendToStream: async ( streamName: string, events: EventType[], options?: AppendToStreamOptions, - ): Promise => { - await ensureSchemaExists(); + ): Promise => { + if (database == null) { + database = createConnection(); + } + // TODO: This has to be smarter when we introduce urn-based resolution const [firstPart, ...rest] = streamName.split('-'); const streamType = firstPart && rest.length > 0 ? firstPart : 'emt:unknown'; - const appendResult = await appendToStream( - db, - streamName, - streamType, - events, - options, + const appendResult = await withConnection((db) => + appendToStream(db, streamName, streamType, events, { + ...options, + onBeforeCommit: async (messages, context) => { + if (inlineProjections.length > 0) + await handleProjections({ + projections: inlineProjections, + events: messages, + ...context, + }); + + if (onBeforeCommitHook) await onBeforeCommitHook(messages, context); + }, + }), ); if (!appendResult.success) diff --git a/src/packages/emmett-sqlite/src/eventStore/db.sqlite b/src/packages/emmett-sqlite/src/eventStore/db.sqlite new file mode 100644 index 00000000..aa387b9a Binary files /dev/null and b/src/packages/emmett-sqlite/src/eventStore/db.sqlite differ diff --git a/src/packages/emmett-sqlite/src/eventStore/index.ts b/src/packages/emmett-sqlite/src/eventStore/index.ts new file mode 100644 index 00000000..dcfaf52f --- /dev/null +++ b/src/packages/emmett-sqlite/src/eventStore/index.ts @@ -0,0 +1,2 @@ +export * from './schema'; +export * from './SQLiteEventStore'; diff --git a/src/packages/emmett-sqlite/src/eventStore/projections/index.ts b/src/packages/emmett-sqlite/src/eventStore/projections/index.ts new file mode 100644 index 00000000..4c0f2953 --- /dev/null +++ b/src/packages/emmett-sqlite/src/eventStore/projections/index.ts @@ -0,0 +1,98 @@ +import { + projection, + type CanHandle, + type Event, + type ProjectionDefinition, + type ProjectionHandler, + type ReadEvent, +} from '@event-driven-io/emmett'; +import type { SQLiteConnection } from '../../connection'; +import type { SQLiteReadEventMetadata } from '../SQLiteEventStore'; + +export type SQLiteProjectionHandlerContext = { + connection: SQLiteConnection; +}; + +export type SQLiteProjectionHandler< + EventType extends Event = Event, + EventMetaDataType extends SQLiteReadEventMetadata = SQLiteReadEventMetadata, +> = ProjectionHandler< + EventType, + EventMetaDataType, + SQLiteProjectionHandlerContext +>; + +export type SQLiteProjectionDefinition = + ProjectionDefinition< + EventType, + SQLiteReadEventMetadata, + SQLiteProjectionHandlerContext + >; + +export type SQLiteProjectionHandlerOptions = { + events: ReadEvent[]; + projections: SQLiteProjectionDefinition[]; + connection: SQLiteConnection; +}; + +export const handleProjections = async ( + options: SQLiteProjectionHandlerOptions, +): Promise => { + const { projections: allProjections, events, connection } = options; + + const eventTypes = events.map((e) => e.type); + + const projections = allProjections.filter((p) => + p.canHandle.some((type) => eventTypes.includes(type)), + ); + + for (const projection of projections) { + await projection.handle(events, { + connection, + }); + } +}; + +export const sqliteProjection = ( + definition: SQLiteProjectionDefinition, +): SQLiteProjectionDefinition => + projection< + EventType, + SQLiteReadEventMetadata, + SQLiteProjectionHandlerContext + >(definition); + +export const sqliteRawBatchSQLProjection = ( + handle: ( + events: EventType[], + context: SQLiteProjectionHandlerContext, + ) => Promise | string[], + ...canHandle: CanHandle +): SQLiteProjectionDefinition => + sqliteProjection({ + canHandle, + handle: async (events, context) => { + const sqls: string[] = await handle(events, context); + + for (const sql of sqls) await context.connection.command(sql); + }, + }); + +export const sqliteRawSQLProjection = ( + handle: ( + event: EventType, + context: SQLiteProjectionHandlerContext, + ) => Promise | string, + ...canHandle: CanHandle +): SQLiteProjectionDefinition => + sqliteRawBatchSQLProjection( + async (events, context) => { + const sqls: string[] = []; + + for (const event of events) { + sqls.push(await handle(event, context)); + } + return sqls; + }, + ...canHandle, + ); diff --git a/src/packages/emmett-sqlite/src/eventStore/schema/appendToStream.int.spec.ts b/src/packages/emmett-sqlite/src/eventStore/schema/appendToStream.int.spec.ts index 510cfdc0..8cb9d090 100644 --- a/src/packages/emmett-sqlite/src/eventStore/schema/appendToStream.int.spec.ts +++ b/src/packages/emmett-sqlite/src/eventStore/schema/appendToStream.int.spec.ts @@ -4,15 +4,16 @@ import { assertIsNotNull, assertTrue, type Event, + type RecordedMessage, } from '@event-driven-io/emmett'; import { after, before, describe, it } from 'node:test'; -import sqlite3 from 'sqlite3'; import { v4 as uuid } from 'uuid'; import { createEventStoreSchema } from '.'; import { + InMemorySQLiteDatabase, sqliteConnection, type SQLiteConnection, -} from '../../sqliteConnection'; +} from '../../connection'; import { appendToStream } from './appendToStream'; export type PricedProductItem = { @@ -28,25 +29,27 @@ export type ShoppingCart = { export type ProductItemAdded = Event< 'ProductItemAdded', - { productItem: PricedProductItem } + { productItem: PricedProductItem }, + { meta: string } +>; +export type DiscountApplied = Event< + 'DiscountApplied', + { percent: number }, + { meta: string } >; -export type DiscountApplied = Event<'DiscountApplied', { percent: number }>; export type ShoppingCartEvent = ProductItemAdded | DiscountApplied; void describe('appendEvent', () => { let db: SQLiteConnection; - let conn: sqlite3.Database; before(async () => { - conn = new sqlite3.Database(':memory:'); - - db = sqliteConnection(conn); + db = sqliteConnection({ fileName: InMemorySQLiteDatabase }); await createEventStoreSchema(db); }); after(() => { - conn.close(); + db.close(); }); const events: ShoppingCartEvent[] = [ @@ -93,7 +96,7 @@ void describe('appendEvent', () => { await appendToStream(db, streamId, 'shopping_cart', events); const result = await appendToStream(db, streamId, 'shopping_cart', events); const resultEvents = await db.query( - 'SELECT * FROM emt_events WHERE stream_id = $1', + 'SELECT * FROM emt_messages WHERE stream_id = $1', [streamId], ); @@ -131,7 +134,7 @@ void describe('appendEvent', () => { assertFalse(secondResult.success); const resultEvents = await db.query( - 'SELECT * FROM emt_events WHERE stream_id = $1', + 'SELECT * FROM emt_messages WHERE stream_id = $1', [streamId], ); @@ -168,7 +171,7 @@ void describe('appendEvent', () => { assertFalse(secondResult.success); const resultEvents = await db.query( - 'SELECT * FROM emt_events WHERE stream_id = $1', + 'SELECT * FROM emt_messages WHERE stream_id = $1', [streamId], ); @@ -215,7 +218,7 @@ void describe('appendEvent', () => { assertFalse(secondResult.success); const resultEvents = await db.query( - 'SELECT * FROM emt_events WHERE stream_id = $1', + 'SELECT * FROM emt_messages WHERE stream_id = $1', [streamId], ); @@ -253,7 +256,7 @@ void describe('appendEvent', () => { assertTrue(secondResult.success); const resultEvents = await db.query( - 'SELECT * FROM emt_events WHERE stream_id = $1', + 'SELECT * FROM emt_messages WHERE stream_id = $1', [streamId], ); @@ -266,8 +269,8 @@ void describe('appendEvent', () => { let grabbedEvents: Event[] = []; await appendToStream(db, streamId, 'shopping_cart', events, { - preCommitHook: (events: Event[]): void => { - grabbedEvents = events; + onBeforeCommit: (messages: RecordedMessage[]): void => { + grabbedEvents = messages.filter((m) => m.kind === 'Event'); }, }); @@ -279,7 +282,7 @@ void describe('appendEvent', () => { try { await appendToStream(db, streamId, 'shopping_cart', events, { - preCommitHook: (_: Event[]): void => { + onBeforeCommit: (_: RecordedMessage[]): void => { throw new Error('fake error'); }, }); @@ -288,7 +291,7 @@ void describe('appendEvent', () => { } const resultEvents = await db.query( - 'SELECT * FROM emt_events WHERE stream_id = $1', + 'SELECT * FROM emt_messages WHERE stream_id = $1', [streamId], ); diff --git a/src/packages/emmett-sqlite/src/eventStore/schema/appendToStream.ts b/src/packages/emmett-sqlite/src/eventStore/schema/appendToStream.ts index 73309161..4fcff518 100644 --- a/src/packages/emmett-sqlite/src/eventStore/schema/appendToStream.ts +++ b/src/packages/emmett-sqlite/src/eventStore/schema/appendToStream.ts @@ -4,9 +4,10 @@ import { STREAM_DOES_NOT_EXIST, STREAM_EXISTS, type AppendToStreamOptions, - type Event, + type BeforeEventStoreCommitHandler, type ExpectedStreamVersion, - type ReadEvent, + type Event as Message, + type RecordedMessage, } from '@event-driven-io/emmett'; import { v4 as uuid } from 'uuid'; import { @@ -14,8 +15,12 @@ import { type Parameters, type SQLiteConnection, type SQLiteError, -} from '../../sqliteConnection'; -import { defaultTag, eventsTable, streamsTable } from './typing'; +} from '../../connection'; +import type { + SQLiteEventStore, + SQLiteReadEventMetadata, +} from '../SQLiteEventStore'; +import { defaultTag, messagesTable, streamsTable } from './typing'; export type AppendEventResult = | { @@ -25,32 +30,43 @@ export type AppendEventResult = } | { success: false }; -export const appendToStream = async ( +export const appendToStream = async ( db: SQLiteConnection, streamName: string, streamType: string, - events: Event[], + messages: MessageType[], options?: AppendToStreamOptions & { partition?: string; - preCommitHook?: (events: Event[]) => void; + onBeforeCommit?: BeforeEventStoreCommitHandler< + SQLiteEventStore, + { connection: SQLiteConnection } + >; }, ): Promise => { - if (events.length === 0) return { success: false }; + if (messages.length === 0) return { success: false }; const expectedStreamVersion = toExpectedVersion( options?.expectedStreamVersion, ); - const eventsToAppend: ReadEvent[] = events.map( - (e: Event, i: number): ReadEvent => ({ - ...e, - metadata: { - streamName, - eventId: uuid(), - streamPosition: BigInt(i + 1), - ...('metadata' in e ? (e.metadata ?? {}) : {}), - }, - }), + const messagesToAppend: RecordedMessage< + MessageType, + SQLiteReadEventMetadata + >[] = messages.map( + ( + m: Message, + i: number, + ): RecordedMessage => + ({ + ...m, + kind: m.kind ?? 'Event', + metadata: { + streamName, + messageId: uuid(), + streamPosition: BigInt(i + 1), + ...('metadata' in m ? (m.metadata ?? {}) : {}), + }, + }) as RecordedMessage, ); let result: AppendEventResult; @@ -58,11 +74,18 @@ export const appendToStream = async ( await db.command(`BEGIN TRANSACTION`); try { - result = await appendEventsRaw(db, streamName, streamType, eventsToAppend, { - expectedStreamVersion, - }); + result = await appendToStreamRaw( + db, + streamName, + streamType, + messagesToAppend, + { + expectedStreamVersion, + }, + ); - if (options?.preCommitHook) options.preCommitHook(eventsToAppend); + if (options?.onBeforeCommit) + await options.onBeforeCommit(messagesToAppend, { connection: db }); } catch (err: unknown) { await db.command(`ROLLBACK`); throw err; @@ -94,11 +117,11 @@ const toExpectedVersion = ( return expected as bigint; }; -const appendEventsRaw = async ( +const appendToStreamRaw = async ( db: SQLiteConnection, streamId: string, streamType: string, - events: ReadEvent[], + messages: RecordedMessage[], options?: { expectedStreamVersion: bigint | null; partition?: string; @@ -138,7 +161,7 @@ const appendEventsRaw = async ( `, [ streamId, - events.length, + messages.length, options?.partition ?? streamsTable.columns.partition, streamType, ], @@ -155,7 +178,7 @@ const appendEventsRaw = async ( RETURNING stream_position; `, [ - events.length, + messages.length, streamId, options?.partition ?? streamsTable.columns.partition, ], @@ -170,7 +193,7 @@ const appendEventsRaw = async ( if (expectedStreamVersion != null) { const expectedStreamPositionAfterSave = - BigInt(expectedStreamVersion) + BigInt(events.length); + BigInt(expectedStreamVersion) + BigInt(messages.length); if (streamPosition !== expectedStreamPositionAfterSave) { return { success: false, @@ -178,11 +201,10 @@ const appendEventsRaw = async ( } } - const { sqlString, values } = buildEventInsertQuery( - events, + const { sqlString, values } = buildMessageInsertQuery( + messages, expectedStreamVersion, streamId, - streamType, options?.partition?.toString() ?? defaultTag, ); @@ -234,41 +256,41 @@ async function getLastStreamPosition( return expectedStreamVersion; } -const buildEventInsertQuery = ( - events: ReadEvent[], +const buildMessageInsertQuery = ( + messages: RecordedMessage[], expectedStreamVersion: bigint, streamId: string, - streamType: string, partition: string | null | undefined, ): { sqlString: string; values: Parameters[]; } => { - const query = events.reduce( + const query = messages.reduce( ( queryBuilder: { parameterMarkers: string[]; values: Parameters[] }, - event: ReadEvent, + message: RecordedMessage, ) => { if ( - event.metadata?.streamPosition == null || - typeof event.metadata.streamPosition !== 'bigint' + message.metadata?.streamPosition == null || + typeof message.metadata.streamPosition !== 'bigint' ) { throw new Error('Stream position is required'); } const streamPosition = - BigInt(event.metadata.streamPosition) + BigInt(expectedStreamVersion); + BigInt(message.metadata.streamPosition) + BigInt(expectedStreamVersion); - queryBuilder.parameterMarkers.push(`(?,?,?,?,?,?,?,?,?)`); + queryBuilder.parameterMarkers.push(`(?,?,?,?,?,?,?,?,?,?)`); queryBuilder.values.push( streamId, streamPosition.toString() ?? 0, partition ?? defaultTag, - JSONParser.stringify(event.data), - JSONParser.stringify(event.metadata), + message.kind === 'Event' ? 'E' : 'C', + JSONParser.stringify(message.data), + JSONParser.stringify(message.metadata), expectedStreamVersion?.toString() ?? 0, - event.type, - event.metadata.eventId, + message.type, + message.metadata.messageId, false, ); @@ -281,15 +303,16 @@ const buildEventInsertQuery = ( ); const sqlString = ` - INSERT INTO ${eventsTable.name} ( + INSERT INTO ${messagesTable.name} ( stream_id, stream_position, partition, - event_data, - event_metadata, - event_schema_version, - event_type, - event_id, + message_kind, + message_data, + message_metadata, + message_schema_version, + message_type, + message_id, is_archived ) VALUES ${query.parameterMarkers.join(', ')} diff --git a/src/packages/emmett-sqlite/src/eventStore/schema/createEventStoreSchema.int.spec.ts b/src/packages/emmett-sqlite/src/eventStore/schema/createEventStoreSchema.int.spec.ts index 30c9c76a..7bbebc61 100644 --- a/src/packages/emmett-sqlite/src/eventStore/schema/createEventStoreSchema.int.spec.ts +++ b/src/packages/emmett-sqlite/src/eventStore/schema/createEventStoreSchema.int.spec.ts @@ -1,10 +1,10 @@ import assert from 'assert'; import { after, before, describe, it } from 'node:test'; -import sqlite3 from 'sqlite3'; import { + InMemorySQLiteDatabase, sqliteConnection, type SQLiteConnection, -} from '../../sqliteConnection'; +} from '../../connection'; import { createEventStoreSchema } from '../schema'; type TableExists = { @@ -23,19 +23,16 @@ const tableExists = async ( }; void describe('createEventStoreSchema', () => { - let conn: sqlite3.Database; let db: SQLiteConnection; before(async () => { - conn = new sqlite3.Database(':memory:'); - - db = sqliteConnection(conn); + db = sqliteConnection({ fileName: InMemorySQLiteDatabase }); await createEventStoreSchema(db); }); after(() => { - conn.close(); + db.close(); }); void describe('creates tables', () => { @@ -44,7 +41,7 @@ void describe('createEventStoreSchema', () => { }); void it('creates the events table', async () => { - assert.ok(await tableExists(db, 'emt_events')); + assert.ok(await tableExists(db, 'emt_messages')); }); }); }); diff --git a/src/packages/emmett-sqlite/src/eventStore/schema/index.ts b/src/packages/emmett-sqlite/src/eventStore/schema/index.ts index d7068d6c..bf5634f3 100644 --- a/src/packages/emmett-sqlite/src/eventStore/schema/index.ts +++ b/src/packages/emmett-sqlite/src/eventStore/schema/index.ts @@ -1,14 +1,4 @@ -import { type SQLiteConnection } from '../../sqliteConnection'; -import { eventsTableSQL, streamsTableSQL } from './tables'; - +export * from './appendToStream'; +export * from './readStream'; export * from './tables'; - -export const schemaSQL: string[] = [streamsTableSQL, eventsTableSQL]; - -export const createEventStoreSchema = async ( - db: SQLiteConnection, -): Promise => { - for (const sql of schemaSQL) { - await db.command(sql); - } -}; +export * from './typing'; diff --git a/src/packages/emmett-sqlite/src/eventStore/schema/readStream.int.spec.ts b/src/packages/emmett-sqlite/src/eventStore/schema/readStream.int.spec.ts index 95b611f3..d3893641 100644 --- a/src/packages/emmett-sqlite/src/eventStore/schema/readStream.int.spec.ts +++ b/src/packages/emmett-sqlite/src/eventStore/schema/readStream.int.spec.ts @@ -6,13 +6,13 @@ import { type Event, } from '@event-driven-io/emmett'; import { after, before, describe, it } from 'node:test'; -import sqlite3 from 'sqlite3'; import { v4 as uuid } from 'uuid'; import { createEventStoreSchema } from '.'; import { + InMemorySQLiteDatabase, sqliteConnection, type SQLiteConnection, -} from '../../sqliteConnection'; +} from '../../connection'; import { appendToStream } from './appendToStream'; import { readStream } from './readStream'; @@ -29,25 +29,27 @@ export type ShoppingCart = { export type ProductItemAdded = Event< 'ProductItemAdded', - { productItem: PricedProductItem } + { productItem: PricedProductItem }, + { meta: string } +>; +export type DiscountApplied = Event< + 'DiscountApplied', + { percent: number }, + { meta: string } >; -export type DiscountApplied = Event<'DiscountApplied', { percent: number }>; export type ShoppingCartEvent = ProductItemAdded | DiscountApplied; void describe('appendEvent', () => { let db: SQLiteConnection; - let conn: sqlite3.Database; before(async () => { - conn = new sqlite3.Database(':memory:'); - - db = sqliteConnection(conn); + db = sqliteConnection({ fileName: InMemorySQLiteDatabase }); await createEventStoreSchema(db); }); after(() => { - conn.close(); + db.close(); }); const events: ShoppingCartEvent[] = [ diff --git a/src/packages/emmett-sqlite/src/eventStore/schema/readStream.ts b/src/packages/emmett-sqlite/src/eventStore/schema/readStream.ts index 43d18cfc..9067ba09 100644 --- a/src/packages/emmett-sqlite/src/eventStore/schema/readStream.ts +++ b/src/packages/emmett-sqlite/src/eventStore/schema/readStream.ts @@ -1,26 +1,23 @@ import { - event, JSONParser, + type CombinedReadEventMetadata, type Event, - type EventDataOf, - type EventMetaDataOf, - type EventTypeOf, type ReadEvent, type ReadEventMetadataWithGlobalPosition, type ReadStreamOptions, type ReadStreamResult, } from '@event-driven-io/emmett'; -import { type SQLiteConnection } from '../../sqliteConnection'; +import { type SQLiteConnection } from '../../connection'; import { SQLiteEventStoreDefaultStreamVersion } from '../SQLiteEventStore'; -import { defaultTag, eventsTable } from './typing'; +import { defaultTag, messagesTable } from './typing'; -type ReadStreamSqlResult = { +type ReadStreamSqlResult = { stream_position: string; - event_data: EventDataOf; - event_metadata: EventMetaDataOf; - event_schema_version: string; - event_type: EventTypeOf; - event_id: string; + message_data: string; + message_metadata: string; + message_schema_version: string; + message_type: string; + message_id: string; global_position: string; created: string; }; @@ -47,38 +44,45 @@ export const readStream = async ( const toCondition = !isNaN(to) ? `AND stream_position <= ${to}` : ''; - const results = await db.query>( - `SELECT stream_id, stream_position, global_position, event_data, event_metadata, event_schema_version, event_type, event_id - FROM ${eventsTable.name} + const results = await db.query( + `SELECT stream_id, stream_position, global_position, message_data, message_metadata, message_schema_version, message_type, message_id + FROM ${messagesTable.name} WHERE stream_id = ? AND partition = ? AND is_archived = FALSE ${fromCondition} ${toCondition}`, [streamId, options?.partition ?? defaultTag], ); - const events: ReadEvent[] = + const messages: ReadEvent[] = results.map((row) => { - const rawEvent = event( - row.event_type, - JSONParser.parse(row.event_data), - JSONParser.parse(row.event_metadata), - ); + const rawEvent = { + type: row.message_type, + data: JSONParser.parse(row.message_data), + metadata: JSONParser.parse(row.message_metadata), + } as unknown as EventType; + + const metadata: ReadEventMetadataWithGlobalPosition = { + ...('metadata' in rawEvent ? (rawEvent.metadata ?? {}) : {}), + messageId: row.message_id, + streamName: streamId, + streamPosition: BigInt(row.stream_position), + globalPosition: BigInt(row.global_position), + }; return { ...rawEvent, - metadata: { - ...('metadata' in rawEvent ? (rawEvent.metadata ?? {}) : {}), - eventId: row.event_id, - streamName: streamId, - streamPosition: BigInt(row.stream_position), - globalPosition: BigInt(row.global_position), - }, + kind: 'Event', + metadata: metadata as CombinedReadEventMetadata< + EventType, + ReadEventMetadataWithGlobalPosition + >, }; }); - return events.length > 0 + return messages.length > 0 ? { currentStreamVersion: - events[events.length - 1]!.metadata.streamPosition, - events, + messages[messages.length - 1]!.metadata.streamPosition, + events: messages, + streamExists: true, } : { currentStreamVersion: SQLiteEventStoreDefaultStreamVersion, diff --git a/src/packages/emmett-sqlite/src/eventStore/schema/tables.ts b/src/packages/emmett-sqlite/src/eventStore/schema/tables.ts index 888e55fb..2ab89efa 100644 --- a/src/packages/emmett-sqlite/src/eventStore/schema/tables.ts +++ b/src/packages/emmett-sqlite/src/eventStore/schema/tables.ts @@ -1,4 +1,5 @@ -import { eventsTable, globalTag, streamsTable } from './typing'; +import type { SQLiteConnection } from '../../connection'; +import { globalTag, messagesTable, streamsTable } from './typing'; export const sql = (sql: string) => sql; @@ -6,7 +7,7 @@ export const streamsTableSQL = sql( `CREATE TABLE IF NOT EXISTS ${streamsTable.name}( stream_id TEXT NOT NULL, stream_position BIGINT NOT NULL DEFAULT 0, - partition TEXT NOT NULL DEFAULT '${globalTag}__${globalTag}', + partition TEXT NOT NULL DEFAULT '${globalTag}', stream_type TEXT NOT NULL, stream_metadata JSONB NOT NULL, is_archived BOOLEAN NOT NULL DEFAULT FALSE, @@ -15,16 +16,17 @@ export const streamsTableSQL = sql( );`, ); -export const eventsTableSQL = sql( - `CREATE TABLE IF NOT EXISTS ${eventsTable.name}( +export const messagesTableSQL = sql( + `CREATE TABLE IF NOT EXISTS ${messagesTable.name}( stream_id TEXT NOT NULL, stream_position BIGINT NOT NULL, partition TEXT NOT NULL DEFAULT '${globalTag}', - event_data JSONB NOT NULL, - event_metadata JSONB NOT NULL, - event_schema_version TEXT NOT NULL, - event_type TEXT NOT NULL, - event_id TEXT NOT NULL, + message_kind CHAR(1) NOT NULL DEFAULT 'E', + message_data JSONB NOT NULL, + message_metadata JSONB NOT NULL, + message_schema_version TEXT NOT NULL, + message_type TEXT NOT NULL, + message_id TEXT NOT NULL, is_archived BOOLEAN NOT NULL DEFAULT FALSE, global_position INTEGER PRIMARY KEY, created DATETIME DEFAULT CURRENT_TIMESTAMP, @@ -32,3 +34,13 @@ export const eventsTableSQL = sql( ); `, ); + +export const schemaSQL: string[] = [streamsTableSQL, messagesTableSQL]; + +export const createEventStoreSchema = async ( + db: SQLiteConnection, +): Promise => { + for (const sql of schemaSQL) { + await db.command(sql); + } +}; diff --git a/src/packages/emmett-sqlite/src/eventStore/schema/typing.ts b/src/packages/emmett-sqlite/src/eventStore/schema/typing.ts index d1b13a9a..2608a9f9 100644 --- a/src/packages/emmett-sqlite/src/eventStore/schema/typing.ts +++ b/src/packages/emmett-sqlite/src/eventStore/schema/typing.ts @@ -22,8 +22,8 @@ export const streamsTable = { }, }; -export const eventsTable = { - name: `${emmettPrefix}_events`, +export const messagesTable = { + name: `${emmettPrefix}_messages`, columns: { partition: columns.partition, isArchived: columns.isArchived, diff --git a/src/packages/emmett-sqlite/src/index.ts b/src/packages/emmett-sqlite/src/index.ts index e69de29b..8cd0777e 100644 --- a/src/packages/emmett-sqlite/src/index.ts +++ b/src/packages/emmett-sqlite/src/index.ts @@ -0,0 +1,2 @@ +export * from './connection'; +export * from './eventStore'; diff --git a/src/packages/emmett-testcontainers/package.json b/src/packages/emmett-testcontainers/package.json index f7b51134..9435c9be 100644 --- a/src/packages/emmett-testcontainers/package.json +++ b/src/packages/emmett-testcontainers/package.json @@ -1,6 +1,6 @@ { "name": "@event-driven-io/emmett-testcontainers", - "version": "0.26.0", + "version": "0.34.0", "type": "module", "description": "Emmett - TestContainers - Event Sourcing development made simple", "scripts": { @@ -47,7 +47,7 @@ "dist" ], "dependencies": { - "@event-driven-io/emmett": "0.26.0", + "@event-driven-io/emmett": "0.34.0", "testcontainers": "^10.12.0" }, "devDependencies": { diff --git a/src/packages/emmett-tests/package.json b/src/packages/emmett-tests/package.json index 76a4d4c9..ccc55991 100644 --- a/src/packages/emmett-tests/package.json +++ b/src/packages/emmett-tests/package.json @@ -2,7 +2,7 @@ "name": "@event-driven-io/emmett-tests", "type": "module", "private": true, - "version": "0.26.0", + "version": "0.34.0", "description": "Emmett - Internal E2E Tests", "scripts": { "build": "tsup", @@ -55,10 +55,11 @@ "dist" ], "devDependencies": { - "@event-driven-io/emmett": "0.26.0", - "@event-driven-io/emmett-esdb": "0.26.0", - "@event-driven-io/emmett-postgresql": "0.26.0", - "@event-driven-io/emmett-testcontainers": "0.26.0", + "@event-driven-io/emmett": "0.34.0", + "@event-driven-io/emmett-esdb": "0.34.0", + "@event-driven-io/emmett-sqlite": "0.34.0", + "@event-driven-io/emmett-postgresql": "0.34.0", + "@event-driven-io/emmett-testcontainers": "0.34.0", "@testcontainers/postgresql": "^10.12.0" } } diff --git a/src/packages/emmett-tests/src/eventStore/postgresql/postgreSQLEventStore.e2e.spec.ts b/src/packages/emmett-tests/src/eventStore/postgresql/postgreSQLEventStore.e2e.spec.ts index 502b6859..b56e9dd1 100644 --- a/src/packages/emmett-tests/src/eventStore/postgresql/postgreSQLEventStore.e2e.spec.ts +++ b/src/packages/emmett-tests/src/eventStore/postgresql/postgreSQLEventStore.e2e.spec.ts @@ -2,7 +2,6 @@ import { assertDeepEqual, assertEqual, assertIsNotNull, - projections, type ReadEvent, } from '@event-driven-io/emmett'; import { @@ -36,10 +35,10 @@ void describe('EventStoreDBEventStore', async () => { postgres = await new PostgreSqlContainer().start(); connectionString = postgres.getConnectionUri(); eventStore = getPostgreSQLEventStore(connectionString, { - projections: projections.inline([ - shoppingCartShortInfoProjection, - customProjection, - ]), + projections: [ + { type: 'inline', projection: shoppingCartShortInfoProjection }, + { type: 'inline', projection: customProjection }, + ], }); pongo = pongoClient(connectionString); return eventStore; diff --git a/src/packages/emmett-tests/src/eventStore/shoppingCart.domain.ts b/src/packages/emmett-tests/src/eventStore/shoppingCart.domain.ts index a77260dc..da263f51 100644 --- a/src/packages/emmett-tests/src/eventStore/shoppingCart.domain.ts +++ b/src/packages/emmett-tests/src/eventStore/shoppingCart.domain.ts @@ -38,7 +38,7 @@ export const evolve = ( case 'DiscountApplied': return { ...state, - totalAmount: state.totalAmount * (1 - data.percent / 100), + totalAmount: Math.max(state.totalAmount * (1 - data.percent / 100), 0), }; } }; diff --git a/src/packages/emmett-tests/tsconfig.json b/src/packages/emmett-tests/tsconfig.json index 943f6f5f..be0ee341 100644 --- a/src/packages/emmett-tests/tsconfig.json +++ b/src/packages/emmett-tests/tsconfig.json @@ -9,6 +9,7 @@ "@event-driven-io/emmett": ["../packages/emmett"], "@event-driven-io/emmett-esdb": ["../packages/emmett-esdb"], "@event-driven-io/emmett-postgresql": ["../packages/emmett-postgresql"], + "@event-driven-io/emmett-sqlite": ["../packages/emmett-sqlite"], "@event-driven-io/emmett-mongodb": ["../packages/emmett-mongodb"], "@event-driven-io/emmett-testcontainers": [ "../packages/emmett-testcontainers" @@ -25,6 +26,9 @@ { "path": "../emmett-postgresql/" }, + { + "path": "../emmett-sqlite/" + }, { "path": "../emmett-mongodb/" }, diff --git a/src/packages/emmett/package.json b/src/packages/emmett/package.json index 9b1047db..01b0668f 100644 --- a/src/packages/emmett/package.json +++ b/src/packages/emmett/package.json @@ -1,7 +1,7 @@ { "name": "@event-driven-io/emmett", "type": "module", - "version": "0.26.0", + "version": "0.34.0", "description": "Emmett - Event Sourcing development made simple", "scripts": { "build": "tsup", diff --git a/src/packages/emmett/src/database/inMemoryDatabase.ts b/src/packages/emmett/src/database/inMemoryDatabase.ts new file mode 100644 index 00000000..54a75653 --- /dev/null +++ b/src/packages/emmett/src/database/inMemoryDatabase.ts @@ -0,0 +1,314 @@ +import { v7 as uuid } from 'uuid'; +import { deepEquals } from '../utils'; +import { + type DeleteResult, + type Document, + type DocumentHandler, + type HandleOptionErrors, + type HandleOptions, + type HandleResult, + type InsertOneResult, + type OptionalUnlessRequiredIdAndVersion, + type ReplaceOneOptions, + type UpdateResult, + type WithoutId, + type WithIdAndVersion, +} from './types'; +import { expectedVersionValue, operationResult } from './utils'; + +export interface DocumentsCollection { + handle: ( + id: string, + handle: DocumentHandler, + options?: HandleOptions, + ) => HandleResult; + findOne: (predicate?: Predicate) => T | null; + insertOne: ( + document: OptionalUnlessRequiredIdAndVersion, + ) => InsertOneResult; + deleteOne: (predicate?: Predicate) => DeleteResult; + replaceOne: ( + predicate: Predicate, + document: WithoutId, + options?: ReplaceOneOptions, + ) => UpdateResult; +} + +export interface Database { + collection: (name: string) => DocumentsCollection; +} + +type Predicate = (item: T) => boolean; + +export const getInMemoryDatabase = (): Database => { + const storage = new Map[]>(); + + return { + collection: ( + collectionName: string, + collectionOptions: { + errors?: HandleOptionErrors; + } = {}, + ): DocumentsCollection => { + const ensureCollectionCreated = () => { + if (!storage.has(collectionName)) storage.set(collectionName, []); + }; + + const errors = collectionOptions.errors; + + const collection = { + collectionName, + insertOne: ( + document: OptionalUnlessRequiredIdAndVersion, + ): InsertOneResult => { + ensureCollectionCreated(); + + const _id = (document._id as string | undefined | null) ?? uuid(); + const _version = document._version ?? 1n; + + const existing = collection.findOne((c) => c._id === _id); + + if (existing) { + return operationResult( + { + successful: false, + insertedId: null, + nextExpectedVersion: _version, + }, + { operationName: 'insertOne', collectionName, errors }, + ); + } + + const documentsInCollection = storage.get(collectionName)!; + const newDocument = { ...document, _id, _version }; + const newCollection = [...documentsInCollection, newDocument]; + storage.set(collectionName, newCollection); + + return operationResult( + { + successful: true, + insertedId: _id, + nextExpectedVersion: _version, + }, + { operationName: 'insertOne', collectionName, errors }, + ); + }, + findOne: (predicate?: Predicate): T | null => { + ensureCollectionCreated(); + + const documentsInCollection = storage.get(collectionName); + const filteredDocuments = predicate + ? documentsInCollection?.filter((doc) => predicate(doc as T)) + : documentsInCollection; + + const firstOne = filteredDocuments?.[0] ?? null; + + return firstOne as T | null; + }, + deleteOne: (predicate?: Predicate): DeleteResult => { + ensureCollectionCreated(); + + const documentsInCollection = storage.get(collectionName)!; + + if (predicate) { + const foundIndex = documentsInCollection.findIndex((doc) => + predicate(doc as T), + ); + + if (foundIndex === -1) { + return operationResult( + { + successful: false, + matchedCount: 0, + deletedCount: 0, + }, + { operationName: 'deleteOne', collectionName, errors }, + ); + } else { + const newCollection = documentsInCollection.toSpliced( + foundIndex, + 1, + ); + + storage.set(collectionName, newCollection); + + return operationResult( + { + successful: true, + matchedCount: 1, + deletedCount: 1, + }, + { operationName: 'deleteOne', collectionName, errors }, + ); + } + } else { + const newCollection = documentsInCollection.slice(1); + + storage.set(collectionName, newCollection); + + return operationResult( + { + successful: true, + matchedCount: 1, + deletedCount: 1, + }, + { operationName: 'deleteOne', collectionName, errors }, + ); + } + }, + replaceOne: ( + predicate: Predicate, + document: WithoutId, + options?: ReplaceOneOptions, + ): UpdateResult => { + ensureCollectionCreated(); + + const documentsInCollection = storage.get(collectionName)!; + + const foundIndexes = documentsInCollection + .filter((doc) => predicate(doc as T)) + .map((_, index) => index); + + const firstIndex = foundIndexes[0]; + + if (!firstIndex || firstIndex === -1) { + return operationResult( + { + successful: false, + matchedCount: 0, + modifiedCount: 0, + nextExpectedVersion: 0n, + }, + { operationName: 'replaceOne', collectionName, errors }, + ); + } + + const existing = documentsInCollection[firstIndex]!; + + if ( + typeof options?.expectedVersion === 'bigint' && + existing._version !== options.expectedVersion + ) { + return operationResult( + { + successful: false, + matchedCount: 1, + modifiedCount: 0, + nextExpectedVersion: existing._version, + }, + { operationName: 'replaceOne', collectionName, errors }, + ); + } + + const newVersion = existing._version + 1n; + + const newCollection = documentsInCollection.with(firstIndex, { + _id: existing._id, + ...document, + _version: newVersion, + }); + + storage.set(collectionName, newCollection); + + return operationResult( + { + successful: true, + modifiedCount: 1, + matchedCount: foundIndexes.length, + nextExpectedVersion: newVersion, + }, + { operationName: 'replaceOne', collectionName, errors }, + ); + }, + handle: ( + id: string, + handle: DocumentHandler, + options?: HandleOptions, + ): HandleResult => { + const { expectedVersion: version, ...operationOptions } = + options ?? {}; + ensureCollectionCreated(); + const existing = collection.findOne((c) => c.id === id); + + const expectedVersion = expectedVersionValue(version); + + if ( + (existing == null && version === 'DOCUMENT_EXISTS') || + (existing == null && expectedVersion != null) || + (existing != null && version === 'DOCUMENT_DOES_NOT_EXIST') || + (existing != null && + expectedVersion !== null && + existing._version !== expectedVersion) + ) { + return operationResult>( + { + successful: false, + document: existing as WithIdAndVersion, + }, + { operationName: 'handle', collectionName, errors }, + ); + } + + const result = handle(existing !== null ? { ...existing } : null); + + if (deepEquals(existing, result)) + return operationResult>( + { + successful: true, + document: existing as WithIdAndVersion, + }, + { operationName: 'handle', collectionName, errors }, + ); + + if (!existing && result) { + const newDoc = { ...result, _id: id }; + const insertResult = collection.insertOne({ + ...newDoc, + _id: id, + } as OptionalUnlessRequiredIdAndVersion); + return { + ...insertResult, + document: { + ...newDoc, + _version: insertResult.nextExpectedVersion, + } as unknown as WithIdAndVersion, + }; + } + + if (existing && !result) { + const deleteResult = collection.deleteOne(({ _id }) => id === _id); + return { ...deleteResult, document: null }; + } + + if (existing && result) { + const replaceResult = collection.replaceOne( + ({ _id }) => id === _id, + result, + { + ...operationOptions, + expectedVersion: expectedVersion ?? 'DOCUMENT_EXISTS', + }, + ); + return { + ...replaceResult, + document: { + ...result, + _version: replaceResult.nextExpectedVersion, + } as unknown as WithIdAndVersion, + }; + } + + return operationResult>( + { + successful: true, + document: existing as WithIdAndVersion, + }, + { operationName: 'handle', collectionName, errors }, + ); + }, + }; + + return collection; + }, + }; +}; diff --git a/src/packages/emmett/src/database/inMemoryDatabase.unit.spec.ts b/src/packages/emmett/src/database/inMemoryDatabase.unit.spec.ts new file mode 100644 index 00000000..fd51f4ad --- /dev/null +++ b/src/packages/emmett/src/database/inMemoryDatabase.unit.spec.ts @@ -0,0 +1,105 @@ +import { describe, it } from 'node:test'; +import { getInMemoryDatabase } from './inMemoryDatabase'; +import { equal } from 'node:assert'; + +type TestUser = { + name: string; + age: number; +}; + +void describe('inMemoryDatabase', () => { + void it('should correctly insertOne document', () => { + const db = getInMemoryDatabase(); + + const collection = db.collection('test'); + + const result = collection.insertOne({ age: 10, name: 'test' }); + + equal(result.successful, true); + }); + + void it('should not allow inserting one with id that already is there', () => { + const db = getInMemoryDatabase(); + + const collection = db.collection('test'); + + const result = collection.insertOne({ age: 10, name: 'test' }); + + const result2 = collection.insertOne({ + age: 10, + name: 'test', + _id: result.insertedId!, + }); + + equal(result2.successful, false); + }); + + void it('return first record found when using findOne without parameters', () => { + const db = getInMemoryDatabase(); + + const collection = db.collection('test'); + + collection.insertOne({ age: 10, name: 'test' }); + collection.insertOne({ age: 15, name: 'test2' }); + + const result = collection.findOne(); + + equal(result!.name, 'test'); + }); + + void it('should return the correct one found', () => { + const db = getInMemoryDatabase(); + + const collection = db.collection('test'); + + collection.insertOne({ age: 10, name: 'test' }); + collection.insertOne({ age: 15, name: 'test2' }); + + const result = collection.findOne((c) => c.age === 15); + + equal(result!.name, 'test2'); + }); + + void it('should return null when not found', () => { + const db = getInMemoryDatabase(); + + const collection = db.collection('test'); + + collection.insertOne({ age: 10, name: 'test' }); + collection.insertOne({ age: 15, name: 'test2' }); + + const result = collection.findOne((c) => c.age === 20); + + equal(result, null); + }); + + void it('should correctly delete one', () => { + const db = getInMemoryDatabase(); + + const collection = db.collection('test'); + + collection.insertOne({ age: 10, name: 'test' }); + collection.insertOne({ age: 15, name: 'test2' }); + + const deleteResult = collection.deleteOne((c) => c.age === 15); + const found = collection.findOne((c) => c.age === 15); + + equal(deleteResult.deletedCount, 1); + equal(found, null); + }); + + void it('should delete first one when no parameter passed to deleteOne', () => { + const db = getInMemoryDatabase(); + + const collection = db.collection('test'); + + collection.insertOne({ age: 10, name: 'test' }); + collection.insertOne({ age: 15, name: 'test2' }); + + const deleteResult = collection.deleteOne(); + const found = collection.findOne((c) => c.age === 10); + + equal(deleteResult.deletedCount, 1); + equal(found, null); + }); +}); diff --git a/src/packages/emmett/src/database/index.ts b/src/packages/emmett/src/database/index.ts new file mode 100644 index 00000000..5b574168 --- /dev/null +++ b/src/packages/emmett/src/database/index.ts @@ -0,0 +1 @@ +export * from './inMemoryDatabase'; diff --git a/src/packages/emmett/src/database/types.ts b/src/packages/emmett/src/database/types.ts new file mode 100644 index 00000000..5c970fd0 --- /dev/null +++ b/src/packages/emmett/src/database/types.ts @@ -0,0 +1,158 @@ +/** TypeScript Omit (Exclude to be specific) does not work for objects with an "any" indexed type, and breaks discriminated unions @public */ +export declare type EnhancedOmit = + string extends keyof TRecordOrUnion + ? TRecordOrUnion + : // eslint-disable-next-line @typescript-eslint/no-explicit-any + TRecordOrUnion extends any + ? Pick> + : never; + +export declare type WithId = EnhancedOmit & { + _id: string; +}; +export type WithoutId = Omit; + +export declare type WithVersion = EnhancedOmit & { + _version: bigint; +}; +export type WithoutVersion = Omit; + +export type WithIdAndVersion = EnhancedOmit< + TSchema, + '_version' | '_id' +> & { + _id: string; + _version: bigint; +}; + +export type Document = Record; + +export type DocumentHandler = ( + document: T | null, +) => T | null; + +export type ExpectedDocumentVersionGeneral = + | 'DOCUMENT_EXISTS' + | 'DOCUMENT_DOES_NOT_EXIST' + | 'NO_CONCURRENCY_CHECK'; + +export type ExpectedDocumentVersion = bigint | ExpectedDocumentVersionGeneral; + +export type ExpectedDocumentVersionValue = bigint; + +export type HandleOptions = { + expectedVersion?: ExpectedDocumentVersion; +}; + +export type OperationResult = { + acknowledged: boolean; + successful: boolean; + + assertSuccessful: (errorMessage?: string) => void; +}; + +export interface InsertOneResult extends OperationResult { + insertedId: string | null; + nextExpectedVersion: bigint; +} + +export interface InsertManyResult extends OperationResult { + insertedIds: string[]; + insertedCount: number; +} + +export interface UpdateResult extends OperationResult { + matchedCount: number; + modifiedCount: number; + nextExpectedVersion: bigint; +} + +export interface UpdateManyResult extends OperationResult { + matchedCount: number; + modifiedCount: number; +} + +export interface DeleteResult extends OperationResult { + matchedCount: number; + deletedCount: number; +} + +export interface DeleteManyResult extends OperationResult { + deletedCount: number; +} + +export type HandleResult = + | (InsertOneResult & { document: WithIdAndVersion }) + | (UpdateResult & { document: WithIdAndVersion }) + | (DeleteResult & { document: null }) + | (OperationResult & { document: null }); + +export type HandleOptionErrors = + | { throwOnOperationFailures?: boolean } + | undefined; + +export declare type OptionalId = EnhancedOmit & { + _id?: string; +}; + +export declare type OptionalVersion = EnhancedOmit< + TSchema, + '_version' +> & { + _version?: bigint; +}; + +export declare type OptionalUnlessRequiredId = TSchema extends { + _id: string; +} + ? TSchema + : OptionalId; + +export declare type OptionalUnlessRequiredVersion = TSchema extends { + _version: bigint; +} + ? TSchema + : OptionalVersion; + +export declare type OptionalUnlessRequiredIdAndVersion = + OptionalUnlessRequiredId & OptionalUnlessRequiredVersion; + +export type InsertOneOptions = { + expectedVersion?: Extract< + ExpectedDocumentVersion, + 'DOCUMENT_DOES_NOT_EXIST' | 'NO_CONCURRENCY_CHECK' + >; +}; + +export type InsertManyOptions = { + expectedVersion?: Extract< + ExpectedDocumentVersion, + 'DOCUMENT_DOES_NOT_EXIST' | 'NO_CONCURRENCY_CHECK' + >; +}; + +export type UpdateOneOptions = { + expectedVersion?: Exclude; +}; + +export type UpdateManyOptions = { + expectedVersion?: Extract< + ExpectedDocumentVersion, + 'DOCUMENT_EXISTS' | 'NO_CONCURRENCY_CHECK' + >; +}; + +export type ReplaceOneOptions = { + expectedVersion?: Exclude; +}; + +export type DeleteOneOptions = { + expectedVersion?: Exclude; +}; + +export type DeleteManyOptions = { + expectedVersion?: Extract< + ExpectedDocumentVersion, + 'DOCUMENT_EXISTS' | 'NO_CONCURRENCY_CHECK' + >; +}; diff --git a/src/packages/emmett/src/database/utils.ts b/src/packages/emmett/src/database/utils.ts new file mode 100644 index 00000000..9702e0be --- /dev/null +++ b/src/packages/emmett/src/database/utils.ts @@ -0,0 +1,56 @@ +import { ConcurrencyInMemoryDatabaseError } from '../errors'; +import { JSONParser } from '../serialization'; +import type { + ExpectedDocumentVersion, + ExpectedDocumentVersionGeneral, + ExpectedDocumentVersionValue, + HandleOptionErrors, + OperationResult, +} from './types'; + +export const isGeneralExpectedDocumentVersion = ( + version: ExpectedDocumentVersion | undefined, +): version is ExpectedDocumentVersionGeneral => { + return ( + version === 'DOCUMENT_DOES_NOT_EXIST' || + version === 'DOCUMENT_EXISTS' || + version === 'NO_CONCURRENCY_CHECK' + ); +}; + +export const expectedVersionValue = ( + version: ExpectedDocumentVersion | undefined, +): ExpectedDocumentVersionValue | null => + version === undefined || isGeneralExpectedDocumentVersion(version) + ? null + : version; + +export const operationResult = ( + result: Omit, + options: { + operationName: string; + collectionName: string; + errors?: HandleOptionErrors; + }, +): T => { + const operationResult: T = { + ...result, + acknowledged: true, + successful: result.successful, + assertSuccessful: (errorMessage?: string) => { + const { successful } = result; + const { operationName, collectionName } = options; + + if (!successful) + throw new ConcurrencyInMemoryDatabaseError( + errorMessage ?? + `${operationName} on ${collectionName} failed. Expected document state does not match current one! Result: ${JSONParser.stringify(result)}!`, + ); + }, + } as T; + + if (options.errors?.throwOnOperationFailures) + operationResult.assertSuccessful(); + + return operationResult; +}; diff --git a/src/packages/emmett/src/errors/index.ts b/src/packages/emmett/src/errors/index.ts index 0e830d75..7ef0b254 100644 --- a/src/packages/emmett/src/errors/index.ts +++ b/src/packages/emmett/src/errors/index.ts @@ -63,6 +63,18 @@ export class ConcurrencyError extends EmmettError { } } +export class ConcurrencyInMemoryDatabaseError extends EmmettError { + constructor(message?: string) { + super({ + errorCode: 412, + message: message ?? `Expected document state does not match current one!`, + }); + + // 👇️ because we are extending a built-in class + Object.setPrototypeOf(this, ConcurrencyInMemoryDatabaseError.prototype); + } +} + export class ValidationError extends EmmettError { constructor(message?: string) { super({ diff --git a/src/packages/emmett/src/eventStore/afterCommit/afterEventStoreCommitHandler.ts b/src/packages/emmett/src/eventStore/afterCommit/afterEventStoreCommitHandler.ts index c36013b5..bffa0862 100644 --- a/src/packages/emmett/src/eventStore/afterCommit/afterEventStoreCommitHandler.ts +++ b/src/packages/emmett/src/eventStore/afterCommit/afterEventStoreCommitHandler.ts @@ -5,6 +5,10 @@ type AfterEventStoreCommitHandlerWithoutContext = ( messages: ReadEvent>[], ) => Promise | void; +type BeforeEventStoreCommitHandlerWithoutContext = ( + messages: ReadEvent>[], +) => Promise | void; + export type AfterEventStoreCommitHandler< Store extends EventStore, HandlerContext = never, @@ -15,6 +19,16 @@ export type AfterEventStoreCommitHandler< context: HandlerContext, ) => Promise | void; +export type BeforeEventStoreCommitHandler< + Store extends EventStore, + HandlerContext = never, +> = [HandlerContext] extends [never] + ? BeforeEventStoreCommitHandlerWithoutContext + : ( + messages: ReadEvent>[], + context: HandlerContext, + ) => Promise | void; + type TryPublishMessagesAfterCommitOptions< Store extends EventStore, HandlerContext = never, diff --git a/src/packages/emmett/src/eventStore/afterCommit/afterEventStoreCommitHandler.unit.spec.ts b/src/packages/emmett/src/eventStore/afterCommit/afterEventStoreCommitHandler.unit.spec.ts index d7c91c84..d6f6f1da 100644 --- a/src/packages/emmett/src/eventStore/afterCommit/afterEventStoreCommitHandler.unit.spec.ts +++ b/src/packages/emmett/src/eventStore/afterCommit/afterEventStoreCommitHandler.unit.spec.ts @@ -31,22 +31,24 @@ void describe('InMemoryEventStore onAfterCommit', () => { let counter = 0; const events: TestReadEvent[] = [ { + kind: 'Event', type: 'test', data: { counter: ++counter }, metadata: { some: true, - eventId: uuid(), + messageId: uuid(), globalPosition: 1n, streamName, streamPosition: 1n, }, }, { + kind: 'Event', type: 'test', data: { counter: ++counter }, metadata: { some: false, - eventId: uuid(), + messageId: uuid(), globalPosition: 1n, streamName, streamPosition: 1n, @@ -76,22 +78,24 @@ void describe('InMemoryEventStore onAfterCommit', () => { let counter = 0; const events: TestReadEvent[] = [ { + kind: 'Event', type: 'test', data: { counter: ++counter }, metadata: { some: true, - eventId: uuid(), + messageId: uuid(), globalPosition: 1n, streamName, streamPosition: 1n, }, }, { + kind: 'Event', type: 'test', data: { counter: ++counter }, metadata: { some: false, - eventId: uuid(), + messageId: uuid(), globalPosition: 1n, streamName, streamPosition: 1n, @@ -100,22 +104,24 @@ void describe('InMemoryEventStore onAfterCommit', () => { ]; const nextEvents: TestReadEvent[] = [ { + kind: 'Event', type: 'test', data: { counter: ++counter }, metadata: { some: true, - eventId: uuid(), + messageId: uuid(), globalPosition: 1n, streamName, streamPosition: 1n, }, }, { + kind: 'Event', type: 'test', data: { counter: ++counter }, metadata: { some: false, - eventId: uuid(), + messageId: uuid(), globalPosition: 1n, streamName, streamPosition: 1n, @@ -152,22 +158,24 @@ void describe('InMemoryEventStore onAfterCommit', () => { let counter = 0; const events: TestReadEvent[] = [ { + kind: 'Event', type: 'test', data: { counter: ++counter }, metadata: { some: true, - eventId: uuid(), + messageId: uuid(), globalPosition: 1n, streamName, streamPosition: 1n, }, }, { + kind: 'Event', type: 'test', data: { counter: ++counter }, metadata: { some: false, - eventId: uuid(), + messageId: uuid(), globalPosition: 1n, streamName, streamPosition: 1n, diff --git a/src/packages/emmett/src/eventStore/afterCommit/forwardToMessageBus.unit.spec.ts b/src/packages/emmett/src/eventStore/afterCommit/forwardToMessageBus.unit.spec.ts index 47a3e9e2..710e80b4 100644 --- a/src/packages/emmett/src/eventStore/afterCommit/forwardToMessageBus.unit.spec.ts +++ b/src/packages/emmett/src/eventStore/afterCommit/forwardToMessageBus.unit.spec.ts @@ -33,22 +33,24 @@ void describe('InMemoryEventStore onAfterCommit', () => { let counter = 0; const events: TestReadEvent[] = [ { + kind: 'Event', type: 'test', data: { counter: ++counter }, metadata: { some: true, - eventId: uuid(), + messageId: uuid(), globalPosition: 1n, streamName, streamPosition: 1n, }, }, { + kind: 'Event', type: 'test', data: { counter: ++counter }, metadata: { some: false, - eventId: uuid(), + messageId: uuid(), globalPosition: 1n, streamName, streamPosition: 1n, @@ -79,22 +81,24 @@ void describe('InMemoryEventStore onAfterCommit', () => { let counter = 0; const events: TestReadEvent[] = [ { + kind: 'Event', type: 'test', data: { counter: ++counter }, metadata: { some: true, - eventId: uuid(), + messageId: uuid(), globalPosition: 1n, streamName, streamPosition: 1n, }, }, { + kind: 'Event', type: 'test', data: { counter: ++counter }, metadata: { some: false, - eventId: uuid(), + messageId: uuid(), globalPosition: 1n, streamName, streamPosition: 1n, @@ -103,22 +107,24 @@ void describe('InMemoryEventStore onAfterCommit', () => { ]; const nextEvents: TestReadEvent[] = [ { + kind: 'Event', type: 'test', data: { counter: ++counter }, metadata: { some: true, - eventId: uuid(), + messageId: uuid(), globalPosition: 1n, streamName, streamPosition: 1n, }, }, { + kind: 'Event', type: 'test', data: { counter: ++counter }, metadata: { some: false, - eventId: uuid(), + messageId: uuid(), globalPosition: 1n, streamName, streamPosition: 1n, @@ -151,22 +157,24 @@ void describe('InMemoryEventStore onAfterCommit', () => { let counter = 0; const events: TestReadEvent[] = [ { + kind: 'Event', type: 'test', data: { counter: ++counter }, metadata: { some: true, - eventId: uuid(), + messageId: uuid(), globalPosition: 1n, streamName, streamPosition: 1n, }, }, { + kind: 'Event', type: 'test', data: { counter: ++counter }, metadata: { some: false, - eventId: uuid(), + messageId: uuid(), globalPosition: 1n, streamName, streamPosition: 1n, diff --git a/src/packages/emmett/src/eventStore/inMemoryEventStore.ts b/src/packages/emmett/src/eventStore/inMemoryEventStore.ts index 2cd93e97..c793b1a5 100644 --- a/src/packages/emmett/src/eventStore/inMemoryEventStore.ts +++ b/src/packages/emmett/src/eventStore/inMemoryEventStore.ts @@ -19,14 +19,27 @@ import { } from './eventStore'; import { assertExpectedVersionMatchesCurrent } from './expectedVersion'; import { StreamingCoordinator } from './subscriptions'; +import type { ProjectionRegistration } from '../projections'; export const InMemoryEventStoreDefaultStreamVersion = 0n; export type InMemoryEventStore = EventStore; +export type InMemoryReadEventMetadata = ReadEventMetadataWithGlobalPosition; + +export type InMemoryProjectionHandlerContext = { + eventStore: InMemoryEventStore; +}; + export type InMemoryEventStoreOptions = - DefaultEventStoreOptions; + DefaultEventStoreOptions & { + projections?: ProjectionRegistration< + 'inline', + InMemoryReadEventMetadata, + InMemoryProjectionHandlerContext + >[]; + }; export type InMemoryReadEvent = ReadEvent< EventType, @@ -48,6 +61,10 @@ export const getInMemoryEventStore = ( .reduce((p, c) => p + c, 0); }; + const _inlineProjections = (eventStoreOptions?.projections ?? []) + .filter(({ type }) => type === 'inline') + .map(({ projection }) => projection); + return { async aggregateStream( streamName: string, @@ -144,12 +161,13 @@ export const getInMemoryEventStore = ( >[] = events.map((event, index) => { const metadata: ReadEventMetadataWithGlobalPosition = { streamName, - eventId: uuid(), + messageId: uuid(), streamPosition: BigInt(currentEvents.length + index + 1), globalPosition: BigInt(getAllEventsCount() + index + 1), }; return { ...event, + kind: event.kind ?? 'Event', metadata: { ...('metadata' in event ? (event.metadata ?? {}) : {}), ...metadata, diff --git a/src/packages/emmett/src/eventStore/subscriptions/caughtUpTransformStream.unit.spec.ts b/src/packages/emmett/src/eventStore/subscriptions/caughtUpTransformStream.unit.spec.ts index 7a7336a3..afb324f6 100644 --- a/src/packages/emmett/src/eventStore/subscriptions/caughtUpTransformStream.unit.spec.ts +++ b/src/packages/emmett/src/eventStore/subscriptions/caughtUpTransformStream.unit.spec.ts @@ -22,9 +22,10 @@ void describe('CaughtUpTransformStream', () => { globalPosition: bigint, ): ReadEvent => ({ type: 'ShoppingCartOpened', + kind: 'Event', data: { cartId: 'cartId' }, metadata: { - eventId: uuid(), + messageId: uuid(), globalPosition, streamPosition: globalPosition, streamName: 'test', diff --git a/src/packages/emmett/src/eventStore/subscriptions/streamingCoordinator.unit.spec.ts b/src/packages/emmett/src/eventStore/subscriptions/streamingCoordinator.unit.spec.ts index 1473c185..5cecbe50 100644 --- a/src/packages/emmett/src/eventStore/subscriptions/streamingCoordinator.unit.spec.ts +++ b/src/packages/emmett/src/eventStore/subscriptions/streamingCoordinator.unit.spec.ts @@ -159,10 +159,11 @@ const createMockEvent = ( position: bigint, ): ReadEvent => ({ type: 'Mocked', + kind: 'Event', data: { mocked: true }, metadata: { streamName: 'testStream', - eventId: `event-${position}`, + messageId: `message-${position}`, streamPosition: position, globalPosition: position, }, diff --git a/src/packages/emmett/src/index.ts b/src/packages/emmett/src/index.ts index 920d6ac2..75bdf603 100644 --- a/src/packages/emmett/src/index.ts +++ b/src/packages/emmett/src/index.ts @@ -1,5 +1,6 @@ export * from './commandHandling'; export * from './config'; +export * from './database'; export * from './errors'; export * from './eventStore'; export * from './messageBus'; diff --git a/src/packages/emmett/src/projections/index.ts b/src/packages/emmett/src/projections/index.ts index 7958261c..18d55003 100644 --- a/src/packages/emmett/src/projections/index.ts +++ b/src/packages/emmett/src/projections/index.ts @@ -1,6 +1,7 @@ import { EmmettError } from '../errors'; import { JSONParser } from '../serialization'; import type { + AnyEvent, AnyReadEventMetadata, CanHandle, DefaultRecord, @@ -21,19 +22,6 @@ export type ProjectionHandler< ) => Promise | void; export interface ProjectionDefinition< - ReadEventMetadataType extends AnyReadEventMetadata = AnyReadEventMetadata, - ProjectionHandlerContext extends DefaultRecord = DefaultRecord, -> { - name?: string; - canHandle: CanHandle; - handle: ProjectionHandler< - Event, - ReadEventMetadataType, - ProjectionHandlerContext - >; -} - -export interface TypedProjectionDefinition< EventType extends Event = Event, EventMetaDataType extends AnyReadEventMetadata = AnyReadEventMetadata, ProjectionHandlerContext extends DefaultRecord = DefaultRecord, @@ -54,6 +42,7 @@ export type ProjectionRegistration< > = { type: HandlingType; projection: ProjectionDefinition< + AnyEvent, ReadEventMetadataType, ProjectionHandlerContext >; @@ -93,48 +82,55 @@ export const projection = < EventType extends Event = Event, EventMetaDataType extends AnyReadEventMetadata = AnyReadEventMetadata, ProjectionHandlerContext extends DefaultRecord = DefaultRecord, - ProjectionDefintionType extends TypedProjectionDefinition< - EventType, - EventMetaDataType, - ProjectionHandlerContext - > = TypedProjectionDefinition< +>( + definition: ProjectionDefinition< EventType, EventMetaDataType, ProjectionHandlerContext >, ->( - definition: ProjectionDefintionType, -): ProjectionDefintionType => definition; +): ProjectionDefinition< + EventType, + EventMetaDataType, + ProjectionHandlerContext +> => definition; export const inlineProjections = < ReadEventMetadataType extends AnyReadEventMetadata = AnyReadEventMetadata, ProjectionHandlerContext extends DefaultRecord = DefaultRecord, - ProjectionDefintionType extends ProjectionDefinition< +>( + definitions: ProjectionDefinition< + AnyEvent, ReadEventMetadataType, ProjectionHandlerContext - > = ProjectionDefinition, ->( - definitions: ProjectionDefintionType[], + >[], ): ProjectionRegistration< 'inline', ReadEventMetadataType, ProjectionHandlerContext ->[] => definitions.map((projection) => ({ type: 'inline', projection })); +>[] => + definitions.map((definition) => ({ + type: 'inline', + projection: definition, + })); export const asyncProjections = < ReadEventMetadataType extends AnyReadEventMetadata = AnyReadEventMetadata, ProjectionHandlerContext extends DefaultRecord = DefaultRecord, - ProjectionDefintionType extends ProjectionDefinition< +>( + definitions: ProjectionDefinition< + AnyEvent, ReadEventMetadataType, ProjectionHandlerContext - > = ProjectionDefinition, ->( - definitions: ProjectionDefintionType[], + >[], ): ProjectionRegistration< - 'async', + 'inline', ReadEventMetadataType, ProjectionHandlerContext ->[] => definitions.map((projection) => ({ type: 'async', projection })); +>[] => + definitions.map((definition) => ({ + type: 'inline', + projection: definition, + })); export const projections = { inline: inlineProjections, diff --git a/src/packages/emmett/src/testing/deciderSpecification.async.unit.spec.ts b/src/packages/emmett/src/testing/deciderSpecification.async.unit.spec.ts new file mode 100644 index 00000000..f22e26ed --- /dev/null +++ b/src/packages/emmett/src/testing/deciderSpecification.async.unit.spec.ts @@ -0,0 +1,231 @@ +import { describe, it } from 'node:test'; +import { IllegalStateError, ValidationError } from '../errors'; +import { AssertionError, assertTrue } from '../testing/assertions'; +import { type Command, type Event } from '../typing'; +import { DeciderSpecification } from './deciderSpecification'; + +type DoSomething = Command<'Do', { something: string }>; +type SomethingHappened = Event<'Did', { something: string }>; +type Entity = { something: string }; + +const decide = async ( + { data: { something } }: DoSomething, + _entity: Entity, +): Promise => { + const event: SomethingHappened = { type: 'Did', data: { something } }; + + if (something === 'Ignore!') return []; + if (something === 'Array!') return [event]; + if (something !== 'Yes!') throw new IllegalStateError('Nope!'); + + return Promise.resolve(event); +}; + +const initialState = (): Entity => ({ something: 'Meh' }); + +const evolve = (_entity: Entity, _event: SomethingHappened): Entity => ({ + something: 'Nothing', +}); + +const given = DeciderSpecification.for({ + decide: decide, + evolve, + initialState: initialState, +}); + +void describe('AsyncDeciderSpecification', () => { + void describe('then', () => { + void it('then fails if returns event, but assertion has an empty array', async () => { + try { + await given([]) + .when({ + type: 'Do', + data: { + something: 'Yes!', + }, + }) + .then([]); + } catch (error) { + assertTrue( + error instanceof AssertionError && + error.message === + `Arrays lengths don't match:\nExpected: 1\nActual: 0`, + ); + } + }); + }); + + void describe('thenNothingHappened', () => { + void it('thenNothingHappened succeeds if returns empty array', async () => { + await given([]) + .when({ + type: 'Do', + data: { + something: 'Ignore!', + }, + }) + .thenNothingHappened(); + }); + + void it('thenNothingHappened fails if returns event', async () => { + try { + await given([]) + .when({ + type: 'Do', + data: { + something: 'Yes!', + }, + }) + .thenNothingHappened(); + } catch (error) { + assertTrue( + error instanceof AssertionError && + error.message === + `Array is not empty [{"type":"Did","data":{"something":"Yes!"}}]:\nExpected: 1\nActual: 0`, + ); + } + }); + + void it('thenNothingHappened fails if returns array of events', async () => { + try { + await given([]) + .when({ + type: 'Do', + data: { + something: 'Array!', + }, + }) + .thenNothingHappened(); + } catch (error) { + assertTrue( + error instanceof AssertionError && + error.message === + `Array is not empty [{"type":"Did","data":{"something":"Array!"}}]:\nExpected: 1\nActual: 0`, + ); + } + }); + }); + + void describe('thenThrows', () => { + void it('check error was thrown', async () => { + await given([]) + .when({ + type: 'Do', + data: { + something: 'Nope!', + }, + }) + .thenThrows(); + }); + + void it('checks error condition', async () => { + await given([]) + .when({ + type: 'Do', + data: { + something: 'Nope!', + }, + }) + .thenThrows((error) => error.message === 'Nope!'); + }); + + void it('checks error type', async () => { + await given([]) + .when({ + type: 'Do', + data: { + something: 'Nope!', + }, + }) + .thenThrows(IllegalStateError); + }); + + void it('checks error type and condition', async () => { + await given([]) + .when({ + type: 'Do', + data: { + something: 'Nope!', + }, + }) + .thenThrows(IllegalStateError, (error) => error.message === 'Nope!'); + }); + + void it('fails if no error was thrown', async () => { + try { + await given([]) + .when({ + type: 'Do', + data: { + something: 'Yes!', + }, + }) + .thenThrows(); + } catch (error) { + assertTrue( + error instanceof AssertionError && + error.message === 'Handler did not fail as expected', + ); + } + }); + + void it('fails if wrong error type', async () => { + try { + await given([]) + .when({ + type: 'Do', + data: { + something: 'Nope!', + }, + }) + .thenThrows(ValidationError); + } catch (error) { + assertTrue( + error instanceof AssertionError && + error.message.startsWith( + 'Caught error is not an instance of the expected type:', + ), + ); + } + }); + + void it('fails if wrong error type and correct condition', async () => { + try { + await given([]) + .when({ + type: 'Do', + data: { + something: 'Nope!', + }, + }) + .thenThrows(ValidationError, (error) => error.message === 'Nope!'); + } catch (error) { + assertTrue( + error instanceof AssertionError && + error.message.startsWith( + 'Caught error is not an instance of the expected type:', + ), + ); + } + }); + + void it('fails if correct error type but wrong correct condition', async () => { + try { + await given([]) + .when({ + type: 'Do', + data: { + something: 'Nope!', + }, + }) + .thenThrows(IllegalStateError, (error) => error.message !== 'Nope!'); + } catch (error) { + assertTrue( + error instanceof AssertionError && + error.message === + `Error didn't match the error condition: Error: Nope!`, + ); + } + }); + }); +}); diff --git a/src/packages/emmett/src/testing/deciderSpecification.ts b/src/packages/emmett/src/testing/deciderSpecification.ts index cb07440c..03e67592 100644 --- a/src/packages/emmett/src/testing/deciderSpecification.ts +++ b/src/packages/emmett/src/testing/deciderSpecification.ts @@ -12,7 +12,7 @@ export type ThenThrows = errorCheck?: ErrorCheck, ) => void); -export type DeciderSpecfication = ( +export type DeciderSpecification = ( givenEvents: Event | Event[], ) => { when: (command: Command) => { @@ -23,91 +23,155 @@ export type DeciderSpecfication = ( ) => void; }; }; +export type AsyncDeciderSpecification = ( + givenEvents: Event | Event[], +) => { + when: (command: Command) => { + then: (expectedEvents: Event | Event[]) => Promise; + thenNothingHappened: () => Promise; + thenThrows: ( + ...args: Parameters> + ) => Promise; + }; +}; export const DeciderSpecification = { - for: (decider: { - decide: (command: Command, state: State) => Event | Event[]; - evolve: (state: State, event: Event) => State; - initialState: () => State; - }): DeciderSpecfication => { - { - return (givenEvents: Event | Event[]) => { - return { - when: (command: Command) => { - const handle = () => { - const existingEvents = Array.isArray(givenEvents) - ? givenEvents - : [givenEvents]; - - const currentState = existingEvents.reduce( - decider.evolve, - decider.initialState(), - ); - - return decider.decide(command, currentState); - }; - - return { - then: (expectedEvents: Event | Event[]): void => { - const resultEvents = handle(); - - const resultEventsArray = Array.isArray(resultEvents) - ? resultEvents - : [resultEvents]; - - const expectedEventsArray = Array.isArray(expectedEvents) - ? expectedEvents - : [expectedEvents]; - - assertThatArray(resultEventsArray).containsOnlyElementsMatching( - expectedEventsArray, - ); - }, - thenNothingHappened: (): void => { - const resultEvents = handle(); - - const resultEventsArray = Array.isArray(resultEvents) - ? resultEvents - : [resultEvents]; - - assertThatArray(resultEventsArray).isEmpty(); - }, - thenThrows: ( - ...args: Parameters> - ): void => { - try { - handle(); - throw new AssertionError('Handler did not fail as expected'); - } catch (error) { - if (error instanceof AssertionError) throw error; - - if (args.length === 0) return; - - if (!isErrorConstructor(args[0])) { - assertTrue( - args[0](error as ErrorType), - `Error didn't match the error condition: ${error?.toString()}`, - ); - return; - } - - assertTrue( - error instanceof args[0], - `Caught error is not an instance of the expected type: ${error?.toString()}`, - ); - - if (args[1]) { - assertTrue( - args[1](error as ErrorType), - `Error didn't match the error condition: ${error?.toString()}`, - ); - } + for: deciderSpecificationFor, +}; + +function deciderSpecificationFor(decider: { + decide: (command: Command, state: State) => Event | Event[]; + evolve: (state: State, event: Event) => State; + initialState: () => State; +}): DeciderSpecification; +function deciderSpecificationFor(decider: { + decide: (command: Command, state: State) => Promise; + evolve: (state: State, event: Event) => State; + initialState: () => State; +}): AsyncDeciderSpecification; +function deciderSpecificationFor(decider: { + decide: ( + command: Command, + state: State, + ) => Event | Event[] | Promise; + evolve: (state: State, event: Event) => State; + initialState: () => State; +}): + | DeciderSpecification + | AsyncDeciderSpecification { + { + return (givenEvents: Event | Event[]) => { + return { + when: (command: Command) => { + const handle = () => { + const existingEvents = Array.isArray(givenEvents) + ? givenEvents + : [givenEvents]; + + const currentState = existingEvents.reduce( + decider.evolve, + decider.initialState(), + ); + + return decider.decide(command, currentState); + }; + + return { + then: (expectedEvents: Event | Event[]): void | Promise => { + const resultEvents = handle(); + + if (resultEvents instanceof Promise) { + return resultEvents.then((events) => { + thenHandler(events, expectedEvents); + }); + } + + thenHandler(resultEvents, expectedEvents); + }, + thenNothingHappened: (): void | Promise => { + const resultEvents = handle(); + + if (resultEvents instanceof Promise) { + return resultEvents.then((events) => { + thenNothingHappensHandler(events); + }); + } + + thenNothingHappensHandler(resultEvents); + }, + thenThrows: ( + ...args: Parameters> + ): void | Promise => { + try { + const result = handle(); + if (result instanceof Promise) { + return result + .then(() => { + throw new AssertionError( + 'Handler did not fail as expected', + ); + }) + .catch((error) => { + thenThrowsErrorHandler(error, args); + }); } - }, - }; - }, - }; + throw new AssertionError('Handler did not fail as expected'); + } catch (error) { + thenThrowsErrorHandler(error, args); + } + }, + }; + }, }; - } - }, -}; + }; + } +} + +function thenHandler( + events: Event | Event[], + expectedEvents: Event | Event[], +): void { + const resultEventsArray = Array.isArray(events) ? events : [events]; + + const expectedEventsArray = Array.isArray(expectedEvents) + ? expectedEvents + : [expectedEvents]; + + assertThatArray(resultEventsArray).containsOnlyElementsMatching( + expectedEventsArray, + ); +} + +function thenNothingHappensHandler(events: Event | Event[]): void { + const resultEventsArray = Array.isArray(events) ? events : [events]; + assertThatArray(resultEventsArray).isEmpty(); +} + +function thenThrowsErrorHandler( + error: unknown, + args: Parameters>, +): void { + if (error instanceof AssertionError) throw error; + + if (args.length === 0) return; + + if (!isErrorConstructor(args[0])) { + assertTrue( + args[0](error as ErrorType), + `Error didn't match the error condition: ${error?.toString()}`, + ); + return; + } + + assertTrue( + error instanceof args[0], + `Caught error is not an instance of the expected type: ${error?.toString()}`, + ); + + if (args[1]) { + assertTrue( + args[1](error as ErrorType), + `Error didn't match the error condition: ${error?.toString()}`, + ); + } +} diff --git a/src/packages/emmett/src/typing/command.ts b/src/packages/emmett/src/typing/command.ts index 42468142..751a979c 100644 --- a/src/packages/emmett/src/typing/command.ts +++ b/src/packages/emmett/src/typing/command.ts @@ -1,25 +1,22 @@ -import type { DefaultRecord, Flavour } from './'; +import type { DefaultRecord } from './'; export type Command< CommandType extends string = string, CommandData extends DefaultRecord = DefaultRecord, CommandMetaData extends DefaultRecord | undefined = undefined, -> = Flavour< - Readonly< - CommandMetaData extends undefined - ? { - type: CommandType; - data: Readonly; - metadata?: DefaultCommandMetadata | undefined; - } - : { - type: CommandType; - data: CommandData; - metadata: CommandMetaData; - } - >, - 'Command' ->; +> = Readonly< + CommandMetaData extends undefined + ? { + type: CommandType; + data: Readonly; + metadata?: DefaultCommandMetadata | undefined; + } + : { + type: CommandType; + data: CommandData; + metadata: CommandMetaData; + } +> & { readonly kind?: 'Command' }; export type CommandTypeOf = T['type']; export type CommandDataOf = T['data']; @@ -45,7 +42,7 @@ export type CreateCommandType< data: CommandData; metadata: CommandMetaData; } ->; +> & { readonly kind?: 'Command' }; // eslint-disable-next-line @typescript-eslint/no-explicit-any export const command = >( @@ -64,8 +61,8 @@ export const command = >( const [type, data, metadata] = args; return metadata !== undefined - ? ({ type, data, metadata } as CommandType) - : ({ type, data } as CommandType); + ? ({ type, data, metadata, kind: 'Command' } as CommandType) + : ({ type, data, kind: 'Command' } as CommandType); }; export type DefaultCommandMetadata = { now: Date }; diff --git a/src/packages/emmett/src/typing/event.ts b/src/packages/emmett/src/typing/event.ts index 106ce61c..64f1f1c0 100644 --- a/src/packages/emmett/src/typing/event.ts +++ b/src/packages/emmett/src/typing/event.ts @@ -1,4 +1,15 @@ -import type { DefaultRecord, Flavour } from './'; +import type { DefaultRecord } from './'; +import type { + AnyRecordedMessageMetadata, + CombinedRecordedMessageMetadata, + CommonRecordedMessageMetadata, + GlobalPositionTypeOfRecordedMessageMetadata, + RecordedMessage, + RecordedMessageMetadata, + RecordedMessageMetadataWithGlobalPosition, + RecordedMessageMetadataWithoutGlobalPosition, + StreamPositionTypeOfRecordedMessageMetadata, +} from './message'; export type BigIntStreamPosition = bigint; export type BigIntGlobalPosition = bigint; @@ -7,21 +18,21 @@ export type Event< EventType extends string = string, EventData extends DefaultRecord = DefaultRecord, EventMetaData extends DefaultRecord | undefined = undefined, -> = Flavour< - Readonly< - EventMetaData extends undefined - ? { - type: EventType; - data: EventData; - } - : { - type: EventType; - data: EventData; - metadata: EventMetaData; - } - >, - 'Event' ->; +> = Readonly< + EventMetaData extends undefined + ? { + type: EventType; + data: EventData; + } + : { + type: EventType; + data: EventData; + metadata: EventMetaData; + } +> & { readonly kind?: 'Event' }; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type AnyEvent = Event; export type EventTypeOf = T['type']; export type EventDataOf = T['data']; @@ -29,8 +40,6 @@ export type EventMetaDataOf = T extends { metadata: infer M } ? M : undefined; -export type CanHandle = EventTypeOf[]; - export type CreateEventType< EventType extends string, EventData extends DefaultRecord, @@ -46,7 +55,7 @@ export type CreateEventType< data: EventData; metadata: EventMetaData; } ->; +> & { readonly kind?: 'Event' }; // eslint-disable-next-line @typescript-eslint/no-explicit-any export const event = >( @@ -61,58 +70,46 @@ export const event = >( const [type, data, metadata] = args; return metadata !== undefined - ? ({ type, data, metadata } as EventType) - : ({ type, data } as EventType); + ? ({ type, data, metadata, kind: 'Event' } as EventType) + : ({ type, data, kind: 'Event' } as EventType); }; export type CombinedReadEventMetadata< EventType extends Event = Event, - EventMetaDataType extends AnyReadEventMetadata = AnyReadEventMetadata, -> = - EventMetaDataOf extends undefined - ? EventMetaDataType - : EventMetaDataOf & EventMetaDataType; + EventMetaDataType extends + AnyRecordedMessageMetadata = AnyRecordedMessageMetadata, +> = CombinedRecordedMessageMetadata; export type ReadEvent< EventType extends Event = Event, + EventMetaDataType extends + AnyRecordedMessageMetadata = AnyRecordedMessageMetadata, +> = RecordedMessage; + +export type AnyReadEvent< EventMetaDataType extends AnyReadEventMetadata = AnyReadEventMetadata, -> = EventType & { - metadata: CombinedReadEventMetadata; -}; +> = ReadEvent; export type CommonReadEventMetadata = - Readonly<{ - eventId: string; - streamPosition: StreamPosition; - streamName: string; - }>; - -export type WithGlobalPosition = Readonly<{ - globalPosition: GlobalPosition; -}>; + CommonRecordedMessageMetadata; export type ReadEventMetadata< GlobalPosition = undefined, StreamPosition = BigIntStreamPosition, -> = CommonReadEventMetadata & - // eslint-disable-next-line @typescript-eslint/no-empty-object-type - (GlobalPosition extends undefined ? {} : WithGlobalPosition); +> = RecordedMessageMetadata; -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export type AnyReadEventMetadata = ReadEventMetadata; +export type AnyReadEventMetadata = AnyRecordedMessageMetadata; export type ReadEventMetadataWithGlobalPosition< GlobalPosition = BigIntGlobalPosition, -> = ReadEventMetadata; +> = RecordedMessageMetadataWithGlobalPosition; export type ReadEventMetadataWithoutGlobalPosition< StreamPosition = BigIntStreamPosition, -> = ReadEventMetadata; +> = RecordedMessageMetadataWithoutGlobalPosition; export type GlobalPositionTypeOfReadEventMetadata = - // eslint-disable-next-line @typescript-eslint/no-explicit-any - ReadEventMetadataType extends ReadEventMetadata ? GP : never; + GlobalPositionTypeOfRecordedMessageMetadata; export type StreamPositionTypeOfReadEventMetadata = - // eslint-disable-next-line @typescript-eslint/no-explicit-any - ReadEventMetadataType extends ReadEventMetadata ? SV : never; + StreamPositionTypeOfRecordedMessageMetadata; diff --git a/src/packages/emmett/src/typing/index.ts b/src/packages/emmett/src/typing/index.ts index 3314da0c..1b7057d6 100644 --- a/src/packages/emmett/src/typing/index.ts +++ b/src/packages/emmett/src/typing/index.ts @@ -2,6 +2,7 @@ export * from './deepReadonly'; export * from './command'; export * from './event'; +export * from './message'; export * from './decider'; export * from './workflow'; diff --git a/src/packages/emmett/src/typing/message.ts b/src/packages/emmett/src/typing/message.ts new file mode 100644 index 00000000..1a824654 --- /dev/null +++ b/src/packages/emmett/src/typing/message.ts @@ -0,0 +1,110 @@ +import type { + BigIntGlobalPosition, + BigIntStreamPosition, + Command, + DefaultRecord, + Event, +} from '.'; + +export type Message< + Type extends string = string, + Data extends DefaultRecord = DefaultRecord, + MetaData extends DefaultRecord | undefined = undefined, +> = Command | Event; + +export type MessageKindOf = T['kind']; +export type MessageTypeOf = T['type']; +export type MessageDataOf = T['data']; +export type MessageMetaDataOf = T extends { + metadata: infer M; +} + ? M + : undefined; + +export type CanHandle = MessageTypeOf[]; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export const message = >( + ...args: MessageMetaDataOf extends undefined + ? [ + kind: MessageKindOf, + type: MessageTypeOf, + data: MessageDataOf, + ] + : [ + kind: MessageKindOf, + type: MessageTypeOf, + data: MessageDataOf, + metadata: MessageMetaDataOf, + ] +): MessageType => { + const [kind, type, data, metadata] = args; + + return metadata !== undefined + ? ({ type, data, metadata, kind } as MessageType) + : ({ type, data, kind } as MessageType); +}; + +export type CombinedRecordedMessageMetadata< + MessageType extends Message = Message, + MessageMetaDataType extends + AnyRecordedMessageMetadata = AnyRecordedMessageMetadata, +> = + MessageMetaDataOf extends undefined + ? MessageMetaDataType + : MessageMetaDataOf & MessageMetaDataType; + +export type RecordedMessage< + MessageType extends Message = Message, + MessageMetaDataType extends + AnyRecordedMessageMetadata = AnyRecordedMessageMetadata, +> = MessageType & { + kind: NonNullable>; + metadata: CombinedRecordedMessageMetadata; +}; + +export type CommonRecordedMessageMetadata< + StreamPosition = BigIntStreamPosition, +> = Readonly<{ + messageId: string; + streamPosition: StreamPosition; + streamName: string; +}>; + +export type WithGlobalPosition = Readonly<{ + globalPosition: GlobalPosition; +}>; + +export type RecordedMessageMetadata< + GlobalPosition = undefined, + StreamPosition = BigIntStreamPosition, +> = CommonRecordedMessageMetadata & + // eslint-disable-next-line @typescript-eslint/no-empty-object-type + (GlobalPosition extends undefined ? {} : WithGlobalPosition); + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type AnyRecordedMessageMetadata = RecordedMessageMetadata; + +export type RecordedMessageMetadataWithGlobalPosition< + GlobalPosition = BigIntGlobalPosition, +> = RecordedMessageMetadata; + +export type RecordedMessageMetadataWithoutGlobalPosition< + StreamPosition = BigIntStreamPosition, +> = RecordedMessageMetadata; + +export type GlobalPositionTypeOfRecordedMessageMetadata< + RecordedMessageMetadataType, +> = + // eslint-disable-next-line @typescript-eslint/no-explicit-any + RecordedMessageMetadataType extends RecordedMessageMetadata + ? GP + : never; + +export type StreamPositionTypeOfRecordedMessageMetadata< + RecordedMessageMetadataType, +> = + // eslint-disable-next-line @typescript-eslint/no-explicit-any + RecordedMessageMetadataType extends RecordedMessageMetadata + ? SV + : never; diff --git a/src/tsconfig.json b/src/tsconfig.json index d48e55ae..24a74e39 100644 --- a/src/tsconfig.json +++ b/src/tsconfig.json @@ -32,6 +32,9 @@ { "path": "./packages/emmett-postgresql/" }, + { + "path": "./packages/emmett-sqlite/" + }, { "path": "./packages/emmett-mongodb/" },