From c0bd2058fa1a423a2343bb518094b61e85de4bd3 Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Mon, 8 Sep 2025 11:38:09 +0700 Subject: [PATCH 01/40] Initial commit Signed-off-by: Andrey Sobolev --- .gitattributes | 14 + .github/workflows/ci.yml | 43 + .gitignore | 115 + LICENSE | 277 + README.md | 96 + common/config/rush/.npmrc | 33 + common/config/rush/.npmrc-publish | 29 + common/config/rush/.pnpmfile.cjs | 38 + common/config/rush/artifactory.json | 109 + common/config/rush/build-cache.json | 160 + common/config/rush/cobuild.json | 22 + common/config/rush/command-line.json | 524 ++ common/config/rush/common-versions.json | 77 + common/config/rush/custom-tips.json | 29 + common/config/rush/experiments.json | 121 + common/config/rush/pnpm-config.json | 331 + common/config/rush/pnpm-lock.yaml | 6700 +++++++++++++++++ common/config/rush/repo-state.json | 4 + common/config/rush/rush-plugins.json | 29 + common/config/rush/subspaces.json | 35 + common/config/rush/version-policies.json | 102 + common/git-hooks/commit-msg.sample | 25 + common/scripts/install-run-rush-pnpm.js | 31 + common/scripts/install-run-rush.js | 218 + common/scripts/install-run-rushx.js | 31 + common/scripts/install-run.js | 778 ++ packages/measurements-otlp/.eslintrc.js | 7 + packages/measurements-otlp/.npmignore | 4 + packages/measurements-otlp/config/rig.json | 4 + packages/measurements-otlp/jest.config.js | 7 + packages/measurements-otlp/package.json | 61 + packages/measurements-otlp/src/index.ts | 1 + packages/measurements-otlp/src/telemetry.ts | 608 ++ packages/measurements-otlp/tsconfig.json | 12 + packages/measurements/.eslintrc.js | 7 + packages/measurements/.npmignore | 4 + packages/measurements/config/rig.json | 4 + packages/measurements/jest.config.js | 7 + packages/measurements/package.json | 51 + packages/measurements/src/context.ts | 386 + packages/measurements/src/index.ts | 13 + packages/measurements/src/metrics.ts | 337 + packages/measurements/src/types.ts | 132 + packages/measurements/tsconfig.json | 12 + .../platform-rig/bin/bump-package-version.js | 27 + packages/platform-rig/bin/compile.js | 203 + packages/platform-rig/bin/do-svelte-check.js | 122 + packages/platform-rig/bin/format.js | 142 + packages/platform-rig/package.json | 35 + .../profiles/assets/config/rush-project.json | 44 + .../profiles/assets/eslint.config.json | 10 + .../profiles/assets/tsconfig.json | 23 + .../profiles/default/config/rush-project.json | 49 + .../profiles/default/eslint.config.json | 11 + .../profiles/default/tsconfig.json | 23 + .../profiles/model/config/rush-project.json | 40 + .../profiles/model/eslint.config.json | 10 + .../platform-rig/profiles/model/tsconfig.json | 18 + .../profiles/node/config/rush-project.json | 48 + .../profiles/node/eslint.config.json | 10 + .../platform-rig/profiles/node/tsconfig.json | 21 + .../profiles/package/config/rush-project.json | 55 + .../profiles/package/config/typescript.json | 76 + .../profiles/package/eslint.config.json | 11 + .../profiles/package/tsconfig.json | 21 + .../profiles/ui/config/rush-project.json | 44 + .../profiles/ui/eslint.config.json | 65 + .../profiles/ui/svelte/index.d.ts | 4 + .../platform-rig/profiles/ui/tsconfig.json | 20 + packages/postgres-base/.eslintrc.js | 7 + packages/postgres-base/.npmignore | 4 + packages/postgres-base/config/rig.json | 5 + packages/postgres-base/jest.config.js | 7 + packages/postgres-base/package.json | 42 + packages/postgres-base/src/index.ts | 439 ++ packages/postgres-base/tsconfig.json | 12 + rush.json | 355 + scripts/bump-version.sh | 19 + 78 files changed, 13650 insertions(+) create mode 100644 .gitattributes create mode 100644 .github/workflows/ci.yml create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 common/config/rush/.npmrc create mode 100644 common/config/rush/.npmrc-publish create mode 100644 common/config/rush/.pnpmfile.cjs create mode 100644 common/config/rush/artifactory.json create mode 100644 common/config/rush/build-cache.json create mode 100644 common/config/rush/cobuild.json create mode 100644 common/config/rush/command-line.json create mode 100644 common/config/rush/common-versions.json create mode 100644 common/config/rush/custom-tips.json create mode 100644 common/config/rush/experiments.json create mode 100644 common/config/rush/pnpm-config.json create mode 100644 common/config/rush/pnpm-lock.yaml create mode 100644 common/config/rush/repo-state.json create mode 100644 common/config/rush/rush-plugins.json create mode 100644 common/config/rush/subspaces.json create mode 100644 common/config/rush/version-policies.json create mode 100644 common/git-hooks/commit-msg.sample create mode 100644 common/scripts/install-run-rush-pnpm.js create mode 100644 common/scripts/install-run-rush.js create mode 100644 common/scripts/install-run-rushx.js create mode 100644 common/scripts/install-run.js create mode 100644 packages/measurements-otlp/.eslintrc.js create mode 100644 packages/measurements-otlp/.npmignore create mode 100644 packages/measurements-otlp/config/rig.json create mode 100644 packages/measurements-otlp/jest.config.js create mode 100644 packages/measurements-otlp/package.json create mode 100644 packages/measurements-otlp/src/index.ts create mode 100644 packages/measurements-otlp/src/telemetry.ts create mode 100644 packages/measurements-otlp/tsconfig.json create mode 100644 packages/measurements/.eslintrc.js create mode 100644 packages/measurements/.npmignore create mode 100644 packages/measurements/config/rig.json create mode 100644 packages/measurements/jest.config.js create mode 100644 packages/measurements/package.json create mode 100644 packages/measurements/src/context.ts create mode 100644 packages/measurements/src/index.ts create mode 100644 packages/measurements/src/metrics.ts create mode 100644 packages/measurements/src/types.ts create mode 100644 packages/measurements/tsconfig.json create mode 100755 packages/platform-rig/bin/bump-package-version.js create mode 100755 packages/platform-rig/bin/compile.js create mode 100755 packages/platform-rig/bin/do-svelte-check.js create mode 100755 packages/platform-rig/bin/format.js create mode 100644 packages/platform-rig/package.json create mode 100644 packages/platform-rig/profiles/assets/config/rush-project.json create mode 100644 packages/platform-rig/profiles/assets/eslint.config.json create mode 100644 packages/platform-rig/profiles/assets/tsconfig.json create mode 100644 packages/platform-rig/profiles/default/config/rush-project.json create mode 100644 packages/platform-rig/profiles/default/eslint.config.json create mode 100644 packages/platform-rig/profiles/default/tsconfig.json create mode 100644 packages/platform-rig/profiles/model/config/rush-project.json create mode 100644 packages/platform-rig/profiles/model/eslint.config.json create mode 100644 packages/platform-rig/profiles/model/tsconfig.json create mode 100644 packages/platform-rig/profiles/node/config/rush-project.json create mode 100644 packages/platform-rig/profiles/node/eslint.config.json create mode 100644 packages/platform-rig/profiles/node/tsconfig.json create mode 100644 packages/platform-rig/profiles/package/config/rush-project.json create mode 100644 packages/platform-rig/profiles/package/config/typescript.json create mode 100644 packages/platform-rig/profiles/package/eslint.config.json create mode 100644 packages/platform-rig/profiles/package/tsconfig.json create mode 100644 packages/platform-rig/profiles/ui/config/rush-project.json create mode 100644 packages/platform-rig/profiles/ui/eslint.config.json create mode 100644 packages/platform-rig/profiles/ui/svelte/index.d.ts create mode 100644 packages/platform-rig/profiles/ui/tsconfig.json create mode 100644 packages/postgres-base/.eslintrc.js create mode 100644 packages/postgres-base/.npmignore create mode 100644 packages/postgres-base/config/rig.json create mode 100644 packages/postgres-base/jest.config.js create mode 100644 packages/postgres-base/package.json create mode 100644 packages/postgres-base/src/index.ts create mode 100644 packages/postgres-base/tsconfig.json create mode 100644 rush.json create mode 100755 scripts/bump-version.sh diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000..79a85db5c2 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,14 @@ +# Don't allow people to merge changes to these generated files, because the result +# may be invalid. You need to run "rush update" again. +pnpm-lock.yaml merge=text +shrinkwrap.yaml merge=binary +npm-shrinkwrap.json merge=binary +yarn.lock merge=binary + +# Rush's JSON config files use JavaScript-style code comments. The rule below prevents pedantic +# syntax highlighters such as GitHub's from highlighting these comments as errors. Your text editor +# may also require a special configuration to allow comments in JSON. +# +# For more information, see this issue: https://github.com/microsoft/rushstack/issues/1088 +# +*.json linguist-language=JSON-with-Comments diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000000..ef78e37002 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,43 @@ +name: CI + +on: + push: + branches: ['main'] + tags: + - 'v0.7.*' + pull_request: + branches: ['main'] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 2 + - uses: actions/setup-node@v3 + with: + node-version: 22 + - name: Verify Change Logs + run: node common/scripts/install-run-rush.js change --verify + - name: Rush Install + run: node common/scripts/install-run-rush.js install + - name: Rush validate + run: node common/scripts/install-run-rush.js validate --verbose + + publish: + runs-on: ubuntu-latest + if: startsWith(github.ref, 'refs/tags/v0.7.') + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 2 + - uses: actions/setup-node@v3 + with: + node-version: 22 + - name: Install dependencies + run: node common/scripts/install-run-rush.js install + - name: Publish packages + env: + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + run: node common/scripts/install-run-rush.js publish --include-all --publish diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..a175778200 --- /dev/null +++ b/.gitignore @@ -0,0 +1,115 @@ +.heft/ +lib/ +_api-extractor-temp/ +temp/ +.idea +pods/workspace/init/ +pods/workspace/init-scripts/ + +# Logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +*./rush-logs +*tests/sanity/screenshots + +# Runtime data +*.pid +*.seed +*.pid.lock + +# VS Code settings +.vscode/settings.json + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +# .env + +# next.js build output +.next + +# OS X temporary files +.DS_Store + +# Rush temporary files +common/deploy/ +common/temp/ +common/autoinstallers/*/.npmrc +**/.rush/temp/ +bundle.js +bundle/*.js +dist +.build +typings +types +.validate +tsconfig.tsbuildinfo +ingest-attachment-*.zip +tsdoc-metadata.json +pods/front/dist +*.cpuprofile +*.pyc +metrics.txt +dev/tool/report*.csv +tests/db_dump +.build +.format +tools/apm/apm.js +deploy +metrics.txt +services/github/pod-github/src/github.graphql +.build +.format +dev/tool/report.csv +bundle/* +bundle.js.map +tests/profiles +**/bundle/model.json +.wrangler +dump +**/logs/** +dev/tool/history.json +.aider* +/combined_dependencies +.tmp +ws-tests/docker-compose.override.yml diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000000..e48e096345 --- /dev/null +++ b/LICENSE @@ -0,0 +1,277 @@ +Eclipse Public License - v 2.0 + + THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE + PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION + OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + + a) in the case of the initial Contributor, the initial content + Distributed under this Agreement, and + + b) in the case of each subsequent Contributor: + i) changes to the Program, and + ii) additions to the Program; + where such changes and/or additions to the Program originate from + and are Distributed by that particular Contributor. A Contribution + "originates" from a Contributor if it was added to the Program by + such Contributor itself or anyone acting on such Contributor's behalf. + Contributions do not include changes or additions to the Program that + are not Modified Works. + +"Contributor" means any person or entity that Distributes the Program. + +"Licensed Patents" mean patent claims licensable by a Contributor which +are necessarily infringed by the use or sale of its Contribution alone +or when combined with the Program. + +"Program" means the Contributions Distributed in accordance with this +Agreement. + +"Recipient" means anyone who receives the Program under this Agreement +or any Secondary License (as applicable), including Contributors. + +"Derivative Works" shall mean any work, whether in Source Code or other +form, that is based on (or derived from) the Program and for which the +editorial revisions, annotations, elaborations, or other modifications +represent, as a whole, an original work of authorship. + +"Modified Works" shall mean any work in Source Code or other form that +results from an addition to, deletion from, or modification of the +contents of the Program, including, for purposes of clarity any new file +in Source Code form that contains any contents of the Program. Modified +Works shall not include works that contain only declarations, +interfaces, types, classes, structures, or files of the Program solely +in each case in order to link to, bind by name, or subclass the Program +or Modified Works thereof. + +"Distribute" means the acts of a) distributing or b) making available +in any manner that enables the transfer of a copy. + +"Source Code" means the form of a Program preferred for making +modifications, including but not limited to software source code, +documentation source, and configuration files. + +"Secondary License" means either the GNU General Public License, +Version 2.0, or any later versions of that license, including any +exceptions or additional permissions as identified by the initial +Contributor. + +2. GRANT OF RIGHTS + + a) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free copyright + license to reproduce, prepare Derivative Works of, publicly display, + publicly perform, Distribute and sublicense the Contribution of such + Contributor, if any, and such Derivative Works. + + b) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free patent + license under Licensed Patents to make, use, sell, offer to sell, + import and otherwise transfer the Contribution of such Contributor, + if any, in Source Code or other form. This patent license shall + apply to the combination of the Contribution and the Program if, at + the time the Contribution is added by the Contributor, such addition + of the Contribution causes such combination to be covered by the + Licensed Patents. The patent license shall not apply to any other + combinations which include the Contribution. No hardware per se is + licensed hereunder. + + c) Recipient understands that although each Contributor grants the + licenses to its Contributions set forth herein, no assurances are + provided by any Contributor that the Program does not infringe the + patent or other intellectual property rights of any other entity. + Each Contributor disclaims any liability to Recipient for claims + brought by any other entity based on infringement of intellectual + property rights or otherwise. As a condition to exercising the + rights and licenses granted hereunder, each Recipient hereby + assumes sole responsibility to secure any other intellectual + property rights needed, if any. For example, if a third party + patent license is required to allow Recipient to Distribute the + Program, it is Recipient's responsibility to acquire that license + before distributing the Program. + + d) Each Contributor represents that to its knowledge it has + sufficient copyright rights in its Contribution, if any, to grant + the copyright license set forth in this Agreement. + + e) Notwithstanding the terms of any Secondary License, no + Contributor makes additional grants to any Recipient (other than + those set forth in this Agreement) as a result of such Recipient's + receipt of the Program under the terms of a Secondary License + (if permitted under the terms of Section 3). + +3. REQUIREMENTS + +3.1 If a Contributor Distributes the Program in any form, then: + + a) the Program must also be made available as Source Code, in + accordance with section 3.2, and the Contributor must accompany + the Program with a statement that the Source Code for the Program + is available under this Agreement, and informs Recipients how to + obtain it in a reasonable manner on or through a medium customarily + used for software exchange; and + + b) the Contributor may Distribute the Program under a license + different than this Agreement, provided that such license: + i) effectively disclaims on behalf of all other Contributors all + warranties and conditions, express and implied, including + warranties or conditions of title and non-infringement, and + implied warranties or conditions of merchantability and fitness + for a particular purpose; + + ii) effectively excludes on behalf of all other Contributors all + liability for damages, including direct, indirect, special, + incidental and consequential damages, such as lost profits; + + iii) does not attempt to limit or alter the recipients' rights + in the Source Code under section 3.2; and + + iv) requires any subsequent distribution of the Program by any + party to be under a license that satisfies the requirements + of this section 3. + +3.2 When the Program is Distributed as Source Code: + + a) it must be made available under this Agreement, or if the + Program (i) is combined with other material in a separate file or + files made available under a Secondary License, and (ii) the initial + Contributor attached to the Source Code the notice described in + Exhibit A of this Agreement, then the Program may be made available + under the terms of such Secondary Licenses, and + + b) a copy of this Agreement must be included with each copy of + the Program. + +3.3 Contributors may not remove or alter any copyright, patent, +trademark, attribution notices, disclaimers of warranty, or limitations +of liability ("notices") contained within the Program from any copy of +the Program which they Distribute, provided that Contributors may add +their own appropriate notices. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities +with respect to end users, business partners and the like. While this +license is intended to facilitate the commercial use of the Program, +the Contributor who includes the Program in a commercial product +offering should do so in a manner which does not create potential +liability for other Contributors. Therefore, if a Contributor includes +the Program in a commercial product offering, such Contributor +("Commercial Contributor") hereby agrees to defend and indemnify every +other Contributor ("Indemnified Contributor") against any losses, +damages and costs (collectively "Losses") arising from claims, lawsuits +and other legal actions brought by a third party against the Indemnified +Contributor to the extent caused by the acts or omissions of such +Commercial Contributor in connection with its distribution of the Program +in a commercial product offering. The obligations in this section do not +apply to any claims or Losses relating to any actual or alleged +intellectual property infringement. In order to qualify, an Indemnified +Contributor must: a) promptly notify the Commercial Contributor in +writing of such claim, and b) allow the Commercial Contributor to control, +and cooperate with the Commercial Contributor in, the defense and any +related settlement negotiations. The Indemnified Contributor may +participate in any such claim at its own expense. + +For example, a Contributor might include the Program in a commercial +product offering, Product X. That Contributor is then a Commercial +Contributor. If that Commercial Contributor then makes performance +claims, or offers warranties related to Product X, those performance +claims and warranties are such Commercial Contributor's responsibility +alone. Under this section, the Commercial Contributor would have to +defend claims against the other Contributors related to those performance +claims and warranties, and if a court requires any other Contributor to +pay any damages as a result, the Commercial Contributor must pay +those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT +PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS" +BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR +IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF +TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR +PURPOSE. Each Recipient is solely responsible for determining the +appropriateness of using and distributing the Program and assumes all +risks associated with its exercise of rights under this Agreement, +including but not limited to the risks and costs of program errors, +compliance with applicable laws, damage to or loss of data, programs +or equipment, and unavailability or interruption of operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT +PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS +SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST +PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE +EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under +applicable law, it shall not affect the validity or enforceability of +the remainder of the terms of this Agreement, and without further +action by the parties hereto, such provision shall be reformed to the +minimum extent necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against any entity +(including a cross-claim or counterclaim in a lawsuit) alleging that the +Program itself (excluding combinations of the Program with other software +or hardware) infringes such Recipient's patent(s), then such Recipient's +rights granted under Section 2(b) shall terminate as of the date such +litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it +fails to comply with any of the material terms or conditions of this +Agreement and does not cure such failure in a reasonable period of +time after becoming aware of such noncompliance. If all Recipient's +rights under this Agreement terminate, Recipient agrees to cease use +and distribution of the Program as soon as reasonably practicable. +However, Recipient's obligations under this Agreement and any licenses +granted by Recipient relating to the Program shall continue and survive. + +Everyone is permitted to copy and distribute copies of this Agreement, +but in order to avoid inconsistency the Agreement is copyrighted and +may only be modified in the following manner. The Agreement Steward +reserves the right to publish new versions (including revisions) of +this Agreement from time to time. No one other than the Agreement +Steward has the right to modify this Agreement. The Eclipse Foundation +is the initial Agreement Steward. The Eclipse Foundation may assign the +responsibility to serve as the Agreement Steward to a suitable separate +entity. Each new version of the Agreement will be given a distinguishing +version number. The Program (including Contributions) may always be +Distributed subject to the version of the Agreement under which it was +received. In addition, after a new version of the Agreement is published, +Contributor may elect to Distribute the Program (including its +Contributions) under the new version. + +Except as expressly stated in Sections 2(a) and 2(b) above, Recipient +receives no rights or licenses to the intellectual property of any +Contributor under this Agreement, whether expressly, by implication, +estoppel or otherwise. All rights in the Program not expressly granted +under this Agreement are reserved. Nothing in this Agreement is intended +to be enforceable by any entity that is not a Contributor or Recipient. +No third-party beneficiary rights are created under this Agreement. + +Exhibit A - Form of Secondary Licenses Notice + +"This Source Code may also be made available under the following +Secondary Licenses when the conditions for such availability set forth +in the Eclipse Public License, v. 2.0 are satisfied: {name license(s), +version(s), and exceptions or additional permissions here}." + + Simply including a copy of this Agreement, including this Exhibit A + is not sufficient to license the Source Code under Secondary Licenses. + + If it is not possible or desirable to put the notice in a particular + file, then You may include the notice in a location (such as a LICENSE + file in a relevant directory) where a recipient would be likely to + look for such a notice. + + You may add additional accurate notices of copyright ownership. diff --git a/README.md b/README.md new file mode 100644 index 0000000000..b273591f2b --- /dev/null +++ b/README.md @@ -0,0 +1,96 @@ +# Huly Utils + +Huly Utils is a monorepo managed by [Rush](https://rushjs.io/) that contains various packages and tools for engineering purposes. This repository is structured to support scalable development and efficient collaboration. + +## Repository Structure + +The repository is organized as follows: + +```plaintext +common/ + config/ # Configuration files for Rush and other tools + git-hooks/ # Git hooks for the repository + scripts/ # Utility scripts for managing the repository + temp/ # Temporary files and caches +packages/ + measurements/ # Measurement utilities + measurements-otlp/ # OpenTelemetry-based measurement utilities + platform-rig/ # Platform rig utilities + postgres-base/ # PostgreSQL base utilities +``` + +## Getting Started + +### Prerequisites + +- **Node.js**: Ensure you have a supported version of Node.js installed. This repository supports: + - `>=18.20.3 <19.0.0` + - `>=20.14.0 <21.0.0` +- **PNPM**: This repository uses PNPM as the package manager. The required version is `10.15.1`. + +### Installation + +1. Clone the repository: + + ```bash + git clone https://github.com/hcengineering/huly.utils.git + cd huly.utils + ``` + +2. Install dependencies using Rush: + + ```bash + rush install + ``` + +### Building the Repository + +To build all projects in the repository, run: + +```bash +rush build +``` + +### Running Tests + +To run tests for all projects, use: + +```bash +rush test +``` + +## Packages + +### `@hcengineering/platform-rig` + +A set of utilities for managing platform configurations and profiles. + +### `@hcengineering/measurements` + +Utilities for handling various measurement-related tasks. + +### `@hcengineering/measurements-otlp` + +OpenTelemetry-based utilities for measurements and telemetry. + +### `@hcengineering/postgres-base` + +Base utilities for working with PostgreSQL databases. + +## Contributing + +We welcome contributions! Please follow these steps: + +1. Fork the repository. +2. Create a new branch for your feature or bugfix. +3. Commit your changes and push the branch. +4. Open a pull request. + +## License + +This project is licensed under the terms of the [MIT License](./LICENSE). + +## Additional Resources + +- [Rush Documentation](https://rushjs.io/) +- [PNPM Documentation](https://pnpm.io/) diff --git a/common/config/rush/.npmrc b/common/config/rush/.npmrc new file mode 100644 index 0000000000..4bb3c57a4e --- /dev/null +++ b/common/config/rush/.npmrc @@ -0,0 +1,33 @@ +# Rush uses this file to configure the NPM package registry during installation. It is applicable +# to PNPM, NPM, and Yarn package managers. It is used by operations such as "rush install", +# "rush update", and the "install-run.js" scripts. +# +# NOTE: The "rush publish" command uses .npmrc-publish instead. +# +# Before invoking the package manager, Rush will generate an .npmrc in the folder where installation +# is performed. This generated file will omit any config lines that reference environment variables +# that are undefined in that session; this avoids problems that would otherwise result due to +# a missing variable being replaced by an empty string. +# +# If "subspacesEnabled" is true in subspaces.json, the generated file will merge settings from +# "common/config/rush/.npmrc" and "common/config/subspaces//.npmrc", with the latter taking +# precedence. +# +# * * * SECURITY WARNING * * * +# +# It is NOT recommended to store authentication tokens in a text file on a lab machine, because +# other unrelated processes may be able to read that file. Also, the file may persist indefinitely, +# for example if the machine loses power. A safer practice is to pass the token via an +# environment variable, which can be referenced from .npmrc using ${} expansion. For example: +# +# //registry.npmjs.org/:_authToken=${NPM_AUTH_TOKEN} +# + +# Explicitly specify the NPM registry that "rush install" and "rush update" will use by default: +registry=https://registry.npmjs.org/ + +# Optionally provide an authentication token for the above registry URL (if it is a private registry): +//registry.npmjs.org/:_authToken=${NPM_TOKEN} + +# Change this to "true" if your registry requires authentication for read-only operations: +always-auth=false diff --git a/common/config/rush/.npmrc-publish b/common/config/rush/.npmrc-publish new file mode 100644 index 0000000000..951a4918cf --- /dev/null +++ b/common/config/rush/.npmrc-publish @@ -0,0 +1,29 @@ +# This config file is very similar to common/config/rush/.npmrc, except that .npmrc-publish +# is used by the "rush publish" command, as publishing often involves different credentials +# and registries than other operations. +# +# Before invoking the package manager, Rush will copy this file to "common/temp/publish-home/.npmrc" +# and then temporarily map that folder as the "home directory" for the current user account. +# This enables the same settings to apply for each project folder that gets published. The copied file +# will omit any config lines that reference environment variables that are undefined in that session; +# this avoids problems that would otherwise result due to a missing variable being replaced by +# an empty string. +# +# * * * SECURITY WARNING * * * +# +# It is NOT recommended to store authentication tokens in a text file on a lab machine, because +# other unrelated processes may be able to read the file. Also, the file may persist indefinitely, +# for example if the machine loses power. A safer practice is to pass the token via an +# environment variable, which can be referenced from .npmrc using ${} expansion. For example: +# +# //registry.npmjs.org/:_authToken=${NPM_AUTH_TOKEN} +# + +# Explicitly specify the NPM registry that "rush publish" will use by default: +registry=https://registry.npmjs.org/ + +# Optionally provide an authentication token for the above registry URL (if it is a private registry): +//registry.npmjs.org/:_authToken=${NPM_TOKEN} + +# Change this to "true" if your registry requires authentication for read-only operations: +always-auth=false diff --git a/common/config/rush/.pnpmfile.cjs b/common/config/rush/.pnpmfile.cjs new file mode 100644 index 0000000000..98cf3279ec --- /dev/null +++ b/common/config/rush/.pnpmfile.cjs @@ -0,0 +1,38 @@ +'use strict'; + +/** + * When using the PNPM package manager, you can use pnpmfile.js to workaround + * dependencies that have mistakes in their package.json file. (This feature is + * functionally similar to Yarn's "resolutions".) + * + * For details, see the PNPM documentation: + * https://pnpm.io/pnpmfile#hooks + * + * IMPORTANT: SINCE THIS FILE CONTAINS EXECUTABLE CODE, MODIFYING IT IS LIKELY TO INVALIDATE + * ANY CACHED DEPENDENCY ANALYSIS. After any modification to pnpmfile.js, it's recommended to run + * "rush update --full" so that PNPM will recalculate all version selections. + */ +module.exports = { + hooks: { + readPackage + } +}; + +/** + * This hook is invoked during installation before a package's dependencies + * are selected. + * The `packageJson` parameter is the deserialized package.json + * contents for the package that is about to be installed. + * The `context` parameter provides a log() function. + * The return value is the updated object. + */ +function readPackage(packageJson, context) { + + // // The karma types have a missing dependency on typings from the log4js package. + // if (packageJson.name === '@types/karma') { + // context.log('Fixed up dependencies for @types/karma'); + // packageJson.dependencies['log4js'] = '0.6.38'; + // } + + return packageJson; +} diff --git a/common/config/rush/artifactory.json b/common/config/rush/artifactory.json new file mode 100644 index 0000000000..268065478a --- /dev/null +++ b/common/config/rush/artifactory.json @@ -0,0 +1,109 @@ +/** + * This configuration file manages Rush integration with JFrog Artifactory services. + * More documentation is available on the Rush website: https://rushjs.io + */ +{ + "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/artifactory.schema.json", + + "packageRegistry": { + /** + * (Required) Set this to "true" to enable Rush to manage tokens for an Artifactory NPM registry. + * When enabled, "rush install" will automatically detect when the user's ~/.npmrc + * authentication token is missing or expired. And "rush setup" will prompt the user to + * renew their token. + * + * The default value is false. + */ + "enabled": false, + + /** + * (Required) Specify the URL of your NPM registry. This is the same URL that appears in + * your .npmrc file. It should look something like this example: + * + * https://your-company.jfrog.io/your-project/api/npm/npm-private/ + */ + "registryUrl": "", + + /** + * A list of custom strings that "rush setup" should add to the user's ~/.npmrc file at the time + * when the token is updated. This could be used for example to configure the company registry + * to be used whenever NPM is invoked as a standalone command (but it's not needed for Rush + * operations like "rush add" and "rush install", which get their mappings from the monorepo's + * common/config/rush/.npmrc file). + * + * NOTE: The ~/.npmrc settings are global for the user account on a given machine, so be careful + * about adding settings that may interfere with other work outside the monorepo. + */ + "userNpmrcLinesToAdd": [ + // "@example:registry=https://your-company.jfrog.io/your-project/api/npm/npm-private/" + ], + + /** + * (Required) Specifies the URL of the Artifactory control panel where the user can generate + * an API key. This URL is printed after the "visitWebsite" message. + * It should look something like this example: https://your-company.jfrog.io/ + * Specify an empty string to suppress this line entirely. + */ + "artifactoryWebsiteUrl": "", + + /** + * Uncomment this line to specify the type of credential to save in the user's ~/.npmrc file. + * The default is "password", which means the user's API token will be traded in for an + * npm password specific to that registry. Optionally you can specify "authToken", which + * will save the user's API token as credentials instead. + */ + // "credentialType": "password", + + /** + * These settings allow the "rush setup" interactive prompts to be customized, for + * example with messages specific to your team or configuration. Specify an empty string + * to suppress that message entirely. + */ + "messageOverrides": { + /** + * Overrides the message that normally says: + * "This monorepo consumes packages from an Artifactory private NPM registry." + */ + // "introduction": "", + + /** + * Overrides the message that normally says: + * "Please contact the repository maintainers for help with setting up an Artifactory user account." + */ + // "obtainAnAccount": "", + + /** + * Overrides the message that normally says: + * "Please open this URL in your web browser:" + * + * The "artifactoryWebsiteUrl" string is printed after this message. + */ + // "visitWebsite": "", + + /** + * Overrides the message that normally says: + * "Your user name appears in the upper-right corner of the JFrog website." + */ + // "locateUserName": "", + + /** + * Overrides the message that normally says: + * "Click 'Edit Profile' on the JFrog website. Click the 'Generate API Key' + * button if you haven't already done so previously." + */ + // "locateApiKey": "" + + /** + * Overrides the message that normally prompts: + * "What is your Artifactory user name?" + */ + // "userNamePrompt": "" + + /** + * Overrides the message that normally prompts: + * "What is your Artifactory API key?" + */ + // "apiKeyPrompt": "" + } + } +} diff --git a/common/config/rush/build-cache.json b/common/config/rush/build-cache.json new file mode 100644 index 0000000000..072e9f7d49 --- /dev/null +++ b/common/config/rush/build-cache.json @@ -0,0 +1,160 @@ +/** + * This configuration file manages Rush's build cache feature. + * More documentation is available on the Rush website: https://rushjs.io + */ +{ + "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/build-cache.schema.json", + + /** + * (Required) EXPERIMENTAL - Set this to true to enable the build cache feature. + * + * See https://rushjs.io/pages/maintainer/build_cache/ for details about this experimental feature. + */ + "buildCacheEnabled": false, + + /** + * (Required) Choose where project build outputs will be cached. + * + * Possible values: "local-only", "azure-blob-storage", "amazon-s3" + */ + "cacheProvider": "local-only", + + /** + * Setting this property overrides the cache entry ID. If this property is set, it must contain + * a [hash] token. + * + * Other available tokens: + * - [projectName] Example: "@my-scope/my-project" + * - [projectName:normalize] Example: "my-scope+my-project" + * - [phaseName] Example: "_phase:test/api" + * - [phaseName:normalize] Example: "_phase:test+api" + * - [phaseName:trimPrefix] Example: "test/api" + * - [os] Example: "win32" + * - [arch] Example: "x64" + */ + // "cacheEntryNamePattern": "[projectName:normalize]-[phaseName:normalize]-[hash]" + + /** + * (Optional) Salt to inject during calculation of the cache key. This can be used to invalidate the cache for all projects when the salt changes. + */ + // "cacheHashSalt": "1", + + /** + * Use this configuration with "cacheProvider"="azure-blob-storage" + */ + "azureBlobStorageConfiguration": { + /** + * (Required) The name of the the Azure storage account to use for build cache. + */ + // "storageAccountName": "example", + + /** + * (Required) The name of the container in the Azure storage account to use for build cache. + */ + // "storageContainerName": "my-container", + + /** + * The Azure environment the storage account exists in. Defaults to AzurePublicCloud. + * + * Possible values: "AzurePublicCloud", "AzureChina", "AzureGermany", "AzureGovernment" + */ + // "azureEnvironment": "AzurePublicCloud", + + /** + * An optional prefix for cache item blob names. + */ + // "blobPrefix": "my-prefix", + + /** + * If set to true, allow writing to the cache. Defaults to false. + */ + // "isCacheWriteAllowed": true, + + /** + * The Entra ID login flow to use. Defaults to 'AdoCodespacesAuth' on GitHub Codespaces, 'InteractiveBrowser' otherwise. + */ + // "loginFlow": "InteractiveBrowser", + + /** + * If set to true, reading the cache requires authentication. Defaults to false. + */ + // "readRequiresAuthentication": true + }, + + /** + * Use this configuration with "cacheProvider"="amazon-s3" + */ + "amazonS3Configuration": { + /** + * (Required unless s3Endpoint is specified) The name of the bucket to use for build cache. + * Example: "my-bucket" + */ + // "s3Bucket": "my-bucket", + + /** + * (Required unless s3Bucket is specified) The Amazon S3 endpoint of the bucket to use for build cache. + * This should not include any path; use the s3Prefix to set the path. + * Examples: "my-bucket.s3.us-east-2.amazonaws.com" or "http://localhost:9000" + */ + // "s3Endpoint": "https://my-bucket.s3.us-east-2.amazonaws.com", + + /** + * (Required) The Amazon S3 region of the bucket to use for build cache. + * Example: "us-east-1" + */ + // "s3Region": "us-east-1", + + /** + * An optional prefix ("folder") for cache items. It should not start with "/". + */ + // "s3Prefix": "my-prefix", + + /** + * If set to true, allow writing to the cache. Defaults to false. + */ + // "isCacheWriteAllowed": true + }, + + /** + * Use this configuration with "cacheProvider"="http" + */ + "httpConfiguration": { + /** + * (Required) The URL of the server that stores the caches. + * Example: "https://build-cacches.example.com/" + */ + // "url": "https://build-cacches.example.com/", + + /** + * (Optional) The HTTP method to use when writing to the cache (defaults to PUT). + * Should be one of PUT, POST, or PATCH. + * Example: "PUT" + */ + // "uploadMethod": "PUT", + + /** + * (Optional) HTTP headers to pass to the cache server. + * Example: { "X-HTTP-Company-Id": "109283" } + */ + // "headers": {}, + + /** + * (Optional) Shell command that prints the authorization token needed to communicate with the + * cache server, and exits with exit code 0. This command will be executed from the root of + * the monorepo. + * Example: { "exec": "node", "args": ["common/scripts/auth.js"] } + */ + // "tokenHandler": { "exec": "node", "args": ["common/scripts/auth.js"] }, + + /** + * (Optional) Prefix for cache keys. + * Example: "my-company-" + */ + // "cacheKeyPrefix": "", + + /** + * (Optional) If set to true, allow writing to the cache. Defaults to false. + */ + // "isCacheWriteAllowed": true + } +} diff --git a/common/config/rush/cobuild.json b/common/config/rush/cobuild.json new file mode 100644 index 0000000000..a47fad18d5 --- /dev/null +++ b/common/config/rush/cobuild.json @@ -0,0 +1,22 @@ +/** + * This configuration file manages Rush's cobuild feature. + * More documentation is available on the Rush website: https://rushjs.io + */ + { + "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/cobuild.schema.json", + + /** + * (Required) EXPERIMENTAL - Set this to true to enable the cobuild feature. + * RUSH_COBUILD_CONTEXT_ID should always be specified as an environment variable with an non-empty string, + * otherwise the cobuild feature will be disabled. + */ + "cobuildFeatureEnabled": false, + + /** + * (Required) Choose where cobuild lock will be acquired. + * + * The lock provider is registered by the rush plugins. + * For example, @rushstack/rush-redis-cobuild-plugin registers the "redis" lock provider. + */ + "cobuildLockProvider": "redis" +} diff --git a/common/config/rush/command-line.json b/common/config/rush/command-line.json new file mode 100644 index 0000000000..c356ff1d2a --- /dev/null +++ b/common/config/rush/command-line.json @@ -0,0 +1,524 @@ +/** + * This configuration file defines custom commands for the "rush" command-line. + * More documentation is available on the Rush website: https://rushjs.io + */ +{ + "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/command-line.schema.json", + + "phases": [ + { + "name": "_phase:build", + "dependencies": { + "upstream": ["_phase:build"] + }, + "ignoreMissingScript": true, + "allowWarningsOnSuccess": false + }, + { + "name": "_phase:validate", + "dependencies": { + "self": ["_phase:build"], + "upstream": ["_phase:validate", "_phase:build"] + }, + "ignoreMissingScript": true, + "allowWarningsOnSuccess": false + }, + { + "name": "_phase:test", + "dependencies": { + "self": ["_phase:build"], + "upstream": ["_phase:validate"] + }, + "ignoreMissingScript": true, + "allowWarningsOnSuccess": true + }, + { + "name": "_phase:lint", + "dependencies": { + "self": ["_phase:build"] + }, + "ignoreMissingScript": true, + "allowWarningsOnSuccess": false + }, + { + "name": "_phase:bundle", + "dependencies": { + "self": ["_phase:build"] + }, + "ignoreMissingScript": true, + "allowWarningsOnSuccess": false + }, + { + "name": "_phase:format", + "dependencies": { + "self": ["_phase:build"] + }, + "ignoreMissingScript": true, + "allowWarningsOnSuccess": false + }, + { + "name": "_phase:svelte-check", + "dependencies": { + "self": ["_phase:build"] + }, + "ignoreMissingScript": true, + "allowWarningsOnSuccess": true + }, + { + "name": "_phase:package", + "dependencies": { + "self": ["_phase:build"], + "upstream": ["_phase:package"] + }, + "ignoreMissingScript": true, + "allowWarningsOnSuccess": false + }, + { + "name": "_phase:docker-build", + "dependencies": { + "self": ["_phase:build", "_phase:package", "_phase:bundle"], + "upstream": ["_phase:build", "_phase:bundle", "_phase:package"] + }, + "ignoreMissingScript": true, + "allowWarningsOnSuccess": true + }, + { + "name": "_phase:docker-staging", + "dependencies": { + "self": ["_phase:build", "_phase:package", "_phase:bundle"] + }, + "ignoreMissingScript": true, + "allowWarningsOnSuccess": true + } + ], + "commands": [ + { + "commandKind": "bulk", + "name": "format", + "summary": "Format", + "description": "Perform a formatting", + "enableParallelism": true, + "incremental": false, + "ignoreMissingScript": true, + "safeForSimultaneousRushProcesses": true, + "disableBuildCache": true + }, + { + "commandKind": "global", + "name": "doformat", + "summary": "Do a format and show errors after it", + "description": "Do a format and show errors after it", + "safeForSimultaneousRushProcesses": true, + "shellCommand": "(rush format && true) && ./common/scripts/format-show.sh" + }, + { + "commandKind": "phased", + "name": "build:watch", + "summary": "Build and watch", + "phases": ["_phase:build", "_phase:validate"], + "description": "Perform build with tsc and watch for changes with rush", + "enableParallelism": true, + "incremental": true, + "safeForSimultaneousRushProcesses": true, + "watchOptions": { + "alwaysWatch": true, + "watchPhases": ["_phase:build", "_phase:validate"] + } + }, + { + "summary": "svelte-check", + "commandKind": "phased", + "name": "svelte-check", + "phases": ["_phase:build", "_phase:svelte-check"], + "enableParallelism": true, + "incremental": true + }, + { + "commandKind": "phased", + "name": "build", + "summary": "build", + "phases": ["_phase:build"], + "enableParallelism": true, + "incremental": true, + "watchOptions": { + "alwaysWatch": false, + "watchPhases": ["_phase:build"] + } + }, + { + "commandKind": "phased", + "name": "validate", + "phases": ["_phase:validate"], + "summary": "validate", + "enableParallelism": true, + "incremental": true + }, + { + "commandKind": "phased", + "name": "rebuild", + "summary": "ReBuild and test all projects.", + "phases": ["_phase:build"], + "enableParallelism": true, + "incremental": false + }, + { + "commandKind": "phased", + "name": "dorevalidate", + "phases": ["_phase:validate"], + "summary": "dorevalidate", + "enableParallelism": true, + "incremental": false + }, + { + "commandKind": "phased", + "summary": "Do testing", + "name": "test", + "phases": ["_phase:build", "_phase:test"], + "enableParallelism": true, + "incremental": true + }, + { + "commandKind": "phased", + "name": "retest", + "summary": "Build and test all projects.", + "phases": ["_phase:build", "_phase:test"], + "enableParallelism": true, + "incremental": false + }, + + { + "commandKind": "phased", + "summary": "Do bundle", + "name": "bundle", + "phases": ["_phase:build", "_phase:bundle"], + "enableParallelism": true, + "incremental": true + }, + { + "commandKind": "phased", + "summary": "Do packaging", + "name": "package", + "phases": ["_phase:build", "_phase:package"], + "enableParallelism": true, + "incremental": true + }, + + { + "summary": "docker:build", + "commandKind": "phased", + "name": "docker:build", + "phases": [ + "_phase:build", + "_phase:bundle", + "_phase:package", + "_phase:docker-build" + ], + "enableParallelism": true, + "incremental": true + }, + { + "summary": "docker:rebuild", + "commandKind": "phased", + "name": "docker:rebuild", + "phases": [ + "_phase:build", + "_phase:bundle", + "_phase:package", + "_phase:docker-build" + ], + "enableParallelism": true, + "incremental": false + }, + { + "summary": "docker:staging", + "commandKind": "phased", + "name": "docker:staging", + "phases": [ + "_phase:build", + "_phase:bundle", + "_phase:package", + "_phase:docker-staging" + ], + "enableParallelism": true, + "incremental": true + }, + { + "commandKind": "bulk", + "name": "docker:push", + "summary": "docker:push", + "description": "Push docker release images", + "enableParallelism": true, + "incremental": false, + "ignoreDependencyOrder": false, + "ignoreMissingScript": true, + "disableBuildCache": true, + "allowWarningsInSuccessfulBuild": true + }, + { + "commandKind": "global", + "name": "docker", + "summary": "Build docker with platform", + "description": "use to build all docker containers required for platform", + "safeForSimultaneousRushProcesses": true, + "shellCommand": "./common/scripts/docker.sh" + }, + { + "commandKind": "global", + "name": "docker:up", + "summary": "Up development build", + "description": "Up development build", + "safeForSimultaneousRushProcesses": true, + "shellCommand": "cd ./dev && docker compose up -d --force-recreate" + }, + { + "commandKind": "global", + "name": "docker:local", + "summary": "Up development build", + "description": "Up development build", + "safeForSimultaneousRushProcesses": true, + "shellCommand": "cd ./dev/local-mongo && docker compose -p dev up -d --force-recreate" + }, + { + "commandKind": "global", + "name": "tool:upgrade", + "summary": "Upgrade all local models", + "description": "Upgrade all local models", + "safeForSimultaneousRushProcesses": true, + "shellCommand": "cd ./dev/tool && rushx run-local upgrade -f" + }, + { + "commandKind": "global", + "name": "apply-templates", + "summary": "Update all package.json according to templates matched from templates folder", + "description": "Use to update all projects to templates", + "safeForSimultaneousRushProcesses": true, + "shellCommand": "node templates/apply.js" + }, + { + "commandKind": "global", + "name": "ts-clean", + "summary": "Clean tsconfig.tsbuildinfo", + "description": "Clean typescript incremental cache", + "safeForSimultaneousRushProcesses": true, + "shellCommand": "find .|grep tsconfig.tsbuildinfo | xargs rm | pwd" + }, + { + "commandKind": "global", + "name": "revalidate", + "summary": "Clean Validate cache and to validate again", + "description": "Clean typescript incremental cache", + "safeForSimultaneousRushProcesses": true, + "shellCommand": "find .|grep tsBuildInfoFile.info | xargs rm | pwd && rush dorevalidate" + }, + { + "commandKind": "bulk", + "name": "remove-ts-types", + "summary": "Clean validate types", + "description": "Clean validate types", + "shellCommand": "rm -rf ./types", + "enableParallelism": true, + "incremental": false, + "ignoreDependencyOrder": true, + "ignoreMissingScript": true, + "disableBuildCache": true, + "allowWarningsInSuccessfulBuild": true + }, + { + "commandKind": "global", + "name": "model-version", + "summary": "show model version", + "description": "show model version", + "safeForSimultaneousRushProcesses": true, + "shellCommand": "npx node ./common/scripts/show_version.js" + }, + { + "commandKind": "global", + "name": "show-model", + "summary": "show model", + "description": "show model", + "safeForSimultaneousRushProcesses": true, + "shellCommand": "cd ./models/all && rushx show-model" + }, + { + "commandKind": "global", + "name": "deps-clean", + "summary": "Clean package-deps-*.json files", + "description": "Clean package-deps-*.json files", + "safeForSimultaneousRushProcesses": true, + "shellCommand": "find .|grep .rush/temp/package-deps_ | xargs rm" + }, + { + "commandKind": "global", + "name": "fast-format", + "summary": "Format changed projects", + "description": "Format and autofix linting issues in changed projects", + "safeForSimultaneousRushProcesses": true, + "shellCommand": "./common/scripts/fast-format.sh" + }, + { + "commandKind": "global", + "name": "desktop", + "summary": "Build desktop build", + "description": "use to build all docker containers required for platform", + "safeForSimultaneousRushProcesses": true, + "shellCommand": "rush package -p 20 --to desktop && cd ./desktop-package && rushx dist" + } + ], + + /** + * Custom "parameters" introduce new parameters for specified Rush command-line commands. + * For example, you might define a "--production" parameter for the "rush build" command. + */ + "parameters": [ + { + "parameterKind": "flag", + "longName": "--lite", + "shortName": "-l", + "description": "Enable Heft lite building option, will skip some phases.", + "associatedCommands": ["build", "rebuild"] + }, + { + "parameterKind": "flag", + "longName": "--clean", + "description": "Enable Heft clean building option", + "associatedCommands": ["build", "rebuild"] + }, + { + "parameterKind": "flag", + "longName": "--force", + "shortName": "-f", + "description": "Force formatting", + "associatedCommands": ["format"] + }, + { + "parameterKind": "string", + "argumentName": "BRANCH", + "required": false, + "associatedPhases": [], + "shortName": "-b", + "longName": "--branch", + "description": "Force formatting of branch", + "associatedCommands": ["fast-format"] + } + // { + // /** + // * (Required) Determines the type of custom parameter. + // * A "flag" is a custom command-line parameter whose presence acts as an on/off switch. + // */ + // "parameterKind": "flag", + // + // /** + // * (Required) The long name of the parameter. It must be lower-case and use dash delimiters. + // */ + // "longName": "--my-flag", + // + // /** + // * An optional alternative short name for the parameter. It must be a dash followed by a single + // * lower-case or upper-case letter, which is case-sensitive. + // * + // * NOTE: The Rush developers recommend that automation scripts should always use the long name + // * to improve readability. The short name is only intended as a convenience for humans. + // * The alphabet letters run out quickly, and are difficult to memorize, so *only* use + // * a short name if you expect the parameter to be needed very often in everyday operations. + // */ + // "shortName": "-m", + // + // /** + // * (Required) A long description to be shown in the command-line help. + // * + // * Whenever you introduce commands/parameters, taking a little time to write meaningful + // * documentation can make a big difference for the developer experience in your repo. + // */ + // "description": "A custom flag parameter that is passed to the scripts that are invoked when building projects", + // + // /** + // * (Required) A list of custom commands and/or built-in Rush commands that this parameter may + // * be used with. The parameter will be appended to the shell command that Rush invokes. + // */ + // "associatedCommands": ["build", "rebuild"] + // }, + // + // { + // /** + // * (Required) Determines the type of custom parameter. + // * A "string" is a custom command-line parameter whose value is a simple text string. + // */ + // "parameterKind": "string", + // "longName": "--my-string", + // "description": "A custom string parameter for the \"my-global-command\" custom command", + // + // "associatedCommands": ["my-global-command"], + // + // /** + // * The name of the argument, which will be shown in the command-line help. + // * + // * For example, if the parameter name is '--count" and the argument name is "NUMBER", + // * then the command-line help would display "--count NUMBER". The argument name must + // * be comprised of upper-case letters, numbers, and underscores. It should be kept short. + // */ + // "argumentName": "SOME_TEXT", + // + // /** + // * If true, this parameter must be included with the command. The default is false. + // */ + // "required": false + // }, + // + // { + // /** + // * (Required) Determines the type of custom parameter. + // * A "choice" is a custom command-line parameter whose argument must be chosen from a list of + // * allowable alternatives. + // */ + // "parameterKind": "choice", + // "longName": "--my-choice", + // "description": "A custom choice parameter for the \"my-global-command\" custom command", + // + // "associatedCommands": ["my-global-command"], + // + // /** + // * If true, this parameter must be included with the command. The default is false. + // */ + // "required": false, + // + // /** + // * Normally if a parameter is omitted from the command line, it will not be passed + // * to the shell command. this value will be inserted by default. Whereas if a "defaultValue" + // * is defined, the parameter will always be passed to the shell command, and will use the + // * default value if unspecified. The value must be one of the defined alternatives. + // */ + // "defaultValue": "vanilla", + // + // /** + // * (Required) A list of alternative argument values that can be chosen for this parameter. + // */ + // "alternatives": [ + // { + // /** + // * A token that is one of the alternatives that can be used with the choice parameter, + // * e.g. "vanilla" in "--flavor vanilla". + // */ + // "name": "vanilla", + // + // /** + // * A detailed description for the alternative that can be shown in the command-line help. + // * + // * Whenever you introduce commands/parameters, taking a little time to write meaningful + // * documentation can make a big difference for the developer experience in your repo. + // */ + // "description": "Use the vanilla flavor (the default)" + // }, + // + // { + // "name": "chocolate", + // "description": "Use the chocolate flavor" + // }, + // + // { + // "name": "strawberry", + // "description": "Use the strawberry flavor" + // } + // ] + // } + ] +} diff --git a/common/config/rush/common-versions.json b/common/config/rush/common-versions.json new file mode 100644 index 0000000000..4a3ecbd1ee --- /dev/null +++ b/common/config/rush/common-versions.json @@ -0,0 +1,77 @@ +/** + * This configuration file specifies NPM dependency version selections that affect all projects + * in a Rush repo. More documentation is available on the Rush website: https://rushjs.io + */ +{ + "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/common-versions.schema.json", + + /** + * A table that specifies a "preferred version" for a given NPM package. This feature is typically used + * to hold back an indirect dependency to a specific older version, or to reduce duplication of indirect dependencies. + * + * The "preferredVersions" value can be any SemVer range specifier (e.g. "~1.2.3"). Rush injects these values into + * the "dependencies" field of the top-level common/temp/package.json, which influences how the package manager + * will calculate versions. The specific effect depends on your package manager. Generally it will have no + * effect on an incompatible or already constrained SemVer range. If you are using PNPM, similar effects can be + * achieved using the pnpmfile.js hook. See the Rush documentation for more details. + * + * After modifying this field, it's recommended to run "rush update --full" so that the package manager + * will recalculate all version selections. + */ + "preferredVersions": { + /** + * When someone asks for "^1.0.0" make sure they get "1.2.3" when working in this repo, + * instead of the latest version. + */ + // "some-library": "1.2.3" + }, + + /** + * When set to true, for all projects in the repo, all dependencies will be automatically added as preferredVersions, + * except in cases where different projects specify different version ranges for a given dependency. For older + * package managers, this tended to reduce duplication of indirect dependencies. However, it can sometimes cause + * trouble for indirect dependencies with incompatible peerDependencies ranges. + * + * The default value is true. If you're encountering installation errors related to peer dependencies, + * it's recommended to set this to false. + * + * After modifying this field, it's recommended to run "rush update --full" so that the package manager + * will recalculate all version selections. + */ + // "implicitlyPreferredVersions": false, + + /** + * If you would like the version specifiers for your dependencies to be consistent, then + * uncomment this line. This is effectively similar to running "rush check" before any + * of the following commands: + * + * rush install, rush update, rush link, rush version, rush publish + * + * In some cases you may want this turned on, but need to allow certain packages to use a different + * version. In those cases, you will need to add an entry to the "allowedAlternativeVersions" + * section of the common-versions.json. + * + * In the case that subspaces is enabled, this setting will take effect at a subspace level. + */ + // "ensureConsistentVersions": true, + + /** + * The "rush check" command can be used to enforce that every project in the repo must specify + * the same SemVer range for a given dependency. However, sometimes exceptions are needed. + * The allowedAlternativeVersions table allows you to list other SemVer ranges that will be + * accepted by "rush check" for a given dependency. + * + * IMPORTANT: THIS TABLE IS FOR *ADDITIONAL* VERSION RANGES THAT ARE ALTERNATIVES TO THE + * USUAL VERSION (WHICH IS INFERRED BY LOOKING AT ALL PROJECTS IN THE REPO). + * This design avoids unnecessary churn in this file. + */ + "allowedAlternativeVersions": { + /** + * For example, allow some projects to use an older TypeScript compiler + * (in addition to whatever "usual" version is being used by other projects in the repo): + */ + // "typescript": [ + // "~2.4.0" + // ] + } +} \ No newline at end of file diff --git a/common/config/rush/custom-tips.json b/common/config/rush/custom-tips.json new file mode 100644 index 0000000000..31e540d6ad --- /dev/null +++ b/common/config/rush/custom-tips.json @@ -0,0 +1,29 @@ +/** + * This configuration file allows repo maintainers to configure extra details to be + * printed alongside certain Rush messages. More documentation is available on the + * Rush website: https://rushjs.io + */ +{ + "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/custom-tips.schema.json", + + /** + * Custom tips allow you to annotate Rush's console messages with advice tailored for + * your specific monorepo. + */ + "customTips": [ + // { + // /** + // * (REQUIRED) An identifier indicating a message that may be printed by Rush. + // * If that message is printed, then this custom tip will be shown. + // * The list of available tip identifiers can be found on this page: + // * https://rushjs.io/pages/maintainer/custom_tips/ + // */ + // "tipId": "TIP_RUSH_INCONSISTENT_VERSIONS", + // + // /** + // * (REQUIRED) The message text to be displayed for this tip. + // */ + // "message": "For additional troubleshooting information, refer this wiki article:\n\nhttps://intranet.contoso.com/docs/pnpm-mismatch" + // } + ] +} diff --git a/common/config/rush/experiments.json b/common/config/rush/experiments.json new file mode 100644 index 0000000000..01f8f8f902 --- /dev/null +++ b/common/config/rush/experiments.json @@ -0,0 +1,121 @@ +/** + * This configuration file allows repo maintainers to enable and disable experimental + * Rush features. More documentation is available on the Rush website: https://rushjs.io + */ +{ + "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/experiments.schema.json", + + /** + * By default, 'rush install' passes --no-prefer-frozen-lockfile to 'pnpm install'. + * Set this option to true to pass '--frozen-lockfile' instead for faster installs. + */ + // "usePnpmFrozenLockfileForRushInstall": true, + + /** + * By default, 'rush update' passes --no-prefer-frozen-lockfile to 'pnpm install'. + * Set this option to true to pass '--prefer-frozen-lockfile' instead to minimize shrinkwrap changes. + */ + // "usePnpmPreferFrozenLockfileForRushUpdate": true, + + /** + * By default, 'rush update' runs as a single operation. + * Set this option to true to instead update the lockfile with `--lockfile-only`, then perform a `--frozen-lockfile` install. + * Necessary when using the `afterAllResolved` hook in .pnpmfile.cjs. + */ + // "usePnpmLockfileOnlyThenFrozenLockfileForRushUpdate": true, + + /** + * If using the 'preventManualShrinkwrapChanges' option, restricts the hash to only include the layout of external dependencies. + * Used to allow links between workspace projects or the addition/removal of references to existing dependency versions to not + * cause hash changes. + */ + // "omitImportersFromPreventManualShrinkwrapChanges": true, + + /** + * If true, the chmod field in temporary project tar headers will not be normalized. + * This normalization can help ensure consistent tarball integrity across platforms. + */ + // "noChmodFieldInTarHeaderNormalization": true, + + /** + * If true, build caching will respect the allowWarningsInSuccessfulBuild flag and cache builds with warnings. + * This will not replay warnings from the cached build. + */ + // "buildCacheWithAllowWarningsInSuccessfulBuild": true, + + /** + * If true, build skipping will respect the allowWarningsInSuccessfulBuild flag and skip builds with warnings. + * This will not replay warnings from the skipped build. + */ + // "buildSkipWithAllowWarningsInSuccessfulBuild": true, + + /** + * If true, perform a clean install after when running `rush install` or `rush update` if the + * `.npmrc` file has changed since the last install. + */ + // "cleanInstallAfterNpmrcChanges": true, + + /** + * If true, print the outputs of shell commands defined in event hooks to the console. + */ + // "printEventHooksOutputToConsole": true, + + /** + * If true, Rush will not allow node_modules in the repo folder or in parent folders. + */ + // "forbidPhantomResolvableNodeModulesFolders": true, + + /** + * (UNDER DEVELOPMENT) For certain installation problems involving peer dependencies, PNPM cannot + * correctly satisfy versioning requirements without installing duplicate copies of a package inside the + * node_modules folder. This poses a problem for "workspace:*" dependencies, as they are normally + * installed by making a symlink to the local project source folder. PNPM's "injected dependencies" + * feature provides a model for copying the local project folder into node_modules, however copying + * must occur AFTER the dependency project is built and BEFORE the consuming project starts to build. + * The "pnpm-sync" tool manages this operation; see its documentation for details. + * Enable this experiment if you want "rush" and "rushx" commands to resync injected dependencies + * by invoking "pnpm-sync" during the build. + */ + // "usePnpmSyncForInjectedDependencies": true, + + /** + * If set to true, Rush will generate a `project-impact-graph.yaml` file in the repository root during `rush update`. + */ + // "generateProjectImpactGraphDuringRushUpdate": true, + + /** + * If true, when running in watch mode, Rush will check for phase scripts named `_phase::ipc` and run them instead + * of `_phase:` if they exist. The created child process will be provided with an IPC channel and expected to persist + * across invocations. + */ + // "useIPCScriptsInWatchMode": true, + + /** + * (UNDER DEVELOPMENT) The Rush alerts feature provides a way to send announcements to engineers + * working in the monorepo, by printing directly in the user's shell window when they invoke Rush commands. + * This ensures that important notices will be seen by anyone doing active development, since people often + * ignore normal discussion group messages or don't know to subscribe. + */ + // "rushAlerts": true, + + + /** + * When using cobuilds, this experiment allows uncacheable operations to benefit from cobuild orchestration without using the build cache. + */ + // "allowCobuildWithoutCache": true, + + /** + * By default, rush perform a full scan of the entire repository. For example, Rush runs `git status` to check for local file changes. + * When this toggle is enabled, Rush will only scan specific paths, significantly speeding up Git operations. + */ + // "enableSubpathScan": true, + + /** + * Rush has a policy that normally requires Rush projects to specify `workspace:*` in package.json when depending + * on other projects in the workspace, unless they are explicitly declared as `decoupledLocalDependencies` + * in rush.json. Enabling this experiment will remove that requirement for dependencies belonging to a different + * subspace. This is useful for large product groups who work in separate subspaces and generally prefer to consume + * each other's packages via the NPM registry. + */ + // "exemptDecoupledDependenciesBetweenSubspaces": false +} diff --git a/common/config/rush/pnpm-config.json b/common/config/rush/pnpm-config.json new file mode 100644 index 0000000000..f09b56ba1d --- /dev/null +++ b/common/config/rush/pnpm-config.json @@ -0,0 +1,331 @@ +/** + * This configuration file provides settings specific to the PNPM package manager. + * More documentation is available on the Rush website: https://rushjs.io + * + * Rush normally looks for this file in `common/config/rush/pnpm-config.json`. However, + * if `subspacesEnabled` is true in subspaces.json, then Rush will instead first look + * for `common/config/subspaces//pnpm-config.json`. (If the file exists in both places, + * then the file under `common/config/rush` is ignored.) + */ +{ + "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/pnpm-config.schema.json", + + /** + * If true, then `rush install` and `rush update` will use the PNPM workspaces feature + * to perform the install, instead of the old model where Rush generated the symlinks + * for each projects's node_modules folder. + * + * When using workspaces, Rush will generate a `common/temp/pnpm-workspace.yaml` file referencing + * all local projects to install. Rush will also generate a `.pnpmfile.cjs` shim which implements + * Rush-specific features such as preferred versions. The user's `common/config/rush/.pnpmfile.cjs` + * is invoked by the shim. + * + * This option is strongly recommended. The default value is false. + */ + "useWorkspaces": true, + + /** + * This setting determines how PNPM chooses version numbers during `rush update`. + * For example, suppose `lib-x@3.0.0` depends on `"lib-y": "^1.2.3"` whose latest major + * releases are `1.8.9` and `2.3.4`. The resolution mode `lowest-direct` might choose + * `lib-y@1.2.3`, wheres `highest` will choose 1.8.9, and `time-based` will pick the + * highest compatible version at the time when `lib-x@3.0.0` itself was published (ensuring + * that the version could have been tested by the maintainer of "lib-x"). For local workspace + * projects, `time-based` instead works like `lowest-direct`, avoiding upgrades unless + * they are explicitly requested. Although `time-based` is the most robust option, it may be + * slightly slower with registries such as npmjs.com that have not implemented an optimization. + * + * IMPORTANT: Be aware that PNPM 8.0.0 initially defaulted to `lowest-direct` instead of + * `highest`, but PNPM reverted this decision in 8.6.12 because it caused confusion for users. + * Rush version 5.106.0 and newer avoids this confusion by consistently defaulting to + * `highest` when `resolutionMode` is not explicitly set in pnpm-config.json or .npmrc, + * regardless of your PNPM version. + * + * PNPM documentation: https://pnpm.io/npmrc#resolution-mode + * + * Possible values are: `highest`, `time-based`, and `lowest-direct`. + * The default is `highest`. + */ + // "resolutionMode": "time-based", + + /** + * This setting determines whether PNPM will automatically install (non-optional) + * missing peer dependencies instead of reporting an error. Doing so conveniently + * avoids the need to specify peer versions in package.json, but in a large monorepo + * this often creates worse problems. The reason is that peer dependency behavior + * is inherently complicated, and it is easier to troubleshoot consequences of an explicit + * version than an invisible heuristic. The original NPM RFC discussion pointed out + * some other problems with this feature: https://github.com/npm/rfcs/pull/43 + + * IMPORTANT: Without Rush, the setting defaults to true for PNPM 8 and newer; however, + * as of Rush version 5.109.0 the default is always false unless `autoInstallPeers` + * is specified in pnpm-config.json or .npmrc, regardless of your PNPM version. + + * PNPM documentation: https://pnpm.io/npmrc#auto-install-peers + + * The default value is false. + */ + // "autoInstallPeers": false, + + /** + * If true, then Rush will add the `--strict-peer-dependencies` command-line parameter when + * invoking PNPM. This causes `rush update` to fail if there are unsatisfied peer dependencies, + * which is an invalid state that can cause build failures or incompatible dependency versions. + * (For historical reasons, JavaScript package managers generally do not treat this invalid + * state as an error.) + * + * PNPM documentation: https://pnpm.io/npmrc#strict-peer-dependencies + * + * The default value is false to avoid legacy compatibility issues. + * It is strongly recommended to set `strictPeerDependencies=true`. + */ + // "strictPeerDependencies": true, + + /** + * Environment variables that will be provided to PNPM. + */ + // "environmentVariables": { + // "NODE_OPTIONS": { + // "value": "--max-old-space-size=4096", + // "override": false + // } + // }, + + /** + * Specifies the location of the PNPM store. There are two possible values: + * + * - `local` - use the `pnpm-store` folder in the current configured temp folder: + * `common/temp/pnpm-store` by default. + * - `global` - use PNPM's global store, which has the benefit of being shared + * across multiple repo folders, but the disadvantage of less isolation for builds + * (for example, bugs or incompatibilities when two repos use different releases of PNPM) + * + * In both cases, the store path can be overridden by the environment variable `RUSH_PNPM_STORE_PATH`. + * + * The default value is `local`. + */ + // "pnpmStore": "global", + + /** + * If true, then `rush install` will report an error if manual modifications + * were made to the PNPM shrinkwrap file without running `rush update` afterwards. + * + * This feature protects against accidental inconsistencies that may be introduced + * if the PNPM shrinkwrap file (`pnpm-lock.yaml`) is manually edited. When this + * feature is enabled, `rush update` will append a hash to the file as a YAML comment, + * and then `rush update` and `rush install` will validate the hash. Note that this + * does not prohibit manual modifications, but merely requires `rush update` be run + * afterwards, ensuring that PNPM can report or repair any potential inconsistencies. + * + * To temporarily disable this validation when invoking `rush install`, use the + * `--bypass-policy` command-line parameter. + * + * The default value is false. + */ + // "preventManualShrinkwrapChanges": true, + + /** + * When a project uses `workspace:` to depend on another Rush project, PNPM normally installs + * it by creating a symlink under `node_modules`. This generally works well, but in certain + * cases such as differing `peerDependencies` versions, symlinking may cause trouble + * such as incorrectly satisfied versions. For such cases, the dependency can be declared + * as "injected", causing PNPM to copy its built output into `node_modules` like a real + * install from a registry. Details here: https://rushjs.io/pages/advanced/injected_deps/ + * + * When using Rush subspaces, these sorts of versioning problems are much more likely if + * `workspace:` refers to a project from a different subspace. This is because the symlink + * would point to a separate `node_modules` tree installed by a different PNPM lockfile. + * A comprehensive solution is to enable `alwaysInjectDependenciesFromOtherSubspaces`, + * which automatically treats all projects from other subspaces as injected dependencies + * without having to manually configure them. + * + * NOTE: Use carefully -- excessive file copying can slow down the `rush install` and + * `pnpm-sync` operations if too many dependencies become injected. + * + * The default value is false. + */ + // "alwaysInjectDependenciesFromOtherSubspaces": false, + + /** + * Defines the policies to be checked for the `pnpm-lock.yaml` file. + */ + "pnpmLockfilePolicies": { + + /** + * This policy will cause "rush update" to report an error if `pnpm-lock.yaml` contains + * any SHA1 integrity hashes. + * + * For each NPM dependency, `pnpm-lock.yaml` normally stores an `integrity` hash. Although + * its main purpose is to detect corrupted or truncated network requests, this hash can also + * serve as a security fingerprint to protect against attacks that would substitute a + * malicious tarball, for example if a misconfigured .npmrc caused a machine to accidentally + * download a matching package name+version from npmjs.com instead of the private NPM registry. + * NPM originally used a SHA1 hash; this was insecure because an attacker can too easily craft + * a tarball with a matching fingerprint. For this reason, NPM later deprecated SHA1 and + * instead adopted a cryptographically strong SHA512 hash. Nonetheless, SHA1 hashes can + * occasionally reappear during "rush update", for example due to missing metadata fallbacks + * (https://github.com/orgs/pnpm/discussions/6194) or an incompletely migrated private registry. + * The `disallowInsecureSha1` policy prevents this, avoiding potential security/compliance alerts. + */ + // "disallowInsecureSha1": { + // /** + // * Enables the "disallowInsecureSha1" policy. The default value is false. + // */ + // "enabled": true, + // + // /** + // * In rare cases, a private NPM registry may continue to serve SHA1 hashes for very old + // * package versions, perhaps due to a caching issue or database migration glitch. To avoid + // * having to disable the "disallowInsecureSha1" policy for the entire monorepo, the problematic + // * package versions can be individually ignored. The "exemptPackageVersions" key is the + // * package name, and the array value lists exact version numbers to be ignored. + // */ + // "exemptPackageVersions": { + // "example1": ["1.0.0"], + // "example2": ["2.0.0", "2.0.1"] + // } + // } + }, + + /** + * The "globalOverrides" setting provides a simple mechanism for overriding version selections + * for all dependencies of all projects in the monorepo workspace. The settings are copied + * into the `pnpm.overrides` field of the `common/temp/package.json` file that is generated + * by Rush during installation. + * + * Order of precedence: `.pnpmfile.cjs` has the highest precedence, followed by + * `unsupportedPackageJsonSettings`, `globalPeerDependencyRules`, `globalPackageExtensions`, + * and `globalOverrides` has lowest precedence. + * + * PNPM documentation: https://pnpm.io/package_json#pnpmoverrides + */ + "globalOverrides": { + // "example1": "^1.0.0", + // "example2": "npm:@company/example2@^1.0.0" + }, + + /** + * The `globalPeerDependencyRules` setting provides various settings for suppressing validation errors + * that are reported during installation with `strictPeerDependencies=true`. The settings are copied + * into the `pnpm.peerDependencyRules` field of the `common/temp/package.json` file that is generated + * by Rush during installation. + * + * Order of precedence: `.pnpmfile.cjs` has the highest precedence, followed by + * `unsupportedPackageJsonSettings`, `globalPeerDependencyRules`, `globalPackageExtensions`, + * and `globalOverrides` has lowest precedence. + * + * https://pnpm.io/package_json#pnpmpeerdependencyrules + */ + "globalPeerDependencyRules": { + // "ignoreMissing": ["@eslint/*"], + // "allowedVersions": { "react": "17" }, + // "allowAny": ["@babel/*"] + }, + + /** + * The `globalPackageExtension` setting provides a way to patch arbitrary package.json fields + * for any PNPM dependency of the monorepo. The settings are copied into the `pnpm.packageExtensions` + * field of the `common/temp/package.json` file that is generated by Rush during installation. + * The `globalPackageExtension` setting has similar capabilities as `.pnpmfile.cjs` but without + * the downsides of an executable script (nondeterminism, unreliable caching, performance concerns). + * + * Order of precedence: `.pnpmfile.cjs` has the highest precedence, followed by + * `unsupportedPackageJsonSettings`, `globalPeerDependencyRules`, `globalPackageExtensions`, + * and `globalOverrides` has lowest precedence. + * + * PNPM documentation: https://pnpm.io/package_json#pnpmpackageextensions + */ + "globalPackageExtensions": { + // "fork-ts-checker-webpack-plugin": { + // "dependencies": { + // "@babel/core": "1" + // }, + // "peerDependencies": { + // "eslint": ">= 6" + // }, + // "peerDependenciesMeta": { + // "eslint": { + // "optional": true + // } + // } + // } + }, + + /** + * The `globalNeverBuiltDependencies` setting suppresses the `preinstall`, `install`, and `postinstall` + * lifecycle events for the specified NPM dependencies. This is useful for scripts with poor practices + * such as downloading large binaries without retries or attempting to invoke OS tools such as + * a C++ compiler. (PNPM's terminology refers to these lifecycle events as "building" a package; + * it has nothing to do with build system operations such as `rush build` or `rushx build`.) + * The settings are copied into the `pnpm.neverBuiltDependencies` field of the `common/temp/package.json` + * file that is generated by Rush during installation. + * + * PNPM documentation: https://pnpm.io/package_json#pnpmneverbuiltdependencies + */ + "globalNeverBuiltDependencies": [ + // "fsevents" + ], + + /** + * The `globalIgnoredOptionalDependencies` setting suppresses the installation of optional NPM + * dependencies specified in the list. This is useful when certain optional dependencies are + * not needed in your environment, such as platform-specific packages or dependencies that + * fail during installation but are not critical to your project. + * These settings are copied into the `pnpm.overrides` field of the `common/temp/package.json` + * file that is generated by Rush during installation, instructing PNPM to ignore the specified + * optional dependencies. + * + * PNPM documentation: https://pnpm.io/package_json#pnpmignoredoptionaldependencies + */ + "globalIgnoredOptionalDependencies": [ + // "fsevents" + ], + + /** + * The `globalAllowedDeprecatedVersions` setting suppresses installation warnings for package + * versions that the NPM registry reports as being deprecated. This is useful if the + * deprecated package is an indirect dependency of an external package that has not released a fix. + * The settings are copied into the `pnpm.allowedDeprecatedVersions` field of the `common/temp/package.json` + * file that is generated by Rush during installation. + * + * PNPM documentation: https://pnpm.io/package_json#pnpmalloweddeprecatedversions + * + * If you are working to eliminate a deprecated version, it's better to specify `allowedDeprecatedVersions` + * in the package.json file for individual Rush projects. + */ + "globalAllowedDeprecatedVersions": { + // "request": "*" + }, + + + /** + * (THIS FIELD IS MACHINE GENERATED) The "globalPatchedDependencies" field is updated automatically + * by the `rush-pnpm patch-commit` command. It is a dictionary, where the key is an NPM package name + * and exact version, and the value is a relative path to the associated patch file. + * + * PNPM documentation: https://pnpm.io/package_json#pnpmpatcheddependencies + */ + "globalPatchedDependencies": { }, + + /** + * (USE AT YOUR OWN RISK) This is a free-form property bag that will be copied into + * the `common/temp/package.json` file that is generated by Rush during installation. + * This provides a way to experiment with new PNPM features. These settings will override + * any other Rush configuration associated with a given JSON field except for `.pnpmfile.cjs`. + * + * USAGE OF THIS SETTING IS NOT SUPPORTED BY THE RUSH MAINTAINERS AND MAY CAUSE RUSH + * TO MALFUNCTION. If you encounter a missing PNPM setting that you believe should + * be supported, please create a GitHub issue or PR. Note that Rush does not aim to + * support every possible PNPM setting, but rather to promote a battle-tested installation + * strategy that is known to provide a good experience for large teams with lots of projects. + */ + "unsupportedPackageJsonSettings": { + // "dependencies": { + // "not-a-good-practice": "*" + // }, + // "scripts": { + // "do-something": "echo Also not a good practice" + // }, + // "pnpm": { "futurePnpmFeature": true } + } +} diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml new file mode 100644 index 0000000000..4b24acd963 --- /dev/null +++ b/common/config/rush/pnpm-lock.yaml @@ -0,0 +1,6700 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: false + excludeLinksFromLockfile: false + +pnpmfileChecksum: sha256-La8sfCMI7irxJPTW6u4mJb4vNiyLrXeEbKaXv5G3dL0= + +importers: + + .: {} + + ../../packages/measurements: + devDependencies: + '@hcengineering/platform-rig': + specifier: workspace:^0.7.0 + version: link:../platform-rig + '@types/jest': + specifier: ^29.5.5 + version: 29.5.14 + '@typescript-eslint/eslint-plugin': + specifier: ^6.11.0 + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2) + '@typescript-eslint/parser': + specifier: ^6.11.0 + version: 6.21.0(eslint@8.57.1)(typescript@5.9.2) + eslint: + specifier: ^8.54.0 + version: 8.57.1 + eslint-config-standard-with-typescript: + specifier: ^40.0.0 + version: 40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.2) + eslint-plugin-import: + specifier: ^2.26.0 + version: 2.32.0(eslint@8.57.1) + eslint-plugin-n: + specifier: ^15.4.0 + version: 15.7.0(eslint@8.57.1) + eslint-plugin-promise: + specifier: ^6.1.1 + version: 6.6.0(eslint@8.57.1) + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@22.18.1) + prettier: + specifier: ^3.1.0 + version: 3.6.2 + simplytyped: + specifier: ^3.3.0 + version: 3.3.0(typescript@5.9.2) + ts-jest: + specifier: ^29.1.1 + version: 29.4.1(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest-util@29.7.0)(jest@29.7.0(@types/node@22.18.1))(typescript@5.9.2) + typescript: + specifier: ^5.8.3 + version: 5.9.2 + + ../../packages/measurements-otlp: + dependencies: + '@hcengineering/measurements': + specifier: workspace:^0.7.0 + version: link:../measurements + '@opentelemetry/api': + specifier: ^1.9.0 + version: 1.9.0 + '@opentelemetry/api-logs': + specifier: ^0.203.0 + version: 0.203.0 + '@opentelemetry/auto-instrumentations-node': + specifier: ^0.62.0 + version: 0.62.2(@opentelemetry/api@1.9.0)(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0)) + '@opentelemetry/core': + specifier: ^2.0.1 + version: 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-logs-otlp-http': + specifier: ^0.203.0 + version: 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-metrics-otlp-http': + specifier: ^0.203.0 + version: 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-http': + specifier: ^0.203.0 + version: 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/id-generator-aws-xray': + specifier: ^2.0.0 + version: 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': + specifier: ^0.203.0 + version: 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': + specifier: ^2.0.1 + version: 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': + specifier: ^0.203.0 + version: 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': + specifier: ^2.0.1 + version: 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-node': + specifier: ^0.203.0 + version: 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-node': + specifier: ^2.0.1 + version: 2.1.0(@opentelemetry/api@1.9.0) + devDependencies: + '@hcengineering/platform-rig': + specifier: workspace:^0.7.0 + version: link:../platform-rig + '@types/jest': + specifier: ^29.5.5 + version: 29.5.14 + '@typescript-eslint/eslint-plugin': + specifier: ^6.11.0 + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2) + '@typescript-eslint/parser': + specifier: ^6.11.0 + version: 6.21.0(eslint@8.57.1)(typescript@5.9.2) + eslint: + specifier: ^8.54.0 + version: 8.57.1 + eslint-config-standard-with-typescript: + specifier: ^40.0.0 + version: 40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.2) + eslint-plugin-import: + specifier: ^2.26.0 + version: 2.32.0(eslint@8.57.1) + eslint-plugin-n: + specifier: ^15.4.0 + version: 15.7.0(eslint@8.57.1) + eslint-plugin-promise: + specifier: ^6.1.1 + version: 6.6.0(eslint@8.57.1) + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@22.18.1) + prettier: + specifier: ^3.1.0 + version: 3.6.2 + simplytyped: + specifier: ^3.3.0 + version: 3.3.0(typescript@5.9.2) + ts-jest: + specifier: ^29.1.1 + version: 29.4.1(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest-util@29.7.0)(jest@29.7.0(@types/node@22.18.1))(typescript@5.9.2) + typescript: + specifier: ^5.8.3 + version: 5.9.2 + + ../../packages/platform-rig: + dependencies: + typescript: + specifier: ^5.8.3 + version: 5.9.2 + devDependencies: + esbuild: + specifier: ^0.24.2 + version: 0.24.2 + esbuild-plugin-copy: + specifier: ~2.1.1 + version: 2.1.1(esbuild@0.24.2) + esbuild-svelte: + specifier: ^0.9.0 + version: 0.9.3(esbuild@0.24.2) + eslint-config-standard-with-typescript: + specifier: ^40.0.0 + version: 40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.2) + svelte-eslint-parser: + specifier: ^0.33.1 + version: 0.33.1 + + ../../packages/postgres-base: + dependencies: + postgres: + specifier: ^3.4.7 + version: 3.4.7 + devDependencies: + '@hcengineering/platform-rig': + specifier: workspace:^0.7.0 + version: link:../platform-rig + '@types/jest': + specifier: ^29.5.5 + version: 29.5.14 + '@types/node': + specifier: ^22.15.29 + version: 22.18.1 + '@typescript-eslint/eslint-plugin': + specifier: ^6.11.0 + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2) + '@typescript-eslint/parser': + specifier: ^6.11.0 + version: 6.21.0(eslint@8.57.1)(typescript@5.9.2) + eslint: + specifier: ^8.54.0 + version: 8.57.1 + eslint-config-standard-with-typescript: + specifier: ^40.0.0 + version: 40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.2) + eslint-plugin-import: + specifier: ^2.26.0 + version: 2.32.0(eslint@8.57.1) + eslint-plugin-n: + specifier: ^15.4.0 + version: 15.7.0(eslint@8.57.1) + eslint-plugin-promise: + specifier: ^6.1.1 + version: 6.6.0(eslint@8.57.1) + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@22.18.1) + prettier: + specifier: ^3.1.0 + version: 3.6.2 + ts-jest: + specifier: ^29.1.1 + version: 29.4.1(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest-util@29.7.0)(jest@29.7.0(@types/node@22.18.1))(typescript@5.9.2) + typescript: + specifier: ^5.8.3 + version: 5.9.2 + +packages: + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.28.4': + resolution: {integrity: sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.4': + resolution: {integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.3': + resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.28.4': + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.4': + resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-async-generators@7.8.4': + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-bigint@7.8.3': + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-properties@7.12.13': + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-static-block@7.14.5': + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.27.1': + resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-json-strings@7.8.3': + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-numeric-separator@7.10.4': + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-object-rest-spread@7.8.3': + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3': + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-chaining@7.8.3': + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-private-property-in-object@7.14.5': + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.27.1': + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.4': + resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.4': + resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + + '@esbuild/aix-ppc64@0.24.2': + resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.24.2': + resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.24.2': + resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.24.2': + resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.24.2': + resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.24.2': + resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.24.2': + resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.24.2': + resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.24.2': + resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.24.2': + resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.24.2': + resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.24.2': + resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.24.2': + resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.24.2': + resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.24.2': + resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.24.2': + resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.24.2': + resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.24.2': + resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.24.2': + resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.24.2': + resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.24.2': + resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.24.2': + resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.24.2': + resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.24.2': + resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.24.2': + resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.9.0': + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.1': + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@grpc/grpc-js@1.13.4': + resolution: {integrity: sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg==} + engines: {node: '>=12.10.0'} + + '@grpc/proto-loader@0.7.15': + resolution: {integrity: sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==} + engines: {node: '>=6'} + hasBin: true + + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + '@istanbuljs/load-nyc-config@1.1.0': + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jest/console@29.7.0': + resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/core@29.7.0': + resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/environment@29.7.0': + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect-utils@29.7.0': + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect@29.7.0': + resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/fake-timers@29.7.0': + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/globals@29.7.0': + resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/reporters@29.7.0': + resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/source-map@29.6.3': + resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-result@29.7.0': + resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-sequencer@29.7.0': + resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/transform@29.7.0': + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/types@29.6.3': + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.30': + resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} + + '@js-sdsl/ordered-map@4.4.2': + resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@opentelemetry/api-logs@0.203.0': + resolution: {integrity: sha512-9B9RU0H7Ya1Dx/Rkyc4stuBZSGVQF27WigitInx2QQoj6KUpEFYPKoWjdFTunJYxmXmh17HeBvbMa1EhGyPmqQ==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/auto-instrumentations-node@0.62.2': + resolution: {integrity: sha512-Ipe6X7ddrCiRsuewyTU83IvKiSFT4piqmv9z8Ovg1E7v98pdTj1pUE6sDrHV50zl7/ypd+cONBgt+EYSZu4u9Q==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.4.1 + '@opentelemetry/core': ^2.0.0 + + '@opentelemetry/context-async-hooks@2.0.1': + resolution: {integrity: sha512-XuY23lSI3d4PEqKA+7SLtAgwqIfc6E/E9eAQWLN1vlpC53ybO3o6jW4BsXo1xvz9lYyyWItfQDDLzezER01mCw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/context-async-hooks@2.1.0': + resolution: {integrity: sha512-zOyetmZppnwTyPrt4S7jMfXiSX9yyfF0hxlA8B5oo2TtKl+/RGCy7fi4DrBfIf3lCPrkKsRBWZZD7RFojK7FDg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/core@2.0.1': + resolution: {integrity: sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/core@2.1.0': + resolution: {integrity: sha512-RMEtHsxJs/GiHHxYT58IY57UXAQTuUnZVco6ymDEqTNlJKTimM4qPUPVe8InNFyBjhHBEAx4k3Q8LtNayBsbUQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/exporter-logs-otlp-grpc@0.203.0': + resolution: {integrity: sha512-g/2Y2noc/l96zmM+g0LdeuyYKINyBwN6FJySoU15LHPLcMN/1a0wNk2SegwKcxrRdE7Xsm7fkIR5n6XFe3QpPw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-logs-otlp-http@0.203.0': + resolution: {integrity: sha512-s0hys1ljqlMTbXx2XiplmMJg9wG570Z5lH7wMvrZX6lcODI56sG4HL03jklF63tBeyNwK2RV1/ntXGo3HgG4Qw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-logs-otlp-proto@0.203.0': + resolution: {integrity: sha512-nl/7S91MXn5R1aIzoWtMKGvqxgJgepB/sH9qW0rZvZtabnsjbf8OQ1uSx3yogtvLr0GzwD596nQKz2fV7q2RBw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-metrics-otlp-grpc@0.203.0': + resolution: {integrity: sha512-FCCj9nVZpumPQSEI57jRAA89hQQgONuoC35Lt+rayWY/mzCAc6BQT7RFyFaZKJ2B7IQ8kYjOCPsF/HGFWjdQkQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-metrics-otlp-http@0.203.0': + resolution: {integrity: sha512-HFSW10y8lY6BTZecGNpV3GpoSy7eaO0Z6GATwZasnT4bEsILp8UJXNG5OmEsz4SdwCSYvyCbTJdNbZP3/8LGCQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-metrics-otlp-proto@0.203.0': + resolution: {integrity: sha512-OZnhyd9npU7QbyuHXFEPVm3LnjZYifuKpT3kTnF84mXeEQ84pJJZgyLBpU4FSkSwUkt/zbMyNAI7y5+jYTWGIg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-prometheus@0.203.0': + resolution: {integrity: sha512-2jLuNuw5m4sUj/SncDf/mFPabUxMZmmYetx5RKIMIQyPnl6G6ooFzfeE8aXNRf8YD1ZXNlCnRPcISxjveGJHNg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-trace-otlp-grpc@0.203.0': + resolution: {integrity: sha512-322coOTf81bm6cAA8+ML6A+m4r2xTCdmAZzGNTboPXRzhwPt4JEmovsFAs+grpdarObd68msOJ9FfH3jxM6wqA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-trace-otlp-http@0.203.0': + resolution: {integrity: sha512-ZDiaswNYo0yq/cy1bBLJFe691izEJ6IgNmkjm4C6kE9ub/OMQqDXORx2D2j8fzTBTxONyzusbaZlqtfmyqURPw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-trace-otlp-proto@0.203.0': + resolution: {integrity: sha512-1xwNTJ86L0aJmWRwENCJlH4LULMG2sOXWIVw+Szta4fkqKVY50Eo4HoVKKq6U9QEytrWCr8+zjw0q/ZOeXpcAQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-zipkin@2.0.1': + resolution: {integrity: sha512-a9eeyHIipfdxzCfc2XPrE+/TI3wmrZUDFtG2RRXHSbZZULAny7SyybSvaDvS77a7iib5MPiAvluwVvbGTsHxsw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/id-generator-aws-xray@2.0.1': + resolution: {integrity: sha512-fq+OysMUCZ+XI6VUjVvjjJId4sdXrX1jBUL0mOkc+lysiv7uZsL0ga+jp/cey9wkKyLayyC8GAQzj901w9legw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/instrumentation-amqplib@0.50.0': + resolution: {integrity: sha512-kwNs/itehHG/qaQBcVrLNcvXVPW0I4FCOVtw3LHMLdYIqD7GJ6Yv2nX+a4YHjzbzIeRYj8iyMp0Bl7tlkidq5w==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-aws-lambda@0.54.1': + resolution: {integrity: sha512-qm8pGSAM1mXk7unbrGktWWGJc6IFI58ZsaHJ+i420Fp5VO3Vf7GglIgaXTS8CKBrVB4LHFj3NvzJg31PtsAQcA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-aws-sdk@0.58.0': + resolution: {integrity: sha512-9vFH7gU686dsAeLMCkqUj9y0MQZ1xrTtStSpNV2UaGWtDnRjJrAdJLu9Y545oKEaDTeVaob4UflyZvvpZnw3Xw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-bunyan@0.49.0': + resolution: {integrity: sha512-ky5Am1y6s3Ex/3RygHxB/ZXNG07zPfg9Z6Ora+vfeKcr/+I6CJbWXWhSBJor3gFgKN3RvC11UWVURnmDpBS6Pg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-cassandra-driver@0.49.0': + resolution: {integrity: sha512-BNIvqldmLkeikfI5w5Rlm9vG5NnQexfPoxOgEMzfDVOEF+vS6351I6DzWLLgWWR9CNF/jQJJi/lr6am2DLp0Rw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-connect@0.47.0': + resolution: {integrity: sha512-pjenvjR6+PMRb6/4X85L4OtkQCootgb/Jzh/l/Utu3SJHBid1F+gk9sTGU2FWuhhEfV6P7MZ7BmCdHXQjgJ42g==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-cucumber@0.19.0': + resolution: {integrity: sha512-99ms8kQWRuPt5lkDqbJJzD+7Tq5TMUlBZki4SA2h6CgK4ncX+tyep9XFY1e+XTBLJIWmuFMGbWqBLJ4fSKIQNQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/instrumentation-dataloader@0.21.1': + resolution: {integrity: sha512-hNAm/bwGawLM8VDjKR0ZUDJ/D/qKR3s6lA5NV+btNaPVm2acqhPcT47l2uCVi+70lng2mywfQncor9v8/ykuyw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-dns@0.47.0': + resolution: {integrity: sha512-775fOnewWkTF4iXMGKgwvOGqEmPrU1PZpXjjqvTrEErYBJe7Fz1WlEeUStHepyKOdld7Ghv7TOF/kE3QDctvrg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-express@0.52.0': + resolution: {integrity: sha512-W7pizN0Wh1/cbNhhTf7C62NpyYw7VfCFTYg0DYieSTrtPBT1vmoSZei19wfKLnrMsz3sHayCg0HxCVL2c+cz5w==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-fastify@0.48.0': + resolution: {integrity: sha512-3zQlE/DoVfVH6/ycuTv7vtR/xib6WOa0aLFfslYcvE62z0htRu/ot8PV/zmMZfnzpTQj8S/4ULv36R6UIbpJIg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-fs@0.23.0': + resolution: {integrity: sha512-Puan+QopWHA/KNYvDfOZN6M/JtF6buXEyD934vrb8WhsX1/FuM7OtoMlQyIqAadnE8FqqDL4KDPiEfCQH6pQcQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-generic-pool@0.47.0': + resolution: {integrity: sha512-UfHqf3zYK+CwDwEtTjaD12uUqGGTswZ7ofLBEdQ4sEJp9GHSSJMQ2hT3pgBxyKADzUdoxQAv/7NqvL42ZI+Qbw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-graphql@0.51.0': + resolution: {integrity: sha512-LchkOu9X5DrXAnPI1+Z06h/EH/zC7D6sA86hhPrk3evLlsJTz0grPrkL/yUJM9Ty0CL/y2HSvmWQCjbJEz/ADg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-grpc@0.203.0': + resolution: {integrity: sha512-Qmjx2iwccHYRLoE4RFS46CvQE9JG9Pfeae4EPaNZjvIuJxb/pZa2R9VWzRlTehqQWpAvto/dGhtkw8Tv+o0LTg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-hapi@0.50.0': + resolution: {integrity: sha512-5xGusXOFQXKacrZmDbpHQzqYD1gIkrMWuwvlrEPkYOsjUqGUjl1HbxCsn5Y9bUXOCgP1Lj6A4PcKt1UiJ2MujA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-http@0.203.0': + resolution: {integrity: sha512-y3uQAcCOAwnO6vEuNVocmpVzG3PER6/YZqbPbbffDdJ9te5NkHEkfSMNzlC3+v7KlE+WinPGc3N7MR30G1HY2g==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-ioredis@0.51.0': + resolution: {integrity: sha512-9IUws0XWCb80NovS+17eONXsw1ZJbHwYYMXiwsfR9TSurkLV5UNbRSKb9URHO+K+pIJILy9wCxvyiOneMr91Ig==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-kafkajs@0.13.0': + resolution: {integrity: sha512-FPQyJsREOaGH64hcxlzTsIEQC4DYANgTwHjiB7z9lldmvua1LRMVn3/FfBlzXoqF179B0VGYviz6rn75E9wsDw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-knex@0.48.0': + resolution: {integrity: sha512-V5wuaBPv/lwGxuHjC6Na2JFRjtPgstw19jTFl1B1b6zvaX8zVDYUDaR5hL7glnQtUSCMktPttQsgK4dhXpddcA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-koa@0.51.0': + resolution: {integrity: sha512-XNLWeMTMG1/EkQBbgPYzCeBD0cwOrfnn8ao4hWgLv0fNCFQu1kCsJYygz2cvKuCs340RlnG4i321hX7R8gj3Rg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-lru-memoizer@0.48.0': + resolution: {integrity: sha512-KUW29wfMlTPX1wFz+NNrmE7IzN7NWZDrmFWHM/VJcmFEuQGnnBuTIdsP55CnBDxKgQ/qqYFp4udQFNtjeFosPw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-memcached@0.47.0': + resolution: {integrity: sha512-vXDs/l4hlWy1IepPG1S6aYiIZn+tZDI24kAzwKKJmR2QEJRL84PojmALAEJGazIOLl/VdcCPZdMb0U2K0VzojA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mongodb@0.56.0': + resolution: {integrity: sha512-YG5IXUUmxX3Md2buVMvxm9NWlKADrnavI36hbJsihqqvBGsWnIfguf0rUP5Srr0pfPqhQjUP+agLMsvu0GmUpA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mongoose@0.50.0': + resolution: {integrity: sha512-Am8pk1Ct951r4qCiqkBcGmPIgGhoDiFcRtqPSLbJrUZqEPUsigjtMjoWDRLG1Ki1NHgOF7D0H7d+suWz1AAizw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mysql2@0.50.0': + resolution: {integrity: sha512-PoOMpmq73rOIE3nlTNLf3B1SyNYGsp7QXHYKmeTZZnJ2Ou7/fdURuOhWOI0e6QZ5gSem18IR1sJi6GOULBQJ9g==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mysql@0.49.0': + resolution: {integrity: sha512-QU9IUNqNsrlfE3dJkZnFHqLjlndiU39ll/YAAEvWE40sGOCi9AtOF6rmEGzJ1IswoZ3oyePV7q2MP8SrhJfVAA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-nestjs-core@0.49.0': + resolution: {integrity: sha512-1R/JFwdmZIk3T/cPOCkVvFQeKYzbbUvDxVH3ShXamUwBlGkdEu5QJitlRMyVNZaHkKZKWgYrBarGQsqcboYgaw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-net@0.47.0': + resolution: {integrity: sha512-csoJ++Njpf7C09JH+0HNGenuNbDZBqO1rFhMRo6s0rAmJwNh9zY3M/urzptmKlqbKnf4eH0s+CKHy/+M8fbFsQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-oracledb@0.29.0': + resolution: {integrity: sha512-2aHLiJdkyiUbooIUm7FaZf+O4jyqEl+RfFpgud1dxT87QeeYM216wi+xaMNzsb5yKtRBqbA3qeHBCyenYrOZwA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-pg@0.56.1': + resolution: {integrity: sha512-0/PiHDPVaLdcXNw6Gqb3JBdMxComMEwh444X8glwiynJKJHRTR49+l2cqJfoOVzB8Sl1XRl3Yaqw6aDi3s8e9w==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-pino@0.50.1': + resolution: {integrity: sha512-pBbvuWiHA9iAumAuQ0SKYOXK7NRlbnVTf/qBV0nMdRnxBPrc/GZTbh0f7Y59gZfYsbCLhXLL1oRTEnS+PwS3CA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-redis@0.52.0': + resolution: {integrity: sha512-R8Y7cCZlJ2Vl31S2i7bl5SqyC/aul54ski4wCFip/Tp9WGtLK1xVATi2rwy2wkc8ZCtjdEe9eEVR+QFG6gGZxg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-restify@0.49.0': + resolution: {integrity: sha512-tsGZZhS4mVZH7omYxw5jpsrD3LhWizqWc0PYtAnzpFUvL5ZINHE+cm57bssTQ2AK/GtZMxu9LktwCvIIf3dSmw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-router@0.48.0': + resolution: {integrity: sha512-Wixrc8CchuJojXpaS/dCQjFOMc+3OEil1H21G+WLYQb8PcKt5kzW9zDBT19nyjjQOx/D/uHPfgbrT+Dc7cfJ9w==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-runtime-node@0.17.1': + resolution: {integrity: sha512-c1FlAk+bB2uF9a8YneGmNPTl7c/xVaan4mmWvbkWcOmH/ipKqR1LaKUlz/BMzLrJLjho1EJlG2NrS2w2Arg+nw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-socket.io@0.50.0': + resolution: {integrity: sha512-6JN6lnKN9ZuZtZdMQIR+no1qHzQvXSZUsNe3sSWMgqmNRyEXuDUWBIyKKeG0oHRHtR4xE4QhJyD4D5kKRPWZFA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-tedious@0.22.0': + resolution: {integrity: sha512-XrrNSUCyEjH1ax9t+Uo6lv0S2FCCykcF7hSxBMxKf7Xn0bPRxD3KyFUZy25aQXzbbbUHhtdxj3r2h88SfEM3aA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-undici@0.14.0': + resolution: {integrity: sha512-2HN+7ztxAReXuxzrtA3WboAKlfP5OsPA57KQn2AdYZbJ3zeRPcLXyW4uO/jpLE6PLm0QRtmeGCmfYpqRlwgSwg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.7.0 + + '@opentelemetry/instrumentation-winston@0.48.1': + resolution: {integrity: sha512-XyOuVwdziirHHYlsw+BWrvdI/ymjwnexupKA787zQQ+D5upaE/tseZxjfQa7+t4+FdVLxHICaMTmkSD4yZHpzQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation@0.203.0': + resolution: {integrity: sha512-ke1qyM+3AK2zPuBPb6Hk/GCsc5ewbLvPNkEuELx/JmANeEp6ZjnZ+wypPAJSucTw0wvCGrUaibDSdcrGFoWxKQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-exporter-base@0.203.0': + resolution: {integrity: sha512-Wbxf7k+87KyvxFr5D7uOiSq/vHXWommvdnNE7vECO3tAhsA2GfOlpWINCMWUEPdHZ7tCXxw6Epp3vgx3jU7llQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-grpc-exporter-base@0.203.0': + resolution: {integrity: sha512-te0Ze1ueJF+N/UOFl5jElJW4U0pZXQ8QklgSfJ2linHN0JJsuaHG8IabEUi2iqxY8ZBDlSiz1Trfv5JcjWWWwQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-transformer@0.203.0': + resolution: {integrity: sha512-Y8I6GgoCna0qDQ2W6GCRtaF24SnvqvA8OfeTi7fqigD23u8Jpb4R5KFv/pRvrlGagcCLICMIyh9wiejp4TXu/A==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/propagator-b3@2.0.1': + resolution: {integrity: sha512-Hc09CaQ8Tf5AGLmf449H726uRoBNGPBL4bjr7AnnUpzWMvhdn61F78z9qb6IqB737TffBsokGAK1XykFEZ1igw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/propagator-jaeger@2.0.1': + resolution: {integrity: sha512-7PMdPBmGVH2eQNb/AtSJizQNgeNTfh6jQFqys6lfhd6P4r+m/nTh3gKPPpaCXVdRQ+z93vfKk+4UGty390283w==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/redis-common@0.38.0': + resolution: {integrity: sha512-4Wc0AWURII2cfXVVoZ6vDqK+s5n4K5IssdrlVrvGsx6OEOKdghKtJZqXAHWFiZv4nTDLH2/2fldjIHY8clMOjQ==} + engines: {node: ^18.19.0 || >=20.6.0} + + '@opentelemetry/resource-detector-alibaba-cloud@0.31.3': + resolution: {integrity: sha512-I556LHcLVsBXEgnbPgQISP/JezDt5OfpgOaJNR1iVJl202r+K145OSSOxnH5YOc/KvrydBD0FOE03F7x0xnVTw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/resource-detector-aws@2.3.0': + resolution: {integrity: sha512-PkD/lyXG3B3REq1Y6imBLckljkJYXavtqGYSryAeJYvGOf5Ds3doR+BCGjmKeF6ObAtI5MtpBeUStTDtGtBsWA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/resource-detector-azure@0.10.0': + resolution: {integrity: sha512-5cNAiyPBg53Uxe/CW7hsCq8HiKNAUGH+gi65TtgpzSR9bhJG4AEbuZhbJDFwe97tn2ifAD1JTkbc/OFuaaFWbA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/resource-detector-container@0.7.3': + resolution: {integrity: sha512-SK+xUFw6DKYbQniaGmIFsFxAZsr8RpRSRWxKi5/ZJAoqqPnjcyGI/SeUx8zzPk4XLO084zyM4pRHgir0hRTaSQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/resource-detector-gcp@0.37.0': + resolution: {integrity: sha512-LGpJBECIMsVKhiulb4nxUw++m1oF4EiDDPmFGW2aqYaAF0oUvJNv8Z/55CAzcZ7SxvlTgUwzewXDBsuCup7iqw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/resources@2.0.1': + resolution: {integrity: sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/resources@2.1.0': + resolution: {integrity: sha512-1CJjf3LCvoefUOgegxi8h6r4B/wLSzInyhGP2UmIBYNlo4Qk5CZ73e1eEyWmfXvFtm1ybkmfb2DqWvspsYLrWw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-logs@0.203.0': + resolution: {integrity: sha512-vM2+rPq0Vi3nYA5akQD2f3QwossDnTDLvKbea6u/A2NZ3XDkPxMfo/PNrDoXhDUD/0pPo2CdH5ce/thn9K0kLw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.4.0 <1.10.0' + + '@opentelemetry/sdk-metrics@2.0.1': + resolution: {integrity: sha512-wf8OaJoSnujMAHWR3g+/hGvNcsC16rf9s1So4JlMiFaFHiE4HpIA3oUh+uWZQ7CNuK8gVW/pQSkgoa5HkkOl0g==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.9.0 <1.10.0' + + '@opentelemetry/sdk-metrics@2.1.0': + resolution: {integrity: sha512-J9QX459mzqHLL9Y6FZ4wQPRZG4TOpMCyPOh6mkr/humxE1W2S3Bvf4i75yiMW9uyed2Kf5rxmLhTm/UK8vNkAw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.9.0 <1.10.0' + + '@opentelemetry/sdk-node@0.203.0': + resolution: {integrity: sha512-zRMvrZGhGVMvAbbjiNQW3eKzW/073dlrSiAKPVWmkoQzah9wfynpVPeL55f9fVIm0GaBxTLcPeukWGy0/Wj7KQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-base@2.0.1': + resolution: {integrity: sha512-xYLlvk/xdScGx1aEqvxLwf6sXQLXCjk3/1SQT9X9AoN5rXRhkdvIFShuNNmtTEPRBqcsMbS4p/gJLNI2wXaDuQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-base@2.1.0': + resolution: {integrity: sha512-uTX9FBlVQm4S2gVQO1sb5qyBLq/FPjbp+tmGoxu4tIgtYGmBYB44+KX/725RFDe30yBSaA9Ml9fqphe1hbUyLQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-node@2.0.1': + resolution: {integrity: sha512-UhdbPF19pMpBtCWYP5lHbTogLWx9N0EBxtdagvkn5YtsAnCBZzL7SjktG+ZmupRgifsHMjwUaCCaVmqGfSADmA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/sdk-trace-node@2.1.0': + resolution: {integrity: sha512-SvVlBFc/jI96u/mmlKm86n9BbTCbQ35nsPoOohqJX6DXH92K0kTe73zGY5r8xoI1QkjR9PizszVJLzMC966y9Q==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/semantic-conventions@1.37.0': + resolution: {integrity: sha512-JD6DerIKdJGmRp4jQyX5FlrQjA4tjOw1cvfsPAZXfOOEErMUHjPcPSICS+6WnM0nB0efSFARh0KAZss+bvExOA==} + engines: {node: '>=14'} + + '@opentelemetry/sql-common@0.41.0': + resolution: {integrity: sha512-pmzXctVbEERbqSfiAgdes9Y63xjoOyXcD7B6IXBkVb+vbM7M9U98mn33nGXxPf4dfYR0M+vhcKRZmbSJ7HfqFA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.1.0 + + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.4': + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + + '@protobufjs/eventemitter@1.1.0': + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + + '@protobufjs/fetch@1.1.0': + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/inquire@1.1.0': + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.0': + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + + '@rtsao/scc@1.1.0': + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + + '@sinonjs/fake-timers@10.3.0': + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + + '@types/aws-lambda@8.10.152': + resolution: {integrity: sha512-soT/c2gYBnT5ygwiHPmd9a1bftj462NWVk2tKCc1PYHSIacB2UwbTS2zYG4jzag1mRDuzg/OjtxQjQ2NKRB6Rw==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + + '@types/bunyan@1.8.11': + resolution: {integrity: sha512-758fRH7umIMk5qt5ELmRMff4mLDlN+xyYzC+dkPTdKwbSkJFvz6xwyScrytPU0QIBbRRwbiE8/BIg8bpajerNQ==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/graceful-fs@4.1.9': + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + + '@types/jest@29.5.14': + resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/memcached@2.2.10': + resolution: {integrity: sha512-AM9smvZN55Gzs2wRrqeMHVP7KE8KWgCJO/XL5yCly2xF6EKa4YlbpK+cLSAH4NG/Ah64HrlegmGqW8kYws7Vxg==} + + '@types/mysql@2.15.27': + resolution: {integrity: sha512-YfWiV16IY0OeBfBCk8+hXKmdTKrKlwKN1MNKAPBu5JYxLwBEZl7QzeEpGnlZb3VMGJrrGmB84gXiH+ofs/TezA==} + + '@types/node@22.18.1': + resolution: {integrity: sha512-rzSDyhn4cYznVG+PCzGe1lwuMYJrcBS1fc3JqSa2PvtABwWo+dZ1ij5OVok3tqfpEBCBoaR4d7upFJk73HRJDw==} + + '@types/oracledb@6.5.2': + resolution: {integrity: sha512-kK1eBS/Adeyis+3OlBDMeQQuasIDLUYXsi2T15ccNJ0iyUpQ4xDF7svFu3+bGVrI0CMBUclPciz+lsQR3JX3TQ==} + + '@types/pg-pool@2.0.6': + resolution: {integrity: sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ==} + + '@types/pg@8.15.5': + resolution: {integrity: sha512-LF7lF6zWEKxuT3/OR8wAZGzkg4ENGXFNyiV/JeOt9z5B+0ZVwbql9McqX5c/WStFq1GaGso7H1AzP/qSzmlCKQ==} + + '@types/semver@7.7.1': + resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} + + '@types/stack-utils@2.0.3': + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + + '@types/tedious@4.0.14': + resolution: {integrity: sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==} + + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.33': + resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} + + '@typescript-eslint/eslint-plugin@6.21.0': + resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@6.21.0': + resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@6.21.0': + resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/type-utils@6.21.0': + resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@6.21.0': + resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/typescript-estree@6.21.0': + resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@6.21.0': + resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + + '@typescript-eslint/visitor-keys@6.21.0': + resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + acorn-import-attributes@1.9.5: + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} + engines: {node: '>= 0.4'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array.prototype.findlastindex@1.2.6: + resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + babel-jest@29.7.0: + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + + babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + + babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + babel-preset-current-node-syntax@1.2.0: + resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} + peerDependencies: + '@babel/core': ^7.0.0 || ^8.0.0-0 + + babel-preset-jest@29.6.3: + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + bignumber.js@9.3.1: + resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.25.4: + resolution: {integrity: sha512-4jYpcjabC606xJ3kw2QwGEZKX0Aw7sgQdZCvIK9dhVSPh76BKo+C+btT1RRofH7B+8iNpEbgGNVWiLki5q93yg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + + bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + builtins@5.1.0: + resolution: {integrity: sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + caniuse-lite@1.0.30001741: + resolution: {integrity: sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + cjs-module-lexer@1.4.3: + resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + create-jest@29.7.0: + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + dedent@1.7.0: + resolution: {integrity: sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + electron-to-chromium@1.5.214: + resolution: {integrity: sha512-TpvUNdha+X3ybfU78NoQatKvQEm1oq3lf2QbnmCEdw+Bd9RuIAY+hJTvq1avzHM0f7EJfnH3vbCnbzKzisc/9Q==} + + emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-abstract@1.24.0: + resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + esbuild-plugin-copy@2.1.1: + resolution: {integrity: sha512-Bk66jpevTcV8KMFzZI1P7MZKZ+uDcrZm2G2egZ2jNIvVnivDpodZI+/KnpL3Jnap0PBdIHU7HwFGB8r+vV5CVw==} + peerDependencies: + esbuild: '>= 0.14.0' + + esbuild-svelte@0.9.3: + resolution: {integrity: sha512-CgEcGY1r/d16+aggec3czoFBEBaYIrFOnMxpsO6fWNaNEqHregPN5DLAPZDqrL7rXDNplW+WMu8s3GMq9FqgJA==} + engines: {node: '>=18'} + peerDependencies: + esbuild: '>=0.17.0' + svelte: '>=4.2.1 <6' + + esbuild@0.24.2: + resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-standard-with-typescript@40.0.0: + resolution: {integrity: sha512-GXUJcwIXiTQaS3H4etv8a1lejVVdZYaxZNz3g7vt6GoJosQqMTurbmSC4FVGyHiGT/d1TjFr3+47A3xsHhsG+Q==} + deprecated: Please use eslint-config-love, instead. + peerDependencies: + '@typescript-eslint/eslint-plugin': ^6.4.0 + eslint: ^8.0.1 + eslint-plugin-import: ^2.25.2 + eslint-plugin-n: '^15.0.0 || ^16.0.0 ' + eslint-plugin-promise: ^6.0.0 + typescript: '*' + + eslint-config-standard@17.1.0: + resolution: {integrity: sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==} + engines: {node: '>=12.0.0'} + peerDependencies: + eslint: ^8.0.1 + eslint-plugin-import: ^2.25.2 + eslint-plugin-n: '^15.0.0 || ^16.0.0 ' + eslint-plugin-promise: ^6.0.0 + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-module-utils@2.12.1: + resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} + engines: {node: '>=4'} + peerDependencies: + eslint: '*' + peerDependenciesMeta: + eslint: + optional: true + + eslint-plugin-es@4.1.0: + resolution: {integrity: sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==} + engines: {node: '>=8.10.0'} + peerDependencies: + eslint: '>=4.19.1' + + eslint-plugin-import@2.32.0: + resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + + eslint-plugin-n@15.7.0: + resolution: {integrity: sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==} + engines: {node: '>=12.22.0'} + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-promise@6.6.0: + resolution: {integrity: sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-utils@2.1.0: + resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} + engines: {node: '>=6'} + + eslint-utils@3.0.0: + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + + eslint-visitor-keys@1.3.0: + resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} + engines: {node: '>=4'} + + eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.1: + resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + + expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + forwarded-parse@2.1.2: + resolution: {integrity: sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + gaxios@6.7.1: + resolution: {integrity: sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==} + engines: {node: '>=14'} + + gcp-metadata@6.1.1: + resolution: {integrity: sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==} + engines: {node: '>=14'} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + google-logging-utils@0.0.2: + resolution: {integrity: sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==} + engines: {node: '>=14'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + import-in-the-middle@1.14.2: + resolution: {integrity: sha512-5tCuY9BV8ujfOpwtAGgsTx9CGUapcFMEEyByLv1B+v2+6DhAcw+Zr0nhQT7uwaZ7DiourxFEscghOR8e1aPLQw==} + + import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} + engines: {node: '>=8'} + hasBin: true + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {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. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} + engines: {node: '>=10'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} + engines: {node: '>=8'} + + jest-changed-files@29.7.0: + resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-circus@29.7.0: + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-cli@29.7.0: + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jest-config@29.7.0: + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + + jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-docblock@29.7.0: + resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-each@29.7.0: + resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-leak-detector@29.7.0: + resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-pnp-resolver@1.2.3: + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + + jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve-dependencies@29.7.0: + resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve@29.7.0: + resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runner@29.7.0: + resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runtime@29.7.0: + resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-snapshot@29.7.0: + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-watcher@29.7.0: + resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest@29.7.0: + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-bigint@1.0.0: + resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + module-details-from-path@1.0.4: + resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + + node-releases@2.0.20: + resolution: {integrity: sha512-7gK6zSXEH6neM212JgfYFXe+GmZQM+fia5SsusuBIUgnPheLFBmIPhtFoAQRj8/7wASYQnbDlHPVwY0BefoFgA==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pg-int8@1.0.1: + resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} + engines: {node: '>=4.0.0'} + + pg-protocol@1.10.3: + resolution: {integrity: sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==} + + pg-types@2.2.0: + resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} + engines: {node: '>=4'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + postcss-scss@4.0.9: + resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.4.29 + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + postgres-array@2.0.0: + resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} + engines: {node: '>=4'} + + postgres-bytea@1.0.0: + resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} + engines: {node: '>=0.10.0'} + + postgres-date@1.0.7: + resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} + engines: {node: '>=0.10.0'} + + postgres-interval@1.2.0: + resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} + engines: {node: '>=0.10.0'} + + postgres@3.4.7: + resolution: {integrity: sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw==} + engines: {node: '>=12'} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} + engines: {node: '>=14'} + hasBin: true + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + protobufjs@7.5.4: + resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} + engines: {node: '>=12.0.0'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + regexpp@3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} + engines: {node: '>=8'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-in-the-middle@7.5.2: + resolution: {integrity: sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==} + engines: {node: '>=8.6.0'} + + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve.exports@2.0.3: + resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} + engines: {node: '>=10'} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + simplytyped@3.3.0: + resolution: {integrity: sha512-mz4RaNdKTZiaKXgi6P1k/cdsxV3gz+y1Wh2NXHWD40dExktLh4Xx/h6MFakmQWODZHj/2rKe59acacpL74ZhQA==} + peerDependencies: + typescript: '>=2.8.0' + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + + string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svelte-eslint-parser@0.33.1: + resolution: {integrity: sha512-vo7xPGTlKBGdLH8T5L64FipvTrqv3OQRx9d2z5X05KKZDlF4rQk8KViZO4flKERY+5BiVdOh7zZ7JGJWo5P0uA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + svelte: ^3.37.0 || ^4.0.0 + peerDependenciesMeta: + svelte: + optional: true + + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + ts-api-utils@1.4.3: + resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + ts-jest@29.4.1: + resolution: {integrity: sha512-SaeUtjfpg9Uqu8IbeDKtdaS0g8lS6FT6OzM3ezrDfErPJPHNDo/Ey+VFGP1bQIDfagYDLyRpd7O15XpG1Es2Uw==} + engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/transform': ^29.0.0 || ^30.0.0 + '@jest/types': ^29.0.0 || ^30.0.0 + babel-jest: ^29.0.0 || ^30.0.0 + esbuild: '*' + jest: ^29.0.0 || ^30.0.0 + jest-util: ^29.0.0 || ^30.0.0 + typescript: '>=4.3 <6' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/transform': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + jest-util: + optional: true + + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + typescript@5.9.2: + resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} + engines: {node: '>=14.17'} + hasBin: true + + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + v8-to-istanbul@9.3.0: + resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} + engines: {node: '>=10.12.0'} + + walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + +snapshots: + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.28.4': {} + + '@babel/core@7.28.4': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.4 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.1 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.28.3': + dependencies: + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.30 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.28.4 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.25.4 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.27.1': {} + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.28.4': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.4 + + '@babel/parser@7.28.4': + dependencies: + '@babel/types': 7.28.4 + + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + + '@babel/traverse@7.28.4': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.4 + '@babel/template': 7.27.2 + '@babel/types': 7.28.4 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.28.4': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@bcoe/v8-coverage@0.2.3': {} + + '@esbuild/aix-ppc64@0.24.2': + optional: true + + '@esbuild/android-arm64@0.24.2': + optional: true + + '@esbuild/android-arm@0.24.2': + optional: true + + '@esbuild/android-x64@0.24.2': + optional: true + + '@esbuild/darwin-arm64@0.24.2': + optional: true + + '@esbuild/darwin-x64@0.24.2': + optional: true + + '@esbuild/freebsd-arm64@0.24.2': + optional: true + + '@esbuild/freebsd-x64@0.24.2': + optional: true + + '@esbuild/linux-arm64@0.24.2': + optional: true + + '@esbuild/linux-arm@0.24.2': + optional: true + + '@esbuild/linux-ia32@0.24.2': + optional: true + + '@esbuild/linux-loong64@0.24.2': + optional: true + + '@esbuild/linux-mips64el@0.24.2': + optional: true + + '@esbuild/linux-ppc64@0.24.2': + optional: true + + '@esbuild/linux-riscv64@0.24.2': + optional: true + + '@esbuild/linux-s390x@0.24.2': + optional: true + + '@esbuild/linux-x64@0.24.2': + optional: true + + '@esbuild/netbsd-arm64@0.24.2': + optional: true + + '@esbuild/netbsd-x64@0.24.2': + optional: true + + '@esbuild/openbsd-arm64@0.24.2': + optional: true + + '@esbuild/openbsd-x64@0.24.2': + optional: true + + '@esbuild/sunos-x64@0.24.2': + optional: true + + '@esbuild/win32-arm64@0.24.2': + optional: true + + '@esbuild/win32-ia32@0.24.2': + optional: true + + '@esbuild/win32-x64@0.24.2': + optional: true + + '@eslint-community/eslint-utils@4.9.0(eslint@8.57.1)': + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.4.1 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.1': {} + + '@grpc/grpc-js@1.13.4': + dependencies: + '@grpc/proto-loader': 0.7.15 + '@js-sdsl/ordered-map': 4.4.2 + + '@grpc/proto-loader@0.7.15': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.3.2 + protobufjs: 7.5.4 + yargs: 17.7.2 + + '@humanwhocodes/config-array@0.13.0': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.1 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@istanbuljs/load-nyc-config@1.1.0': + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + + '@istanbuljs/schema@0.1.3': {} + + '@jest/console@29.7.0': + dependencies: + '@jest/types': 29.6.3 + '@types/node': 22.18.1 + chalk: 4.1.2 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + + '@jest/core@29.7.0': + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.18.1 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@22.18.1) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.8 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + + '@jest/environment@29.7.0': + dependencies: + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.18.1 + jest-mock: 29.7.0 + + '@jest/expect-utils@29.7.0': + dependencies: + jest-get-type: 29.6.3 + + '@jest/expect@29.7.0': + dependencies: + expect: 29.7.0 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + + '@jest/fake-timers@29.7.0': + dependencies: + '@jest/types': 29.6.3 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 22.18.1 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + '@jest/globals@29.7.0': + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/types': 29.6.3 + jest-mock: 29.7.0 + transitivePeerDependencies: + - supports-color + + '@jest/reporters@29.7.0': + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.30 + '@types/node': 22.18.1 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.3 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.2.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + jest-worker: 29.7.0 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + v8-to-istanbul: 9.3.0 + transitivePeerDependencies: + - supports-color + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jest/source-map@29.6.3': + dependencies: + '@jridgewell/trace-mapping': 0.3.30 + callsites: 3.1.0 + graceful-fs: 4.2.11 + + '@jest/test-result@29.7.0': + dependencies: + '@jest/console': 29.7.0 + '@jest/types': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 + + '@jest/test-sequencer@29.7.0': + dependencies: + '@jest/test-result': 29.7.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + slash: 3.0.0 + + '@jest/transform@29.7.0': + dependencies: + '@babel/core': 7.28.4 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.30 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + micromatch: 4.0.8 + pirates: 4.0.7 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + + '@jest/types@29.6.3': + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 22.18.1 + '@types/yargs': 17.0.33 + chalk: 4.1.2 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.30 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.30 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.30': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@js-sdsl/ordered-map@4.4.2': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@opentelemetry/api-logs@0.203.0': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/api@1.9.0': {} + + '@opentelemetry/auto-instrumentations-node@0.62.2(@opentelemetry/api@1.9.0)(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-amqplib': 0.50.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-aws-lambda': 0.54.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-aws-sdk': 0.58.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-bunyan': 0.49.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-cassandra-driver': 0.49.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-connect': 0.47.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-cucumber': 0.19.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-dataloader': 0.21.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-dns': 0.47.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-express': 0.52.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-fastify': 0.48.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-fs': 0.23.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-generic-pool': 0.47.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-graphql': 0.51.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-grpc': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-hapi': 0.50.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-http': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-ioredis': 0.51.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-kafkajs': 0.13.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-knex': 0.48.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-koa': 0.51.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-lru-memoizer': 0.48.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-memcached': 0.47.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mongodb': 0.56.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mongoose': 0.50.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mysql': 0.49.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mysql2': 0.50.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-nestjs-core': 0.49.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-net': 0.47.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-oracledb': 0.29.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-pg': 0.56.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-pino': 0.50.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-redis': 0.52.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-restify': 0.49.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-router': 0.48.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-runtime-node': 0.17.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-socket.io': 0.50.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-tedious': 0.22.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-undici': 0.14.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-winston': 0.48.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resource-detector-alibaba-cloud': 0.31.3(@opentelemetry/api@1.9.0) + '@opentelemetry/resource-detector-aws': 2.3.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resource-detector-azure': 0.10.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resource-detector-container': 0.7.3(@opentelemetry/api@1.9.0) + '@opentelemetry/resource-detector-gcp': 0.37.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-node': 0.203.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - encoding + - supports-color + + '@opentelemetry/context-async-hooks@2.0.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/core@2.0.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.37.0 + + '@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.37.0 + + '@opentelemetry/exporter-logs-otlp-grpc@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@grpc/grpc-js': 1.13.4 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-grpc-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-logs-otlp-http@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.203.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-logs-otlp-proto@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.203.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-metrics-otlp-grpc@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@grpc/grpc-js': 1.13.4 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-metrics-otlp-http': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-grpc-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-metrics-otlp-http@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-metrics-otlp-proto@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-metrics-otlp-http': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-prometheus@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-trace-otlp-grpc@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@grpc/grpc-js': 1.13.4 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-grpc-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-trace-otlp-http@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-zipkin@2.0.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + + '@opentelemetry/id-generator-aws-xray@2.0.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/instrumentation-amqplib@0.50.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-aws-lambda@0.54.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + '@types/aws-lambda': 8.10.152 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-aws-sdk@0.58.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-bunyan@0.49.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.203.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@types/bunyan': 1.8.11 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-cassandra-driver@0.49.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-connect@0.47.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + '@types/connect': 3.4.38 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-cucumber@0.19.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-dataloader@0.21.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-dns@0.47.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-express@0.52.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-fastify@0.48.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-fs@0.23.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-generic-pool@0.47.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-graphql@0.51.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-grpc@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-hapi@0.50.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-http@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + forwarded-parse: 2.1.2 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-ioredis@0.51.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/redis-common': 0.38.0 + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-kafkajs@0.13.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-knex@0.48.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-koa@0.51.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-lru-memoizer@0.48.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-memcached@0.47.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + '@types/memcached': 2.2.10 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-mongodb@0.56.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-mongoose@0.50.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-mysql2@0.50.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/sql-common': 0.41.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-mysql@0.49.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + '@types/mysql': 2.15.27 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-nestjs-core@0.49.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-net@0.47.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-oracledb@0.29.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + '@types/oracledb': 6.5.2 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-pg@0.56.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/sql-common': 0.41.0(@opentelemetry/api@1.9.0) + '@types/pg': 8.15.5 + '@types/pg-pool': 2.0.6 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-pino@0.50.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.203.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-redis@0.52.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/redis-common': 0.38.0 + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-restify@0.49.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-router@0.48.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-runtime-node@0.17.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-socket.io@0.50.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-tedious@0.22.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + '@types/tedious': 4.0.14 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-undici@0.14.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-winston@0.48.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.203.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.203.0 + import-in-the-middle: 1.14.2 + require-in-the-middle: 7.5.2 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/otlp-exporter-base@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/otlp-grpc-exporter-base@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@grpc/grpc-js': 1.13.4 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/otlp-transformer@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.203.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + protobufjs: 7.5.4 + + '@opentelemetry/propagator-b3@2.0.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/propagator-jaeger@2.0.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/redis-common@0.38.0': {} + + '@opentelemetry/resource-detector-alibaba-cloud@0.31.3(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + + '@opentelemetry/resource-detector-aws@2.3.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + + '@opentelemetry/resource-detector-azure@0.10.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + + '@opentelemetry/resource-detector-container@0.7.3(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + + '@opentelemetry/resource-detector-gcp@0.37.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + gcp-metadata: 6.1.1 + transitivePeerDependencies: + - encoding + - supports-color + + '@opentelemetry/resources@2.0.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + + '@opentelemetry/resources@2.1.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + + '@opentelemetry/sdk-logs@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.203.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/sdk-metrics@2.0.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/sdk-metrics@2.1.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/sdk-node@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.203.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-logs-otlp-grpc': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-logs-otlp-http': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-logs-otlp-proto': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-metrics-otlp-grpc': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-metrics-otlp-http': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-metrics-otlp-proto': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-prometheus': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-grpc': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-http': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-proto': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-zipkin': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/propagator-b3': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/propagator-jaeger': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-node': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + + '@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + + '@opentelemetry/sdk-trace-node@2.0.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/sdk-trace-node@2.1.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/semantic-conventions@1.37.0': {} + + '@opentelemetry/sql-common@0.41.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + + '@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': + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 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': {} + + '@rtsao/scc@1.1.0': {} + + '@sinclair/typebox@0.27.8': {} + + '@sinonjs/commons@3.0.1': + dependencies: + type-detect: 4.0.8 + + '@sinonjs/fake-timers@10.3.0': + dependencies: + '@sinonjs/commons': 3.0.1 + + '@types/aws-lambda@8.10.152': {} + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.28.0 + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.28.4 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + + '@types/babel__traverse@7.28.0': + dependencies: + '@babel/types': 7.28.4 + + '@types/bunyan@1.8.11': + dependencies: + '@types/node': 22.18.1 + + '@types/connect@3.4.38': + dependencies: + '@types/node': 22.18.1 + + '@types/graceful-fs@4.1.9': + dependencies: + '@types/node': 22.18.1 + + '@types/istanbul-lib-coverage@2.0.6': {} + + '@types/istanbul-lib-report@3.0.3': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + + '@types/istanbul-reports@3.0.4': + dependencies: + '@types/istanbul-lib-report': 3.0.3 + + '@types/jest@29.5.14': + dependencies: + expect: 29.7.0 + pretty-format: 29.7.0 + + '@types/json-schema@7.0.15': {} + + '@types/json5@0.0.29': {} + + '@types/memcached@2.2.10': + dependencies: + '@types/node': 22.18.1 + + '@types/mysql@2.15.27': + dependencies: + '@types/node': 22.18.1 + + '@types/node@22.18.1': + dependencies: + undici-types: 6.21.0 + + '@types/oracledb@6.5.2': + dependencies: + '@types/node': 22.18.1 + + '@types/pg-pool@2.0.6': + dependencies: + '@types/pg': 8.15.5 + + '@types/pg@8.15.5': + dependencies: + '@types/node': 22.18.1 + pg-protocol: 1.10.3 + pg-types: 2.2.0 + + '@types/semver@7.7.1': {} + + '@types/stack-utils@2.0.3': {} + + '@types/tedious@4.0.14': + dependencies: + '@types/node': 22.18.1 + + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@17.0.33': + dependencies: + '@types/yargs-parser': 21.0.3 + + '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.9.2) + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1)(typescript@5.9.2) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.4.1 + eslint: 8.57.1 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + semver: 7.7.2 + ts-api-utils: 1.4.3(typescript@5.9.2) + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.2)': + dependencies: + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.4.1 + eslint: 8.57.1 + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@6.21.0': + dependencies: + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + + '@typescript-eslint/type-utils@6.21.0(eslint@8.57.1)(typescript@5.9.2)': + dependencies: + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.2) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.9.2) + debug: 4.4.1 + eslint: 8.57.1 + ts-api-utils: 1.4.3(typescript@5.9.2) + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@6.21.0': {} + + '@typescript-eslint/typescript-estree@6.21.0(typescript@5.9.2)': + dependencies: + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.4.1 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.7.2 + ts-api-utils: 1.4.3(typescript@5.9.2) + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@5.9.2)': + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) + '@types/json-schema': 7.0.15 + '@types/semver': 7.7.1 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.2) + eslint: 8.57.1 + semver: 7.7.2 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@6.21.0': + dependencies: + '@typescript-eslint/types': 6.21.0 + eslint-visitor-keys: 3.4.3 + + '@ungap/structured-clone@1.3.0': {} + + acorn-import-attributes@1.9.5(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn@8.15.0: {} + + agent-base@7.1.4: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + + array-includes@3.1.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + is-string: 1.1.1 + math-intrinsics: 1.1.0 + + array-union@2.1.0: {} + + array.prototype.findlastindex@1.2.6: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + + array.prototype.flat@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-shim-unscopables: 1.1.0 + + array.prototype.flatmap@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-shim-unscopables: 1.1.0 + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + + async-function@1.0.0: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + babel-jest@29.7.0(@babel/core@7.28.4): + dependencies: + '@babel/core': 7.28.4 + '@jest/transform': 29.7.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.6.3(@babel/core@7.28.4) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-istanbul@6.1.1: + dependencies: + '@babel/helper-plugin-utils': 7.27.1 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-jest-hoist@29.6.3: + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.4 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.28.0 + + babel-preset-current-node-syntax@1.2.0(@babel/core@7.28.4): + dependencies: + '@babel/core': 7.28.4 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.4) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.4) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.4) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.4) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.4) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.4) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.4) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.4) + + babel-preset-jest@29.6.3(@babel/core@7.28.4): + dependencies: + '@babel/core': 7.28.4 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.4) + + balanced-match@1.0.2: {} + + bignumber.js@9.3.1: {} + + binary-extensions@2.3.0: {} + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.25.4: + dependencies: + caniuse-lite: 1.0.30001741 + electron-to-chromium: 1.5.214 + node-releases: 2.0.20 + update-browserslist-db: 1.1.3(browserslist@4.25.4) + + bs-logger@0.2.6: + dependencies: + fast-json-stable-stringify: 2.1.0 + + bser@2.1.1: + dependencies: + node-int64: 0.4.0 + + buffer-from@1.1.2: {} + + builtins@5.1.0: + dependencies: + semver: 7.7.2 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + camelcase@5.3.1: {} + + camelcase@6.3.0: {} + + caniuse-lite@1.0.30001741: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + char-regex@1.0.2: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + ci-info@3.9.0: {} + + cjs-module-lexer@1.4.3: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + co@4.6.0: {} + + collect-v8-coverage@1.0.2: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + concat-map@0.0.1: {} + + convert-source-map@2.0.0: {} + + create-jest@29.7.0(@types/node@22.18.1): + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@22.18.1) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + debug@3.2.7: + dependencies: + ms: 2.1.3 + + debug@4.4.1: + dependencies: + ms: 2.1.3 + + dedent@1.7.0: {} + + deep-is@0.1.4: {} + + deepmerge@4.3.1: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + detect-newline@3.1.0: {} + + diff-sequences@29.6.3: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + electron-to-chromium@1.5.214: {} + + emittery@0.13.1: {} + + emoji-regex@8.0.0: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-abstract@1.24.0: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.19 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-shim-unscopables@1.1.0: + dependencies: + hasown: 2.0.2 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + esbuild-plugin-copy@2.1.1(esbuild@0.24.2): + dependencies: + chalk: 4.1.2 + chokidar: 3.6.0 + esbuild: 0.24.2 + fs-extra: 10.1.0 + globby: 11.1.0 + + esbuild-svelte@0.9.3(esbuild@0.24.2): + dependencies: + '@jridgewell/trace-mapping': 0.3.30 + esbuild: 0.24.2 + + esbuild@0.24.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.24.2 + '@esbuild/android-arm': 0.24.2 + '@esbuild/android-arm64': 0.24.2 + '@esbuild/android-x64': 0.24.2 + '@esbuild/darwin-arm64': 0.24.2 + '@esbuild/darwin-x64': 0.24.2 + '@esbuild/freebsd-arm64': 0.24.2 + '@esbuild/freebsd-x64': 0.24.2 + '@esbuild/linux-arm': 0.24.2 + '@esbuild/linux-arm64': 0.24.2 + '@esbuild/linux-ia32': 0.24.2 + '@esbuild/linux-loong64': 0.24.2 + '@esbuild/linux-mips64el': 0.24.2 + '@esbuild/linux-ppc64': 0.24.2 + '@esbuild/linux-riscv64': 0.24.2 + '@esbuild/linux-s390x': 0.24.2 + '@esbuild/linux-x64': 0.24.2 + '@esbuild/netbsd-arm64': 0.24.2 + '@esbuild/netbsd-x64': 0.24.2 + '@esbuild/openbsd-arm64': 0.24.2 + '@esbuild/openbsd-x64': 0.24.2 + '@esbuild/sunos-x64': 0.24.2 + '@esbuild/win32-arm64': 0.24.2 + '@esbuild/win32-ia32': 0.24.2 + '@esbuild/win32-x64': 0.24.2 + + escalade@3.2.0: {} + + escape-string-regexp@2.0.0: {} + + escape-string-regexp@4.0.0: {} + + eslint-config-standard-with-typescript@40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.2): + dependencies: + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.9.2) + eslint: 8.57.1 + eslint-config-standard: 17.1.0(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1) + eslint-plugin-import: 2.32.0(eslint@8.57.1) + eslint-plugin-n: 15.7.0(eslint@8.57.1) + eslint-plugin-promise: 6.6.0(eslint@8.57.1) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + eslint-config-standard@17.1.0(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + eslint-plugin-import: 2.32.0(eslint@8.57.1) + eslint-plugin-n: 15.7.0(eslint@8.57.1) + eslint-plugin-promise: 6.6.0(eslint@8.57.1) + + eslint-import-resolver-node@0.3.9: + dependencies: + debug: 3.2.7 + is-core-module: 2.16.1 + resolve: 1.22.10 + + eslint-module-utils@2.12.1(eslint@8.57.1): + dependencies: + debug: 3.2.7 + optionalDependencies: + eslint: 8.57.1 + + eslint-plugin-es@4.1.0(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + eslint-utils: 2.1.0 + regexpp: 3.2.0 + + eslint-plugin-import@2.32.0(eslint@8.57.1): + dependencies: + '@rtsao/scc': 1.1.0 + array-includes: 3.1.9 + array.prototype.findlastindex: 1.2.6 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.57.1 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.1(eslint@8.57.1) + hasown: 2.0.2 + is-core-module: 2.16.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 + semver: 6.3.1 + string.prototype.trimend: 1.0.9 + tsconfig-paths: 3.15.0 + + eslint-plugin-n@15.7.0(eslint@8.57.1): + dependencies: + builtins: 5.1.0 + eslint: 8.57.1 + eslint-plugin-es: 4.1.0(eslint@8.57.1) + eslint-utils: 3.0.0(eslint@8.57.1) + ignore: 5.3.2 + is-core-module: 2.16.1 + minimatch: 3.1.2 + resolve: 1.22.10 + semver: 7.7.2 + + eslint-plugin-promise@6.6.0(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-utils@2.1.0: + dependencies: + eslint-visitor-keys: 1.3.0 + + eslint-utils@3.0.0(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 2.1.0 + + eslint-visitor-keys@1.3.0: {} + + eslint-visitor-keys@2.1.0: {} + + eslint-visitor-keys@3.4.3: {} + + eslint@8.57.1: + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.1 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.3.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.1 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + espree@9.6.1: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 3.4.3 + + esprima@4.0.1: {} + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + exit@0.1.2: {} + + expect@29.7.0: + dependencies: + '@jest/expect-utils': 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + + extend@3.0.2: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + fb-watchman@2.0.2: + dependencies: + bser: 2.1.1 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + rimraf: 3.0.2 + + flatted@3.3.3: {} + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + forwarded-parse@2.1.2: {} + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + + functions-have-names@1.2.3: {} + + gaxios@6.7.1: + dependencies: + extend: 3.0.2 + https-proxy-agent: 7.0.6 + is-stream: 2.0.1 + node-fetch: 2.7.0 + uuid: 9.0.1 + transitivePeerDependencies: + - encoding + - supports-color + + gcp-metadata@6.1.1: + dependencies: + gaxios: 6.7.1 + google-logging-utils: 0.0.2 + json-bigint: 1.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-package-type@0.1.0: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stream@6.0.1: {} + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + google-logging-utils@0.0.2: {} + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + handlebars@4.7.8: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + + has-bigints@1.1.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + html-escaper@2.0.2: {} + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + human-signals@2.1.0: {} + + ignore@5.3.2: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-in-the-middle@1.14.2: + dependencies: + acorn: 8.15.0 + acorn-import-attributes: 1.9.5(acorn@8.15.0) + cjs-module-lexer: 1.4.3 + module-details-from-path: 1.0.4 + + import-local@3.2.0: + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-arrayish@0.2.1: {} + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-callable@1.2.7: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-fullwidth-code-point@3.0.0: {} + + is-generator-fn@2.1.0: {} + + is-generator-function@1.1.0: + dependencies: + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-map@2.0.3: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-path-inside@3.0.3: {} + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-stream@2.0.1: {} + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.19 + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-instrument@5.2.1: + dependencies: + '@babel/core': 7.28.4 + '@babel/parser': 7.28.4 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + istanbul-lib-instrument@6.0.3: + dependencies: + '@babel/core': 7.28.4 + '@babel/parser': 7.28.4 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 7.7.2 + transitivePeerDependencies: + - supports-color + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@4.0.1: + dependencies: + debug: 4.4.1 + istanbul-lib-coverage: 3.2.2 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.2.0: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + jest-changed-files@29.7.0: + dependencies: + execa: 5.1.1 + jest-util: 29.7.0 + p-limit: 3.1.0 + + jest-circus@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.18.1 + chalk: 4.1.2 + co: 4.6.0 + dedent: 1.7.0 + is-generator-fn: 2.1.0 + jest-each: 29.7.0 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + p-limit: 3.1.0 + pretty-format: 29.7.0 + pure-rand: 6.1.0 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-cli@29.7.0(@types/node@22.18.1): + dependencies: + '@jest/core': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@22.18.1) + exit: 0.1.2 + import-local: 3.2.0 + jest-config: 29.7.0(@types/node@22.18.1) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jest-config@29.7.0(@types/node@22.18.1): + dependencies: + '@babel/core': 7.28.4 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.28.4) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 22.18.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-diff@29.7.0: + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-docblock@29.7.0: + dependencies: + detect-newline: 3.1.0 + + jest-each@29.7.0: + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + jest-get-type: 29.6.3 + jest-util: 29.7.0 + pretty-format: 29.7.0 + + jest-environment-node@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.18.1 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + jest-get-type@29.6.3: {} + + jest-haste-map@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/graceful-fs': 4.1.9 + '@types/node': 22.18.1 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + jest-worker: 29.7.0 + micromatch: 4.0.8 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + + jest-leak-detector@29.7.0: + dependencies: + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-matcher-utils@29.7.0: + dependencies: + chalk: 4.1.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-message-util@29.7.0: + dependencies: + '@babel/code-frame': 7.27.1 + '@jest/types': 29.6.3 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.8 + pretty-format: 29.7.0 + slash: 3.0.0 + stack-utils: 2.0.6 + + jest-mock@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 22.18.1 + jest-util: 29.7.0 + + jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): + optionalDependencies: + jest-resolve: 29.7.0 + + jest-regex-util@29.6.3: {} + + jest-resolve-dependencies@29.7.0: + dependencies: + jest-regex-util: 29.6.3 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + + jest-resolve@29.7.0: + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) + jest-util: 29.7.0 + jest-validate: 29.7.0 + resolve: 1.22.10 + resolve.exports: 2.0.3 + slash: 3.0.0 + + jest-runner@29.7.0: + dependencies: + '@jest/console': 29.7.0 + '@jest/environment': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.18.1 + chalk: 4.1.2 + emittery: 0.13.1 + graceful-fs: 4.2.11 + jest-docblock: 29.7.0 + jest-environment-node: 29.7.0 + jest-haste-map: 29.7.0 + jest-leak-detector: 29.7.0 + jest-message-util: 29.7.0 + jest-resolve: 29.7.0 + jest-runtime: 29.7.0 + jest-util: 29.7.0 + jest-watcher: 29.7.0 + jest-worker: 29.7.0 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + + jest-runtime@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/globals': 29.7.0 + '@jest/source-map': 29.6.3 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.18.1 + chalk: 4.1.2 + cjs-module-lexer: 1.4.3 + collect-v8-coverage: 1.0.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + + jest-snapshot@29.7.0: + dependencies: + '@babel/core': 7.28.4 + '@babel/generator': 7.28.3 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4) + '@babel/types': 7.28.4 + '@jest/expect-utils': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.4) + chalk: 4.1.2 + expect: 29.7.0 + graceful-fs: 4.2.11 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + natural-compare: 1.4.0 + pretty-format: 29.7.0 + semver: 7.7.2 + transitivePeerDependencies: + - supports-color + + jest-util@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 22.18.1 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + + jest-validate@29.7.0: + dependencies: + '@jest/types': 29.6.3 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.6.3 + leven: 3.1.0 + pretty-format: 29.7.0 + + jest-watcher@29.7.0: + dependencies: + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.18.1 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 29.7.0 + string-length: 4.0.2 + + jest-worker@29.7.0: + dependencies: + '@types/node': 22.18.1 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jest@29.7.0(@types/node@22.18.1): + dependencies: + '@jest/core': 29.7.0 + '@jest/types': 29.6.3 + import-local: 3.2.0 + jest-cli: 29.7.0(@types/node@22.18.1) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + js-tokens@4.0.0: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@3.1.0: {} + + json-bigint@1.0.0: + dependencies: + bignumber.js: 9.3.1 + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@1.0.2: + dependencies: + minimist: 1.2.8 + + json5@2.2.3: {} + + jsonfile@6.2.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kleur@3.0.3: {} + + leven@3.1.0: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lines-and-columns@1.2.4: {} + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.camelcase@4.3.0: {} + + lodash.memoize@4.1.2: {} + + lodash.merge@4.6.2: {} + + long@5.3.2: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + make-dir@4.0.0: + dependencies: + semver: 7.7.2 + + make-error@1.3.6: {} + + makeerror@1.0.12: + dependencies: + tmpl: 1.0.5 + + math-intrinsics@1.1.0: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mimic-fn@2.1.0: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@9.0.3: + dependencies: + brace-expansion: 2.0.2 + + minimist@1.2.8: {} + + module-details-from-path@1.0.4: {} + + ms@2.1.3: {} + + nanoid@3.3.11: {} + + natural-compare@1.4.0: {} + + neo-async@2.6.2: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-int64@0.4.0: {} + + node-releases@2.0.20: {} + + normalize-path@3.0.0: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + + object.groupby@1.0.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + + object.values@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-try@2.2.0: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.27.1 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-type@4.0.0: {} + + pg-int8@1.0.1: {} + + pg-protocol@1.10.3: {} + + pg-types@2.2.0: + dependencies: + pg-int8: 1.0.1 + postgres-array: 2.0.0 + postgres-bytea: 1.0.0 + postgres-date: 1.0.7 + postgres-interval: 1.2.0 + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + pirates@4.0.7: {} + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + possible-typed-array-names@1.1.0: {} + + postcss-scss@4.0.9(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + postgres-array@2.0.0: {} + + postgres-bytea@1.0.0: {} + + postgres-date@1.0.7: {} + + postgres-interval@1.2.0: + dependencies: + xtend: 4.0.2 + + postgres@3.4.7: {} + + prelude-ls@1.2.1: {} + + prettier@3.6.2: {} + + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + protobufjs@7.5.4: + 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': 22.18.1 + long: 5.3.2 + + punycode@2.3.1: {} + + pure-rand@6.1.0: {} + + queue-microtask@1.2.3: {} + + react-is@18.3.1: {} + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + + regexpp@3.2.0: {} + + require-directory@2.1.1: {} + + require-in-the-middle@7.5.2: + dependencies: + debug: 4.4.1 + module-details-from-path: 1.0.4 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + + resolve-cwd@3.0.0: + dependencies: + resolve-from: 5.0.0 + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve.exports@2.0.3: {} + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.1.0: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + semver@6.3.1: {} + + semver@7.7.2: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@3.0.7: {} + + simplytyped@3.3.0(typescript@5.9.2): + dependencies: + typescript: 5.9.2 + + sisteransi@1.0.5: {} + + slash@3.0.0: {} + + source-map-js@1.2.1: {} + + source-map-support@0.5.13: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + sprintf-js@1.0.3: {} + + stack-utils@2.0.6: + dependencies: + escape-string-regexp: 2.0.0 + + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + + string-length@4.0.2: + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-bom@3.0.0: {} + + strip-bom@4.0.0: {} + + strip-final-newline@2.0.0: {} + + strip-json-comments@3.1.1: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + svelte-eslint-parser@0.33.1: + dependencies: + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + postcss: 8.5.6 + postcss-scss: 4.0.9(postcss@8.5.6) + + test-exclude@6.0.0: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + + text-table@0.2.0: {} + + tmpl@1.0.5: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + tr46@0.0.3: {} + + ts-api-utils@1.4.3(typescript@5.9.2): + dependencies: + typescript: 5.9.2 + + ts-jest@29.4.1(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest-util@29.7.0)(jest@29.7.0(@types/node@22.18.1))(typescript@5.9.2): + dependencies: + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + handlebars: 4.7.8 + jest: 29.7.0(@types/node@22.18.1) + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.7.2 + type-fest: 4.41.0 + typescript: 5.9.2 + yargs-parser: 21.1.1 + optionalDependencies: + '@babel/core': 7.28.4 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.28.4) + jest-util: 29.7.0 + + tsconfig-paths@3.15.0: + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-detect@4.0.8: {} + + type-fest@0.20.2: {} + + type-fest@0.21.3: {} + + type-fest@4.41.0: {} + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + + typescript@5.9.2: {} + + uglify-js@3.19.3: + optional: true + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + + undici-types@6.21.0: {} + + universalify@2.0.1: {} + + update-browserslist-db@1.1.3(browserslist@4.25.4): + dependencies: + browserslist: 4.25.4 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + uuid@9.0.1: {} + + v8-to-istanbul@9.3.0: + dependencies: + '@jridgewell/trace-mapping': 0.3.30 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + + walker@1.0.8: + dependencies: + makeerror: 1.0.12 + + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.19 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.19: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + wordwrap@1.0.0: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrappy@1.0.2: {} + + write-file-atomic@4.0.2: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + + xtend@4.0.2: {} + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-queue@0.1.0: {} diff --git a/common/config/rush/repo-state.json b/common/config/rush/repo-state.json new file mode 100644 index 0000000000..0e7b144099 --- /dev/null +++ b/common/config/rush/repo-state.json @@ -0,0 +1,4 @@ +// DO NOT MODIFY THIS FILE MANUALLY BUT DO COMMIT IT. It is generated and used by Rush. +{ + "preferredVersionsHash": "bf21a9e8fbc5a3846fb05b4fa0859e0917b2202f" +} diff --git a/common/config/rush/rush-plugins.json b/common/config/rush/rush-plugins.json new file mode 100644 index 0000000000..752e373213 --- /dev/null +++ b/common/config/rush/rush-plugins.json @@ -0,0 +1,29 @@ +/** + * This configuration file manages Rush's plugin feature. + */ +{ + "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/rush-plugins.schema.json", + "plugins": [ + /** + * Each item configures a plugin to be loaded by Rush. + */ + // { + // /** + // * The name of the NPM package that provides the plugin. + // */ + // "packageName": "@scope/my-rush-plugin", + // /** + // * The name of the plugin. This can be found in the "pluginName" + // * field of the "rush-plugin-manifest.json" file in the NPM package folder. + // */ + // "pluginName": "my-plugin-name", + // /** + // * The name of a Rush autoinstaller that will be used for installation, which + // * can be created using "rush init-autoinstaller". Add the plugin's NPM package + // * to the package.json "dependencies" of your autoinstaller, then run + // * "rush update-autoinstaller". + // */ + // "autoinstallerName": "rush-plugins" + // } + ] +} \ No newline at end of file diff --git a/common/config/rush/subspaces.json b/common/config/rush/subspaces.json new file mode 100644 index 0000000000..d3c3ae8c51 --- /dev/null +++ b/common/config/rush/subspaces.json @@ -0,0 +1,35 @@ +/** + * This configuration file manages the experimental "subspaces" feature for Rush, + * which allows multiple PNPM lockfiles to be used in a single Rush workspace. + * For full documentation, please see https://rushjs.io + */ +{ + "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/subspaces.schema.json", + + /** + * Set this flag to "true" to enable usage of subspaces. + */ + "subspacesEnabled": false, + + /** + * (DEPRECATED) This is a temporary workaround for migrating from an earlier prototype + * of this feature: https://github.com/microsoft/rushstack/pull/3481 + * It allows subspaces with only one project to store their config files in the project folder. + */ + "splitWorkspaceCompatibility": false, + + /** + * When a command such as "rush update" is invoked without the "--subspace" or "--to" + * parameters, Rush will install all subspaces. In a huge monorepo with numerous subspaces, + * this would be extremely slow. Set "preventSelectingAllSubspaces" to true to avoid this + * mistake by always requiring selection parameters for commands such as "rush update". + */ + "preventSelectingAllSubspaces": false, + + /** + * The list of subspace names, which should be lowercase alphanumeric words separated by + * hyphens, for example "my-subspace". The corresponding config files will have paths + * such as "common/config/subspaces/my-subspace/package-lock.yaml". + */ + "subspaceNames": [] +} diff --git a/common/config/rush/version-policies.json b/common/config/rush/version-policies.json new file mode 100644 index 0000000000..d03b73a3b6 --- /dev/null +++ b/common/config/rush/version-policies.json @@ -0,0 +1,102 @@ +/** + * This is configuration file is used for advanced publishing configurations with Rush. + * More documentation is available on the Rush website: https://rushjs.io + */ + +/** + * A list of version policy definitions. A "version policy" is a custom package versioning + * strategy that affects "rush change", "rush version", and "rush publish". The strategy applies + * to a set of projects that are specified using the "versionPolicyName" field in rush.json. + */ +[ + // { + // /** + // * (Required) Indicates the kind of version policy being defined ("lockStepVersion" or "individualVersion"). + // * + // * The "lockStepVersion" mode specifies that the projects will use "lock-step versioning". This + // * strategy is appropriate for a set of packages that act as selectable components of a + // * unified product. The entire set of packages are always published together, and always share + // * the same NPM version number. When the packages depend on other packages in the set, the + // * SemVer range is usually restricted to a single version. + // */ + // "definitionName": "lockStepVersion", + // + // /** + // * (Required) The name that will be used for the "versionPolicyName" field in rush.json. + // * This name is also used command-line parameters such as "--version-policy" + // * and "--to-version-policy". + // */ + // "policyName": "MyBigFramework", + // + // /** + // * (Required) The current version. All packages belonging to the set should have this version + // * in the current branch. When bumping versions, Rush uses this to determine the next version. + // * (The "version" field in package.json is NOT considered.) + // */ + // "version": "1.0.0", + // + // /** + // * (Required) The type of bump that will be performed when publishing the next release. + // * When creating a release branch in Git, this field should be updated according to the + // * type of release. + // * + // * Valid values are: "prerelease", "preminor", "minor", "patch", "major" + // */ + // "nextBump": "prerelease", + // + // /** + // * (Optional) If specified, all packages in the set share a common CHANGELOG.md file. + // * This file is stored with the specified "main" project, which must be a member of the set. + // * + // * If this field is omitted, then a separate CHANGELOG.md file will be maintained for each + // * package in the set. + // */ + // "mainProject": "my-app", + // + // /** + // * (Optional) If enabled, the "rush change" command will prompt the user for their email address + // * and include it in the JSON change files. If an organization maintains multiple repos, tracking + // * this contact information may be useful for a service that automatically upgrades packages and + // * needs to notify engineers whose change may be responsible for a downstream build break. It might + // * also be useful for crediting contributors. Rush itself does not do anything with the collected + // * email addresses. The default value is "false". + // */ + // // "includeEmailInChangeFile": true + // }, + // + // { + // /** + // * (Required) Indicates the kind of version policy being defined ("lockStepVersion" or "individualVersion"). + // * + // * The "individualVersion" mode specifies that the projects will use "individual versioning". + // * This is the typical NPM model where each package has an independent version number + // * and CHANGELOG.md file. Although a single CI definition is responsible for publishing the + // * packages, they otherwise don't have any special relationship. The version bumping will + // * depend on how developers answer the "rush change" questions for each package that + // * is changed. + // */ + // "definitionName": "individualVersion", + // + // "policyName": "MyRandomLibraries", + // + // /** + // * (Optional) This can be used to enforce that all packages in the set must share a common + // * major version number, e.g. because they are from the same major release branch. + // * It can also be used to discourage people from accidentally making "MAJOR" SemVer changes + // * inappropriately. The minor/patch version parts will be bumped independently according + // * to the types of changes made to each project, according to the "rush change" command. + // */ + // "lockedMajor": 3, + // + // /** + // * (Optional) When publishing is managed by Rush, by default the "rush change" command will + // * request changes for any projects that are modified by a pull request. These change entries + // * will produce a CHANGELOG.md file. If you author your CHANGELOG.md manually or announce updates + // * in some other way, set "exemptFromRushChange" to true to tell "rush change" to ignore the projects + // * belonging to this version policy. + // */ + // "exemptFromRushChange": false, + // + // // "includeEmailInChangeFile": true + // } +] diff --git a/common/git-hooks/commit-msg.sample b/common/git-hooks/commit-msg.sample new file mode 100644 index 0000000000..59cacb80ca --- /dev/null +++ b/common/git-hooks/commit-msg.sample @@ -0,0 +1,25 @@ +#!/bin/sh +# +# This is an example Git hook for use with Rush. To enable this hook, rename this file +# to "commit-msg" and then run "rush install", which will copy it from common/git-hooks +# to the .git/hooks folder. +# +# TO LEARN MORE ABOUT GIT HOOKS +# +# The Git documentation is here: https://git-scm.com/docs/githooks +# Some helpful resources: https://githooks.com +# +# ABOUT THIS EXAMPLE +# +# The commit-msg hook is called by "git commit" with one argument, the name of the file +# that has the commit message. The hook should exit with non-zero status after issuing +# an appropriate message if it wants to stop the commit. The hook is allowed to edit +# the commit message file. + +# This example enforces that commit message should contain a minimum amount of +# description text. +if [ `cat $1 | wc -w` -lt 3 ]; then + echo "" + echo "Invalid commit message: The message must contain at least 3 words." + exit 1 +fi diff --git a/common/scripts/install-run-rush-pnpm.js b/common/scripts/install-run-rush-pnpm.js new file mode 100644 index 0000000000..2356649f4e --- /dev/null +++ b/common/scripts/install-run-rush-pnpm.js @@ -0,0 +1,31 @@ +// THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED. +// +// This script is intended for usage in an automated build environment where the Rush command may not have +// been preinstalled, or may have an unpredictable version. This script will automatically install the version of Rush +// specified in the rush.json configuration file (if not already installed), and then pass a command-line to the +// rush-pnpm command. +// +// An example usage would be: +// +// node common/scripts/install-run-rush-pnpm.js pnpm-command +// +// For more information, see: https://rushjs.io/pages/maintainer/setup_new_repo/ +// +// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. +// See the @microsoft/rush package's LICENSE file for details. + +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +var __webpack_exports__ = {}; +/*!*****************************************************!*\ + !*** ./lib-esnext/scripts/install-run-rush-pnpm.js ***! + \*****************************************************/ + +// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. +// See LICENSE in the project root for license information. +require('./install-run-rush'); +//# sourceMappingURL=install-run-rush-pnpm.js.map +module.exports = __webpack_exports__; +/******/ })() +; +//# sourceMappingURL=install-run-rush-pnpm.js.map \ No newline at end of file diff --git a/common/scripts/install-run-rush.js b/common/scripts/install-run-rush.js new file mode 100644 index 0000000000..ef1d697f9c --- /dev/null +++ b/common/scripts/install-run-rush.js @@ -0,0 +1,218 @@ +// THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED. +// +// This script is intended for usage in an automated build environment where the Rush command may not have +// been preinstalled, or may have an unpredictable version. This script will automatically install the version of Rush +// specified in the rush.json configuration file (if not already installed), and then pass a command-line to it. +// An example usage would be: +// +// node common/scripts/install-run-rush.js install +// +// For more information, see: https://rushjs.io/pages/maintainer/setup_new_repo/ +// +// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. +// See the @microsoft/rush package's LICENSE file for details. + +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ 16928: +/*!***********************!*\ + !*** external "path" ***! + \***********************/ +/***/ ((module) => { + +module.exports = require("path"); + +/***/ }), + +/***/ 179896: +/*!*********************!*\ + !*** external "fs" ***! + \*********************/ +/***/ ((module) => { + +module.exports = require("fs"); + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat get default export */ +/******/ (() => { +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = (module) => { +/******/ var getter = module && module.__esModule ? +/******/ () => (module['default']) : +/******/ () => (module); +/******/ __webpack_require__.d(getter, { a: getter }); +/******/ return getter; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk. +(() => { +/*!************************************************!*\ + !*** ./lib-esnext/scripts/install-run-rush.js ***! + \************************************************/ +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! path */ 16928); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! fs */ 179896); +/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_1__); +// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. +// See LICENSE in the project root for license information. +/* eslint-disable no-console */ + + +const { installAndRun, findRushJsonFolder, RUSH_JSON_FILENAME, runWithErrorAndStatusCode } = require('./install-run'); +const PACKAGE_NAME = '@microsoft/rush'; +const RUSH_PREVIEW_VERSION = 'RUSH_PREVIEW_VERSION'; +const INSTALL_RUN_RUSH_LOCKFILE_PATH_VARIABLE = 'INSTALL_RUN_RUSH_LOCKFILE_PATH'; +function _getRushVersion(logger) { + const rushPreviewVersion = process.env[RUSH_PREVIEW_VERSION]; + if (rushPreviewVersion !== undefined) { + logger.info(`Using Rush version from environment variable ${RUSH_PREVIEW_VERSION}=${rushPreviewVersion}`); + return rushPreviewVersion; + } + const rushJsonFolder = findRushJsonFolder(); + const rushJsonPath = path__WEBPACK_IMPORTED_MODULE_0__.join(rushJsonFolder, RUSH_JSON_FILENAME); + try { + const rushJsonContents = fs__WEBPACK_IMPORTED_MODULE_1__.readFileSync(rushJsonPath, 'utf-8'); + // Use a regular expression to parse out the rushVersion value because rush.json supports comments, + // but JSON.parse does not and we don't want to pull in more dependencies than we need to in this script. + const rushJsonMatches = rushJsonContents.match(/\"rushVersion\"\s*\:\s*\"([0-9a-zA-Z.+\-]+)\"/); + return rushJsonMatches[1]; + } + catch (e) { + throw new Error(`Unable to determine the required version of Rush from ${RUSH_JSON_FILENAME} (${rushJsonFolder}). ` + + `The 'rushVersion' field is either not assigned in ${RUSH_JSON_FILENAME} or was specified ` + + 'using an unexpected syntax.'); + } +} +function _getBin(scriptName) { + switch (scriptName.toLowerCase()) { + case 'install-run-rush-pnpm.js': + return 'rush-pnpm'; + case 'install-run-rushx.js': + return 'rushx'; + default: + return 'rush'; + } +} +function _run() { + const [nodePath /* Ex: /bin/node */, scriptPath /* /repo/common/scripts/install-run-rush.js */, ...packageBinArgs /* [build, --to, myproject] */] = process.argv; + // Detect if this script was directly invoked, or if the install-run-rushx script was invokved to select the + // appropriate binary inside the rush package to run + const scriptName = path__WEBPACK_IMPORTED_MODULE_0__.basename(scriptPath); + const bin = _getBin(scriptName); + if (!nodePath || !scriptPath) { + throw new Error('Unexpected exception: could not detect node path or script path'); + } + let commandFound = false; + let logger = { info: console.log, error: console.error }; + for (const arg of packageBinArgs) { + if (arg === '-q' || arg === '--quiet') { + // The -q/--quiet flag is supported by both `rush` and `rushx`, and will suppress + // any normal informational/diagnostic information printed during startup. + // + // To maintain the same user experience, the install-run* scripts pass along this + // flag but also use it to suppress any diagnostic information normally printed + // to stdout. + logger = { + info: () => { }, + error: console.error + }; + } + else if (!arg.startsWith('-') || arg === '-h' || arg === '--help') { + // We either found something that looks like a command (i.e. - doesn't start with a "-"), + // or we found the -h/--help flag, which can be run without a command + commandFound = true; + } + } + if (!commandFound) { + console.log(`Usage: ${scriptName} [args...]`); + if (scriptName === 'install-run-rush-pnpm.js') { + console.log(`Example: ${scriptName} pnpm-command`); + } + else if (scriptName === 'install-run-rush.js') { + console.log(`Example: ${scriptName} build --to myproject`); + } + else { + console.log(`Example: ${scriptName} custom-command`); + } + process.exit(1); + } + runWithErrorAndStatusCode(logger, () => { + const version = _getRushVersion(logger); + logger.info(`The ${RUSH_JSON_FILENAME} configuration requests Rush version ${version}`); + const lockFilePath = process.env[INSTALL_RUN_RUSH_LOCKFILE_PATH_VARIABLE]; + if (lockFilePath) { + logger.info(`Found ${INSTALL_RUN_RUSH_LOCKFILE_PATH_VARIABLE}="${lockFilePath}", installing with lockfile.`); + } + return installAndRun(logger, PACKAGE_NAME, version, bin, packageBinArgs, lockFilePath); + }); +} +_run(); +//# sourceMappingURL=install-run-rush.js.map +})(); + +module.exports = __webpack_exports__; +/******/ })() +; +//# sourceMappingURL=install-run-rush.js.map \ No newline at end of file diff --git a/common/scripts/install-run-rushx.js b/common/scripts/install-run-rushx.js new file mode 100644 index 0000000000..6581521f3c --- /dev/null +++ b/common/scripts/install-run-rushx.js @@ -0,0 +1,31 @@ +// THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED. +// +// This script is intended for usage in an automated build environment where the Rush command may not have +// been preinstalled, or may have an unpredictable version. This script will automatically install the version of Rush +// specified in the rush.json configuration file (if not already installed), and then pass a command-line to the +// rushx command. +// +// An example usage would be: +// +// node common/scripts/install-run-rushx.js custom-command +// +// For more information, see: https://rushjs.io/pages/maintainer/setup_new_repo/ +// +// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. +// See the @microsoft/rush package's LICENSE file for details. + +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +var __webpack_exports__ = {}; +/*!*************************************************!*\ + !*** ./lib-esnext/scripts/install-run-rushx.js ***! + \*************************************************/ + +// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. +// See LICENSE in the project root for license information. +require('./install-run-rush'); +//# sourceMappingURL=install-run-rushx.js.map +module.exports = __webpack_exports__; +/******/ })() +; +//# sourceMappingURL=install-run-rushx.js.map \ No newline at end of file diff --git a/common/scripts/install-run.js b/common/scripts/install-run.js new file mode 100644 index 0000000000..a35726bf16 --- /dev/null +++ b/common/scripts/install-run.js @@ -0,0 +1,778 @@ +// THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED. +// +// This script is intended for usage in an automated build environment where a Node tool may not have +// been preinstalled, or may have an unpredictable version. This script will automatically install the specified +// version of the specified tool (if not already installed), and then pass a command-line to it. +// An example usage would be: +// +// node common/scripts/install-run.js qrcode@1.2.2 qrcode https://rushjs.io +// +// For more information, see: https://rushjs.io/pages/maintainer/setup_new_repo/ +// +// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. +// See the @microsoft/rush package's LICENSE file for details. + +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ 16928: +/*!***********************!*\ + !*** external "path" ***! + \***********************/ +/***/ ((module) => { + +module.exports = require("path"); + +/***/ }), + +/***/ 179896: +/*!*********************!*\ + !*** external "fs" ***! + \*********************/ +/***/ ((module) => { + +module.exports = require("fs"); + +/***/ }), + +/***/ 370857: +/*!*********************!*\ + !*** external "os" ***! + \*********************/ +/***/ ((module) => { + +module.exports = require("os"); + +/***/ }), + +/***/ 535317: +/*!********************************!*\ + !*** external "child_process" ***! + \********************************/ +/***/ ((module) => { + +module.exports = require("child_process"); + +/***/ }), + +/***/ 832286: +/*!************************************************!*\ + !*** ./lib-esnext/utilities/npmrcUtilities.js ***! + \************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ isVariableSetInNpmrcFile: () => (/* binding */ isVariableSetInNpmrcFile), +/* harmony export */ syncNpmrc: () => (/* binding */ syncNpmrc), +/* harmony export */ trimNpmrcFileLines: () => (/* binding */ trimNpmrcFileLines) +/* harmony export */ }); +/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! fs */ 179896); +/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! path */ 16928); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_1__); +// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. +// See LICENSE in the project root for license information. +// IMPORTANT - do not use any non-built-in libraries in this file + + +/** + * This function reads the content for given .npmrc file path, and also trims + * unusable lines from the .npmrc file. + * + * @returns + * The text of the the .npmrc. + */ +// create a global _combinedNpmrc for cache purpose +const _combinedNpmrcMap = new Map(); +function _trimNpmrcFile(options) { + const { sourceNpmrcPath, linesToPrepend, linesToAppend, supportEnvVarFallbackSyntax } = options; + const combinedNpmrcFromCache = _combinedNpmrcMap.get(sourceNpmrcPath); + if (combinedNpmrcFromCache !== undefined) { + return combinedNpmrcFromCache; + } + let npmrcFileLines = []; + if (linesToPrepend) { + npmrcFileLines.push(...linesToPrepend); + } + if (fs__WEBPACK_IMPORTED_MODULE_0__.existsSync(sourceNpmrcPath)) { + npmrcFileLines.push(...fs__WEBPACK_IMPORTED_MODULE_0__.readFileSync(sourceNpmrcPath).toString().split('\n')); + } + if (linesToAppend) { + npmrcFileLines.push(...linesToAppend); + } + npmrcFileLines = npmrcFileLines.map((line) => (line || '').trim()); + const resultLines = trimNpmrcFileLines(npmrcFileLines, process.env, supportEnvVarFallbackSyntax); + const combinedNpmrc = resultLines.join('\n'); + //save the cache + _combinedNpmrcMap.set(sourceNpmrcPath, combinedNpmrc); + return combinedNpmrc; +} +/** + * + * @param npmrcFileLines The npmrc file's lines + * @param env The environment variables object + * @param supportEnvVarFallbackSyntax Whether to support fallback values in the form of `${VAR_NAME:-fallback}` + * @returns + */ +function trimNpmrcFileLines(npmrcFileLines, env, supportEnvVarFallbackSyntax) { + var _a; + const resultLines = []; + // This finds environment variable tokens that look like "${VAR_NAME}" + const expansionRegExp = /\$\{([^\}]+)\}/g; + // Comment lines start with "#" or ";" + const commentRegExp = /^\s*[#;]/; + // Trim out lines that reference environment variables that aren't defined + for (let line of npmrcFileLines) { + let lineShouldBeTrimmed = false; + //remove spaces before or after key and value + line = line + .split('=') + .map((lineToTrim) => lineToTrim.trim()) + .join('='); + // Ignore comment lines + if (!commentRegExp.test(line)) { + const environmentVariables = line.match(expansionRegExp); + if (environmentVariables) { + for (const token of environmentVariables) { + /** + * Remove the leading "${" and the trailing "}" from the token + * + * ${nameString} -> nameString + * ${nameString-fallbackString} -> name-fallbackString + * ${nameString:-fallbackString} -> name:-fallbackString + */ + const nameWithFallback = token.substring(2, token.length - 1); + let environmentVariableName; + let fallback; + if (supportEnvVarFallbackSyntax) { + /** + * Get the environment variable name and fallback value. + * + * name fallback + * nameString -> nameString undefined + * nameString-fallbackString -> nameString fallbackString + * nameString:-fallbackString -> nameString fallbackString + */ + const matched = nameWithFallback.match(/^([^:-]+)(?:\:?-(.+))?$/); + // matched: [originStr, variableName, fallback] + environmentVariableName = (_a = matched === null || matched === void 0 ? void 0 : matched[1]) !== null && _a !== void 0 ? _a : nameWithFallback; + fallback = matched === null || matched === void 0 ? void 0 : matched[2]; + } + else { + environmentVariableName = nameWithFallback; + } + // Is the environment variable and fallback value defined. + if (!env[environmentVariableName] && !fallback) { + // No, so trim this line + lineShouldBeTrimmed = true; + break; + } + } + } + } + if (lineShouldBeTrimmed) { + // Example output: + // "; MISSING ENVIRONMENT VARIABLE: //my-registry.com/npm/:_authToken=${MY_AUTH_TOKEN}" + resultLines.push('; MISSING ENVIRONMENT VARIABLE: ' + line); + } + else { + resultLines.push(line); + } + } + return resultLines; +} +function _copyAndTrimNpmrcFile(options) { + const { logger, sourceNpmrcPath, targetNpmrcPath } = options; + logger.info(`Transforming ${sourceNpmrcPath}`); // Verbose + logger.info(` --> "${targetNpmrcPath}"`); + const combinedNpmrc = _trimNpmrcFile(options); + fs__WEBPACK_IMPORTED_MODULE_0__.writeFileSync(targetNpmrcPath, combinedNpmrc); + return combinedNpmrc; +} +function syncNpmrc(options) { + const { sourceNpmrcFolder, targetNpmrcFolder, useNpmrcPublish, logger = { + // eslint-disable-next-line no-console + info: console.log, + // eslint-disable-next-line no-console + error: console.error + }, createIfMissing = false } = options; + const sourceNpmrcPath = path__WEBPACK_IMPORTED_MODULE_1__.join(sourceNpmrcFolder, !useNpmrcPublish ? '.npmrc' : '.npmrc-publish'); + const targetNpmrcPath = path__WEBPACK_IMPORTED_MODULE_1__.join(targetNpmrcFolder, '.npmrc'); + try { + if (fs__WEBPACK_IMPORTED_MODULE_0__.existsSync(sourceNpmrcPath) || createIfMissing) { + // Ensure the target folder exists + if (!fs__WEBPACK_IMPORTED_MODULE_0__.existsSync(targetNpmrcFolder)) { + fs__WEBPACK_IMPORTED_MODULE_0__.mkdirSync(targetNpmrcFolder, { recursive: true }); + } + return _copyAndTrimNpmrcFile({ + sourceNpmrcPath, + targetNpmrcPath, + logger, + ...options + }); + } + else if (fs__WEBPACK_IMPORTED_MODULE_0__.existsSync(targetNpmrcPath)) { + // If the source .npmrc doesn't exist and there is one in the target, delete the one in the target + logger.info(`Deleting ${targetNpmrcPath}`); // Verbose + fs__WEBPACK_IMPORTED_MODULE_0__.unlinkSync(targetNpmrcPath); + } + } + catch (e) { + throw new Error(`Error syncing .npmrc file: ${e}`); + } +} +function isVariableSetInNpmrcFile(sourceNpmrcFolder, variableKey, supportEnvVarFallbackSyntax) { + const sourceNpmrcPath = `${sourceNpmrcFolder}/.npmrc`; + //if .npmrc file does not exist, return false directly + if (!fs__WEBPACK_IMPORTED_MODULE_0__.existsSync(sourceNpmrcPath)) { + return false; + } + const trimmedNpmrcFile = _trimNpmrcFile({ sourceNpmrcPath, supportEnvVarFallbackSyntax }); + const variableKeyRegExp = new RegExp(`^${variableKey}=`, 'm'); + return trimmedNpmrcFile.match(variableKeyRegExp) !== null; +} +//# sourceMappingURL=npmrcUtilities.js.map + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat get default export */ +/******/ (() => { +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = (module) => { +/******/ var getter = module && module.__esModule ? +/******/ () => (module['default']) : +/******/ () => (module); +/******/ __webpack_require__.d(getter, { a: getter }); +/******/ return getter; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk. +(() => { +/*!*******************************************!*\ + !*** ./lib-esnext/scripts/install-run.js ***! + \*******************************************/ +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ RUSH_JSON_FILENAME: () => (/* binding */ RUSH_JSON_FILENAME), +/* harmony export */ findRushJsonFolder: () => (/* binding */ findRushJsonFolder), +/* harmony export */ getNpmPath: () => (/* binding */ getNpmPath), +/* harmony export */ installAndRun: () => (/* binding */ installAndRun), +/* harmony export */ runWithErrorAndStatusCode: () => (/* binding */ runWithErrorAndStatusCode) +/* harmony export */ }); +/* harmony import */ var child_process__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! child_process */ 535317); +/* harmony import */ var child_process__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(child_process__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! fs */ 179896); +/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var os__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! os */ 370857); +/* harmony import */ var os__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(os__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! path */ 16928); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _utilities_npmrcUtilities__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utilities/npmrcUtilities */ 832286); +// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. +// See LICENSE in the project root for license information. +/* eslint-disable no-console */ + + + + + +const RUSH_JSON_FILENAME = 'rush.json'; +const RUSH_TEMP_FOLDER_ENV_VARIABLE_NAME = 'RUSH_TEMP_FOLDER'; +const INSTALL_RUN_LOCKFILE_PATH_VARIABLE = 'INSTALL_RUN_LOCKFILE_PATH'; +const INSTALLED_FLAG_FILENAME = 'installed.flag'; +const NODE_MODULES_FOLDER_NAME = 'node_modules'; +const PACKAGE_JSON_FILENAME = 'package.json'; +/** + * Parse a package specifier (in the form of name\@version) into name and version parts. + */ +function _parsePackageSpecifier(rawPackageSpecifier) { + rawPackageSpecifier = (rawPackageSpecifier || '').trim(); + const separatorIndex = rawPackageSpecifier.lastIndexOf('@'); + let name; + let version = undefined; + if (separatorIndex === 0) { + // The specifier starts with a scope and doesn't have a version specified + name = rawPackageSpecifier; + } + else if (separatorIndex === -1) { + // The specifier doesn't have a version + name = rawPackageSpecifier; + } + else { + name = rawPackageSpecifier.substring(0, separatorIndex); + version = rawPackageSpecifier.substring(separatorIndex + 1); + } + if (!name) { + throw new Error(`Invalid package specifier: ${rawPackageSpecifier}`); + } + return { name, version }; +} +let _npmPath = undefined; +/** + * Get the absolute path to the npm executable + */ +function getNpmPath() { + if (!_npmPath) { + try { + if (_isWindows()) { + // We're on Windows + const whereOutput = child_process__WEBPACK_IMPORTED_MODULE_0__.execSync('where npm', { stdio: [] }).toString(); + const lines = whereOutput.split(os__WEBPACK_IMPORTED_MODULE_2__.EOL).filter((line) => !!line); + // take the last result, we are looking for a .cmd command + // see https://github.com/microsoft/rushstack/issues/759 + _npmPath = lines[lines.length - 1]; + } + else { + // We aren't on Windows - assume we're on *NIX or Darwin + _npmPath = child_process__WEBPACK_IMPORTED_MODULE_0__.execSync('command -v npm', { stdio: [] }).toString(); + } + } + catch (e) { + throw new Error(`Unable to determine the path to the NPM tool: ${e}`); + } + _npmPath = _npmPath.trim(); + if (!fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(_npmPath)) { + throw new Error('The NPM executable does not exist'); + } + } + return _npmPath; +} +function _ensureFolder(folderPath) { + if (!fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(folderPath)) { + const parentDir = path__WEBPACK_IMPORTED_MODULE_3__.dirname(folderPath); + _ensureFolder(parentDir); + fs__WEBPACK_IMPORTED_MODULE_1__.mkdirSync(folderPath); + } +} +/** + * Create missing directories under the specified base directory, and return the resolved directory. + * + * Does not support "." or ".." path segments. + * Assumes the baseFolder exists. + */ +function _ensureAndJoinPath(baseFolder, ...pathSegments) { + let joinedPath = baseFolder; + try { + for (let pathSegment of pathSegments) { + pathSegment = pathSegment.replace(/[\\\/]/g, '+'); + joinedPath = path__WEBPACK_IMPORTED_MODULE_3__.join(joinedPath, pathSegment); + if (!fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(joinedPath)) { + fs__WEBPACK_IMPORTED_MODULE_1__.mkdirSync(joinedPath); + } + } + } + catch (e) { + throw new Error(`Error building local installation folder (${path__WEBPACK_IMPORTED_MODULE_3__.join(baseFolder, ...pathSegments)}): ${e}`); + } + return joinedPath; +} +function _getRushTempFolder(rushCommonFolder) { + const rushTempFolder = process.env[RUSH_TEMP_FOLDER_ENV_VARIABLE_NAME]; + if (rushTempFolder !== undefined) { + _ensureFolder(rushTempFolder); + return rushTempFolder; + } + else { + return _ensureAndJoinPath(rushCommonFolder, 'temp'); + } +} +/** + * Compare version strings according to semantic versioning. + * Returns a positive integer if "a" is a later version than "b", + * a negative integer if "b" is later than "a", + * and 0 otherwise. + */ +function _compareVersionStrings(a, b) { + const aParts = a.split(/[.-]/); + const bParts = b.split(/[.-]/); + const numberOfParts = Math.max(aParts.length, bParts.length); + for (let i = 0; i < numberOfParts; i++) { + if (aParts[i] !== bParts[i]) { + return (Number(aParts[i]) || 0) - (Number(bParts[i]) || 0); + } + } + return 0; +} +/** + * Resolve a package specifier to a static version + */ +function _resolvePackageVersion(logger, rushCommonFolder, { name, version }) { + if (!version) { + version = '*'; // If no version is specified, use the latest version + } + if (version.match(/^[a-zA-Z0-9\-\+\.]+$/)) { + // If the version contains only characters that we recognize to be used in static version specifiers, + // pass the version through + return version; + } + else { + // version resolves to + try { + const rushTempFolder = _getRushTempFolder(rushCommonFolder); + const sourceNpmrcFolder = path__WEBPACK_IMPORTED_MODULE_3__.join(rushCommonFolder, 'config', 'rush'); + (0,_utilities_npmrcUtilities__WEBPACK_IMPORTED_MODULE_4__.syncNpmrc)({ + sourceNpmrcFolder, + targetNpmrcFolder: rushTempFolder, + logger, + supportEnvVarFallbackSyntax: false + }); + const npmPath = getNpmPath(); + // This returns something that looks like: + // ``` + // [ + // "3.0.0", + // "3.0.1", + // ... + // "3.0.20" + // ] + // ``` + // + // if multiple versions match the selector, or + // + // ``` + // "3.0.0" + // ``` + // + // if only a single version matches. + const spawnSyncOptions = { + cwd: rushTempFolder, + stdio: [], + shell: _isWindows() + }; + const platformNpmPath = _getPlatformPath(npmPath); + const npmVersionSpawnResult = child_process__WEBPACK_IMPORTED_MODULE_0__.spawnSync(platformNpmPath, ['view', `${name}@${version}`, 'version', '--no-update-notifier', '--json'], spawnSyncOptions); + if (npmVersionSpawnResult.status !== 0) { + throw new Error(`"npm view" returned error code ${npmVersionSpawnResult.status}`); + } + const npmViewVersionOutput = npmVersionSpawnResult.stdout.toString(); + const parsedVersionOutput = JSON.parse(npmViewVersionOutput); + const versions = Array.isArray(parsedVersionOutput) + ? parsedVersionOutput + : [parsedVersionOutput]; + let latestVersion = versions[0]; + for (let i = 1; i < versions.length; i++) { + const latestVersionCandidate = versions[i]; + if (_compareVersionStrings(latestVersionCandidate, latestVersion) > 0) { + latestVersion = latestVersionCandidate; + } + } + if (!latestVersion) { + throw new Error('No versions found for the specified version range.'); + } + return latestVersion; + } + catch (e) { + throw new Error(`Unable to resolve version ${version} of package ${name}: ${e}`); + } + } +} +let _rushJsonFolder; +/** + * Find the absolute path to the folder containing rush.json + */ +function findRushJsonFolder() { + if (!_rushJsonFolder) { + let basePath = __dirname; + let tempPath = __dirname; + do { + const testRushJsonPath = path__WEBPACK_IMPORTED_MODULE_3__.join(basePath, RUSH_JSON_FILENAME); + if (fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(testRushJsonPath)) { + _rushJsonFolder = basePath; + break; + } + else { + basePath = tempPath; + } + } while (basePath !== (tempPath = path__WEBPACK_IMPORTED_MODULE_3__.dirname(basePath))); // Exit the loop when we hit the disk root + if (!_rushJsonFolder) { + throw new Error(`Unable to find ${RUSH_JSON_FILENAME}.`); + } + } + return _rushJsonFolder; +} +/** + * Detects if the package in the specified directory is installed + */ +function _isPackageAlreadyInstalled(packageInstallFolder) { + try { + const flagFilePath = path__WEBPACK_IMPORTED_MODULE_3__.join(packageInstallFolder, INSTALLED_FLAG_FILENAME); + if (!fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(flagFilePath)) { + return false; + } + const fileContents = fs__WEBPACK_IMPORTED_MODULE_1__.readFileSync(flagFilePath).toString(); + return fileContents.trim() === process.version; + } + catch (e) { + return false; + } +} +/** + * Delete a file. Fail silently if it does not exist. + */ +function _deleteFile(file) { + try { + fs__WEBPACK_IMPORTED_MODULE_1__.unlinkSync(file); + } + catch (err) { + if (err.code !== 'ENOENT' && err.code !== 'ENOTDIR') { + throw err; + } + } +} +/** + * Removes the following files and directories under the specified folder path: + * - installed.flag + * - + * - node_modules + */ +function _cleanInstallFolder(rushTempFolder, packageInstallFolder, lockFilePath) { + try { + const flagFile = path__WEBPACK_IMPORTED_MODULE_3__.resolve(packageInstallFolder, INSTALLED_FLAG_FILENAME); + _deleteFile(flagFile); + const packageLockFile = path__WEBPACK_IMPORTED_MODULE_3__.resolve(packageInstallFolder, 'package-lock.json'); + if (lockFilePath) { + fs__WEBPACK_IMPORTED_MODULE_1__.copyFileSync(lockFilePath, packageLockFile); + } + else { + // Not running `npm ci`, so need to cleanup + _deleteFile(packageLockFile); + const nodeModulesFolder = path__WEBPACK_IMPORTED_MODULE_3__.resolve(packageInstallFolder, NODE_MODULES_FOLDER_NAME); + if (fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(nodeModulesFolder)) { + const rushRecyclerFolder = _ensureAndJoinPath(rushTempFolder, 'rush-recycler'); + fs__WEBPACK_IMPORTED_MODULE_1__.renameSync(nodeModulesFolder, path__WEBPACK_IMPORTED_MODULE_3__.join(rushRecyclerFolder, `install-run-${Date.now().toString()}`)); + } + } + } + catch (e) { + throw new Error(`Error cleaning the package install folder (${packageInstallFolder}): ${e}`); + } +} +function _createPackageJson(packageInstallFolder, name, version) { + try { + const packageJsonContents = { + name: 'ci-rush', + version: '0.0.0', + dependencies: { + [name]: version + }, + description: "DON'T WARN", + repository: "DON'T WARN", + license: 'MIT' + }; + const packageJsonPath = path__WEBPACK_IMPORTED_MODULE_3__.join(packageInstallFolder, PACKAGE_JSON_FILENAME); + fs__WEBPACK_IMPORTED_MODULE_1__.writeFileSync(packageJsonPath, JSON.stringify(packageJsonContents, undefined, 2)); + } + catch (e) { + throw new Error(`Unable to create package.json: ${e}`); + } +} +/** + * Run "npm install" in the package install folder. + */ +function _installPackage(logger, packageInstallFolder, name, version, command) { + try { + logger.info(`Installing ${name}...`); + const npmPath = getNpmPath(); + const platformNpmPath = _getPlatformPath(npmPath); + const result = child_process__WEBPACK_IMPORTED_MODULE_0__.spawnSync(platformNpmPath, [command], { + stdio: 'inherit', + cwd: packageInstallFolder, + env: process.env, + shell: _isWindows() + }); + if (result.status !== 0) { + throw new Error(`"npm ${command}" encountered an error`); + } + logger.info(`Successfully installed ${name}@${version}`); + } + catch (e) { + throw new Error(`Unable to install package: ${e}`); + } +} +/** + * Get the ".bin" path for the package. + */ +function _getBinPath(packageInstallFolder, binName) { + const binFolderPath = path__WEBPACK_IMPORTED_MODULE_3__.resolve(packageInstallFolder, NODE_MODULES_FOLDER_NAME, '.bin'); + const resolvedBinName = _isWindows() ? `${binName}.cmd` : binName; + return path__WEBPACK_IMPORTED_MODULE_3__.resolve(binFolderPath, resolvedBinName); +} +/** + * Returns a cross-platform path - windows must enclose any path containing spaces within double quotes. + */ +function _getPlatformPath(platformPath) { + return _isWindows() && platformPath.includes(' ') ? `"${platformPath}"` : platformPath; +} +function _isWindows() { + return os__WEBPACK_IMPORTED_MODULE_2__.platform() === 'win32'; +} +/** + * Write a flag file to the package's install directory, signifying that the install was successful. + */ +function _writeFlagFile(packageInstallFolder) { + try { + const flagFilePath = path__WEBPACK_IMPORTED_MODULE_3__.join(packageInstallFolder, INSTALLED_FLAG_FILENAME); + fs__WEBPACK_IMPORTED_MODULE_1__.writeFileSync(flagFilePath, process.version); + } + catch (e) { + throw new Error(`Unable to create installed.flag file in ${packageInstallFolder}`); + } +} +function installAndRun(logger, packageName, packageVersion, packageBinName, packageBinArgs, lockFilePath = process.env[INSTALL_RUN_LOCKFILE_PATH_VARIABLE]) { + const rushJsonFolder = findRushJsonFolder(); + const rushCommonFolder = path__WEBPACK_IMPORTED_MODULE_3__.join(rushJsonFolder, 'common'); + const rushTempFolder = _getRushTempFolder(rushCommonFolder); + const packageInstallFolder = _ensureAndJoinPath(rushTempFolder, 'install-run', `${packageName}@${packageVersion}`); + if (!_isPackageAlreadyInstalled(packageInstallFolder)) { + // The package isn't already installed + _cleanInstallFolder(rushTempFolder, packageInstallFolder, lockFilePath); + const sourceNpmrcFolder = path__WEBPACK_IMPORTED_MODULE_3__.join(rushCommonFolder, 'config', 'rush'); + (0,_utilities_npmrcUtilities__WEBPACK_IMPORTED_MODULE_4__.syncNpmrc)({ + sourceNpmrcFolder, + targetNpmrcFolder: packageInstallFolder, + logger, + supportEnvVarFallbackSyntax: false + }); + _createPackageJson(packageInstallFolder, packageName, packageVersion); + const command = lockFilePath ? 'ci' : 'install'; + _installPackage(logger, packageInstallFolder, packageName, packageVersion, command); + _writeFlagFile(packageInstallFolder); + } + const statusMessage = `Invoking "${packageBinName} ${packageBinArgs.join(' ')}"`; + const statusMessageLine = new Array(statusMessage.length + 1).join('-'); + logger.info('\n' + statusMessage + '\n' + statusMessageLine + '\n'); + const binPath = _getBinPath(packageInstallFolder, packageBinName); + const binFolderPath = path__WEBPACK_IMPORTED_MODULE_3__.resolve(packageInstallFolder, NODE_MODULES_FOLDER_NAME, '.bin'); + // Windows environment variables are case-insensitive. Instead of using SpawnSyncOptions.env, we need to + // assign via the process.env proxy to ensure that we append to the right PATH key. + const originalEnvPath = process.env.PATH || ''; + let result; + try { + // `npm` bin stubs on Windows are `.cmd` files + // Node.js will not directly invoke a `.cmd` file unless `shell` is set to `true` + const platformBinPath = _getPlatformPath(binPath); + process.env.PATH = [binFolderPath, originalEnvPath].join(path__WEBPACK_IMPORTED_MODULE_3__.delimiter); + result = child_process__WEBPACK_IMPORTED_MODULE_0__.spawnSync(platformBinPath, packageBinArgs, { + stdio: 'inherit', + windowsVerbatimArguments: false, + shell: _isWindows(), + cwd: process.cwd(), + env: process.env + }); + } + finally { + process.env.PATH = originalEnvPath; + } + if (result.status !== null) { + return result.status; + } + else { + throw result.error || new Error('An unknown error occurred.'); + } +} +function runWithErrorAndStatusCode(logger, fn) { + process.exitCode = 1; + try { + const exitCode = fn(); + process.exitCode = exitCode; + } + catch (e) { + logger.error('\n\n' + e.toString() + '\n\n'); + } +} +function _run() { + const [nodePath /* Ex: /bin/node */, scriptPath /* /repo/common/scripts/install-run-rush.js */, rawPackageSpecifier /* qrcode@^1.2.0 */, packageBinName /* qrcode */, ...packageBinArgs /* [-f, myproject/lib] */] = process.argv; + if (!nodePath) { + throw new Error('Unexpected exception: could not detect node path'); + } + if (path__WEBPACK_IMPORTED_MODULE_3__.basename(scriptPath).toLowerCase() !== 'install-run.js') { + // If install-run.js wasn't directly invoked, don't execute the rest of this function. Return control + // to the script that (presumably) imported this file + return; + } + if (process.argv.length < 4) { + console.log('Usage: install-run.js @ [args...]'); + console.log('Example: install-run.js qrcode@1.2.2 qrcode https://rushjs.io'); + process.exit(1); + } + const logger = { info: console.log, error: console.error }; + runWithErrorAndStatusCode(logger, () => { + const rushJsonFolder = findRushJsonFolder(); + const rushCommonFolder = _ensureAndJoinPath(rushJsonFolder, 'common'); + const packageSpecifier = _parsePackageSpecifier(rawPackageSpecifier); + const name = packageSpecifier.name; + const version = _resolvePackageVersion(logger, rushCommonFolder, packageSpecifier); + if (packageSpecifier.version !== version) { + console.log(`Resolved to ${name}@${version}`); + } + return installAndRun(logger, name, version, packageBinName, packageBinArgs); + }); +} +_run(); +//# sourceMappingURL=install-run.js.map +})(); + +module.exports = __webpack_exports__; +/******/ })() +; +//# sourceMappingURL=install-run.js.map \ No newline at end of file diff --git a/packages/measurements-otlp/.eslintrc.js b/packages/measurements-otlp/.eslintrc.js new file mode 100644 index 0000000000..72235dc283 --- /dev/null +++ b/packages/measurements-otlp/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: ['./node_modules/@hcengineering/platform-rig/profiles/default/eslint.config.json'], + parserOptions: { + tsconfigRootDir: __dirname, + project: './tsconfig.json' + } +} diff --git a/packages/measurements-otlp/.npmignore b/packages/measurements-otlp/.npmignore new file mode 100644 index 0000000000..e3ec093c38 --- /dev/null +++ b/packages/measurements-otlp/.npmignore @@ -0,0 +1,4 @@ +* +!/lib/** +!CHANGELOG.md +/lib/**/__tests__/ diff --git a/packages/measurements-otlp/config/rig.json b/packages/measurements-otlp/config/rig.json new file mode 100644 index 0000000000..0110930f55 --- /dev/null +++ b/packages/measurements-otlp/config/rig.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/rig-package/rig.schema.json", + "rigPackageName": "@hcengineering/platform-rig" +} diff --git a/packages/measurements-otlp/jest.config.js b/packages/measurements-otlp/jest.config.js new file mode 100644 index 0000000000..2cfd408b67 --- /dev/null +++ b/packages/measurements-otlp/jest.config.js @@ -0,0 +1,7 @@ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', + testMatch: ['**/?(*.)+(spec|test).[jt]s?(x)'], + roots: ["./src"], + coverageReporters: ["text-summary", "html"] +} diff --git a/packages/measurements-otlp/package.json b/packages/measurements-otlp/package.json new file mode 100644 index 0000000000..c692c85def --- /dev/null +++ b/packages/measurements-otlp/package.json @@ -0,0 +1,61 @@ +{ + "name": "@hcengineering/measurements-otlp", + "version": "0.7.0", + "main": "lib/index.js", + "svelte": "src/index.ts", + "types": "types/index.d.ts", + "files": [ + "lib/**/*", + "types/**/*", + "tsconfig.json" + ], + "author": "Anticrm Platform Contributors", + "license": "EPL-2.0", + "scripts": { + "build": "compile", + "build:watch": "compile", + "test": "jest --passWithNoTests --silent", + "format": "format src", + "_phase:build": "compile transpile src", + "_phase:test": "jest --passWithNoTests --silent", + "_phase:format": "format src", + "_phase:validate": "compile validate" + }, + "devDependencies": { + "@hcengineering/platform-rig": "workspace:^0.7.0", + "@typescript-eslint/eslint-plugin": "^6.11.0", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-n": "^15.4.0", + "eslint": "^8.54.0", + "simplytyped": "^3.3.0", + "@typescript-eslint/parser": "^6.11.0", + "eslint-config-standard-with-typescript": "^40.0.0", + "prettier": "^3.1.0", + "typescript": "^5.8.3", + "jest": "^29.7.0", + "ts-jest": "^29.1.1", + "@types/jest": "^29.5.5" + }, + "dependencies": { + "@hcengineering/measurements": "workspace:^0.7.0", + "@opentelemetry/sdk-node": "^0.203.0", + "@opentelemetry/sdk-logs": "^0.203.0", + "@opentelemetry/auto-instrumentations-node": "^0.62.0", + "@opentelemetry/resources": "^2.0.1", + "@opentelemetry/sdk-trace-node": "^2.0.1", + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/core": "^2.0.1", + "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", + "@opentelemetry/exporter-logs-otlp-http": "^0.203.0", + "@opentelemetry/otlp-exporter-base": "^0.203.0", + "@opentelemetry/id-generator-aws-xray": "^2.0.0", + "@opentelemetry/exporter-metrics-otlp-http": "^0.203.0", + "@opentelemetry/api-logs": "^0.203.0", + "@opentelemetry/sdk-metrics": "^2.0.1" + }, + "repository": "https://github.com/hcengineering/platform", + "publishConfig": { + "access": "public" + } +} diff --git a/packages/measurements-otlp/src/index.ts b/packages/measurements-otlp/src/index.ts new file mode 100644 index 0000000000..8b5ba81c39 --- /dev/null +++ b/packages/measurements-otlp/src/index.ts @@ -0,0 +1 @@ +export * from './telemetry' diff --git a/packages/measurements-otlp/src/telemetry.ts b/packages/measurements-otlp/src/telemetry.ts new file mode 100644 index 0000000000..ec170c0162 --- /dev/null +++ b/packages/measurements-otlp/src/telemetry.ts @@ -0,0 +1,608 @@ +import { + childMetrics, + consoleLogger, + MeasureContext, + MeasureMetricsContext, + newMetrics, + noParamsLogger, + nullPromise, + platformNow, + platformNowDiff, + updateMeasure, + type FullParamsType, + type MeasureLogger, + type Metrics, + type ParamsType, + type WithOptions +} from '@hcengineering/measurements' +import { + context, + metrics as otelMetrics, + propagation, + Span, + SpanStatusCode, + trace, + type Context, + type Gauge, + type Meter, + type Tracer +} from '@opentelemetry/api' +import { Logger, SeverityNumber } from '@opentelemetry/api-logs' +import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node' +import { suppressTracing } from '@opentelemetry/core' +import { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http' +import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http' +import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http' +import { AWSXRayIdGenerator } from '@opentelemetry/id-generator-aws-xray' +import { CompressionAlgorithm } from '@opentelemetry/otlp-exporter-base' +import { resourceFromAttributes } from '@opentelemetry/resources' +import { BatchLogRecordProcessor, LoggerProvider } from '@opentelemetry/sdk-logs' +import { PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics' +import { NodeSDK } from '@opentelemetry/sdk-node' +import { BatchSpanProcessor } from '@opentelemetry/sdk-trace-node' + +class MetricsContext { + counters = new Map() + constructor (readonly meter?: Meter) {} + + getCounter (name: string): { counter: Gauge, value: number } | undefined { + if (this.meter === undefined) { + return undefined + } + let counter = this.counters.get(name) + if (counter === undefined) { + counter = { counter: this.meter.createGauge(name), value: 0 } + this.counters.set(name, counter) + } + return counter + } +} + +/** + * @public + */ +export class OpenTelemetryMetricsContext implements MeasureContext { + private readonly name: string + private readonly params: ParamsType + + private readonly fullParams: FullParamsType | (() => FullParamsType) = {} + logger: MeasureLogger + metrics: Metrics + id?: string + + st = platformNow() + contextData: object = {} + isDone = false + doneTrace: string = '' + + private done (value?: number, override?: boolean): void { + if (!this.isDone) { + this.doneTrace = new Error().stack ?? '' + this.isDone = true + updateMeasure(this.metrics, this.st, this.params, this.fullParams, (spend) => {}, value, override) + this.span?.end() + } + } + + constructor ( + name: string, + readonly tracer: Tracer, + readonly context: Context | undefined, + readonly span: Span | undefined, + params: ParamsType, + fullParams: FullParamsType | (() => FullParamsType) = {}, + metrics: Metrics = newMetrics(), + logger?: MeasureLogger, + readonly parent?: MeasureContext, + readonly logParams?: ParamsType, + + readonly otlpLogger?: Logger, + readonly meter?: MetricsContext + ) { + this.name = name + this.params = params + this.fullParams = fullParams + this.metrics = metrics + this.metrics.namedParams = this.metrics.namedParams ?? {} + for (const [k, v] of Object.entries(params)) { + if (this.metrics.namedParams[k] !== v) { + this.metrics.namedParams[k] = v + } else { + this.metrics.namedParams[k] = '*' + } + } + + this.logger = logger ?? (this.logParams != null ? consoleLogger(this.logParams ?? {}) : noParamsLogger) + } + + measure (name: string, value: number, override?: boolean): void { + const cnt = this.meter?.getCounter(name) + if (cnt !== undefined) { + if (cnt.value !== value) { + cnt.counter.record(value, this.params) + cnt.value = value + } + } + } + + newChild ( + name: string, + params: ParamsType, + opt?: { + fullParams?: FullParamsType + logger?: MeasureLogger + span?: WithOptions['span'] // By default true + meta?: Record + } + ): MeasureContext { + let _span: Span | undefined + let childContext: Context | undefined + if (opt?.span === true || opt?.span === 'inherit') { + childContext = opt?.span === 'inherit' ? context.active() : this.context ?? context.active() + + if (opt.meta !== undefined && Object.keys(opt.meta).length > 0) { + // We need to set meta params + childContext = propagation.extract(childContext ?? context.active(), opt.meta) + } + _span = this.tracer.startSpan(name, undefined, childContext) + + const spanParams = [...Object.entries(params)] + for (const [k, v] of spanParams) { + _span?.setAttribute(k, v as any) + } + } + if (opt?.span === 'disable') { + childContext = suppressTracing(childContext ?? context.active()) + } + if (childContext !== undefined && _span !== undefined) { + childContext = trace.setSpan(childContext, _span) + } + + const result = new OpenTelemetryMetricsContext( + name, + this.tracer, + childContext, + _span, + params, + opt?.fullParams ?? {}, + childMetrics(this.metrics, [name]), + opt?.logger ?? this.logger, + this, + this.logParams, + this.otlpLogger, + this.meter + ) + result.id = this.id + result.contextData = this.contextData + return result + } + + extractMeta (): Record { + const headers: Record = {} + if (this.context !== undefined) { + propagation.inject(this.context, headers) + } + return headers + } + + with( + name: string, + params: ParamsType, + op: (ctx: MeasureContext) => T | Promise, + fullParams?: ParamsType | (() => FullParamsType), + opt?: WithOptions + ): Promise { + const c = this.newChild(name, opt?.inheritParams === true ? { ...this.params, ...params } : params, { + fullParams, + logger: this.logger, + span: opt?.span ?? true, + meta: opt?.meta + }) + let needFinally = true + try { + const _context = (c as OpenTelemetryMetricsContext).context + + const span = (c as OpenTelemetryMetricsContext).span + + const value = _context !== undefined ? context.with(_context, () => op(c)) : op(c) + if (value instanceof Promise) { + needFinally = false + if (span !== undefined) { + void value.catch((err) => { + span?.recordException(err) + span?.setStatus({ + code: SpanStatusCode.ERROR, + message: err.message + }) + }) + } + return value.finally(() => { + if (span !== undefined) { + const fParams = typeof fullParams === 'function' ? fullParams() : fullParams + const spanParams = [...Object.entries(params), ...Object.entries(fParams ?? {})] + for (const [k, v] of spanParams) { + span?.setAttribute(k, typeof v === 'object' ? JSON.stringify(v) : v) + } + } + c.end() + if (opt?.log === true) { + this.logger.logOperation(name, platformNowDiff((c as OpenTelemetryMetricsContext).st), { + ...params, + ...fullParams + }) + } + }) + } else { + if (value == null) { + return nullPromise as Promise + } + return Promise.resolve(value) + } + } finally { + if (needFinally) { + c.end() + } + } + } + + withSync( + name: string, + params: ParamsType, + op: (ctx: MeasureContext) => T, + fullParams?: ParamsType | (() => FullParamsType), + opt?: WithOptions + ): T { + const c = this.newChild(name, params, { fullParams, logger: this.logger, span: opt?.span ?? true }) + const _context = (c as OpenTelemetryMetricsContext).context + try { + return _context !== undefined ? context.with(_context, () => op(c)) : op(c) + } finally { + c.end() + } + } + + error (message: string, args?: Record): void { + if (this.otlpLogger !== undefined) { + this.otlpLogger.emit({ + severityNumber: SeverityNumber.ERROR, + severityText: 'error', + context: this.context, + body: message, + attributes: { + 'service.name': sdkServiceName, + ...(args ?? {}) + } + }) + } + this.logger.error(message, { ...this.params, ...args, ...(this.logParams ?? {}) }) + } + + info (message: string, args?: Record): void { + if (this.otlpLogger !== undefined) { + this.otlpLogger.emit({ + context: this.context, + severityNumber: SeverityNumber.INFO, + severityText: 'info', + body: message, + attributes: { + 'service.name': sdkServiceName, + ...(args ?? {}) + } + }) + } + this.logger.info(message, { ...this.params, ...args, ...(this.logParams ?? {}) }) + } + + warn (message: string, args?: Record): void { + if (this.otlpLogger !== undefined) { + this.otlpLogger.emit({ + severityNumber: SeverityNumber.WARN, + severityText: 'warn', + context: this.context, + body: message, + attributes: { + 'service.name': sdkServiceName, + ...(args ?? {}) + } + }) + } + this.logger.warn(message, { ...this.params, ...args, ...(this.logParams ?? {}) }) + } + + end (): void { + this.done() + } + + getParams (): ParamsType { + return this.params + } +} + +/** + * Parse W3C baggage header format to Record + * + * W3C baggage format: "key1=value1,key2=value2;property=value,key3=value3" + * Returns only the key-value pairs, ignoring properties + */ +function parseBaggage (baggageHeader?: string): Record { + if (baggageHeader == null || typeof baggageHeader !== 'string') { + return {} + } + + const result: Record = {} + + // Split by comma to get individual baggage members + const members = baggageHeader.split(',') + + for (const member of members) { + const trimmedMember = member.trim() + if (trimmedMember === '') continue + + // Split by semicolon to separate key=value from properties + const parts = trimmedMember.split(';') + const keyValuePart = parts[0]?.trim() + + if (keyValuePart == null) continue + + // Split by equals to get key and value + const equalIndex = keyValuePart.indexOf('=') + if (equalIndex === -1) continue + + const key = keyValuePart.substring(0, equalIndex).trim() + const value = keyValuePart.substring(equalIndex + 1).trim() + + if (key != null) { + // URL decode the key and value + try { + const decodedKey = decodeURIComponent(key) + const decodedValue = decodeURIComponent(value) + result[decodedKey] = decodedValue + } catch (error) { + // If decoding fails, use the original values + result[key] = value + } + } + } + + return result +} + +let sdk: NodeSDK | undefined +let sdkServiceName: string | undefined +let sdkServiceVersion: string | undefined +let loggerProvider: LoggerProvider | undefined + +export function initOpenTelemetrySDK (serviceName: string, version: string): boolean { + if (sdk !== undefined) { + return true + } + process.env.OTEL_SERVICE_NAME = serviceName + process.env.OTEL_SERVICE_VERSION = version + + sdkServiceName = serviceName + sdkServiceVersion = version + const tracesUrl = getTracesUrl() + + if (tracesUrl === undefined) { + return false + } + + const traceHeaders = parseTraceExporterHeaders() + + const exporter = new OTLPTraceExporter({ + url: tracesUrl, + headers: traceHeaders, + compression: + (process.env.OTEL_EXPORTER_OTLP_COMPRESSION as CompressionAlgorithm) ?? + (process.env.OTEL_EXPORTER_OTLP_TRACES_COMPRESSION as CompressionAlgorithm) ?? + CompressionAlgorithm.GZIP, + keepAlive: true + }) + + const batchSpanProcessor = new BatchSpanProcessor(exporter, { + maxExportBatchSize: parseInt(process.env.OTEL_EXPORTER_OTLP_TRACES_MAX_EXPORT_BATCH_SIZE ?? '1000'), + maxQueueSize: parseInt(process.env.OTEL_EXPORTER_OTLP_TRACES_MAX_QUEUE_SIZE ?? '1000') + }) + + // Logs + const logsEndpoint = getLogsUrl() + const logHeaders = parseLogsExporterHeaders() + const logExporter = new OTLPLogExporter({ + url: logsEndpoint, + headers: logHeaders, + compression: + (process.env.OTEL_EXPORTER_OTLP_COMPRESSION as CompressionAlgorithm) ?? + (process.env.OTEL_EXPORTER_OTLP_LOGS_COMPRESSION as CompressionAlgorithm) ?? + CompressionAlgorithm.GZIP, + keepAlive: true + }) + + const batchLogProcessor = new BatchLogRecordProcessor(logExporter, { + maxExportBatchSize: parseInt(process.env.OTEL_EXPORTER_OTLP_LOGS_MAX_EXPORT_BATCH_SIZE ?? '1000'), + maxQueueSize: parseInt(process.env.OTEL_EXPORTER_OTLP_LOGS_MAX_QUEUE_SIZE ?? '1000') + }) + + // Metrics + + const metricsUrl = getMetricsUrl() + const metricsHeaders = parseMetricsExporterHeaders() + const metricsExporter = new OTLPMetricExporter({ + url: metricsUrl, + headers: metricsHeaders + }) + const metricReader = new PeriodicExportingMetricReader({ + exporter: metricsExporter, + exportIntervalMillis: 15000 + }) + + // SDK + + sdk = new NodeSDK({ + spanProcessors: [batchSpanProcessor], + serviceName, + traceExporter: exporter, + resource: resourceFromAttributes({ + 'service-name': serviceName, + 'service-version': version ?? '0.7', + 'deployment-environment': process.env.OTEL_ENVIRONMENT + }), + instrumentations: [getNodeAutoInstrumentations()], + idGenerator: new AWSXRayIdGenerator(), + logRecordProcessors: [batchLogProcessor], + metricReader + }) + + sdk.start() + + loggerProvider = new LoggerProvider({ + processors: [batchLogProcessor] + }) + + // Graceful shutdown + process.on('SIGTERM', () => { + sdk + ?.shutdown() + .then(() => { + console.log('Tracing terminated') + }) + .catch((error) => { + console.log('Error terminating tracing', error) + }) + .finally(() => process.exit(0)) + }) + console.log('Using open telemetry metrics context', { + traceEndpoint: tracesUrl, + tracerHeadersSet: Array.from(Object.keys(traceHeaders)), + logsEndpoint, + logHeadersSet: Array.from(Object.keys(logHeaders)) + }) + return true +} + +export function reportOTELError (error: Error): void { + if (sdkServiceName !== undefined && sdkServiceVersion !== undefined && loggerProvider !== undefined) { + const otlpLogger = loggerProvider?.getLogger(sdkServiceName, sdkServiceVersion) + otlpLogger?.emit({ + severityNumber: SeverityNumber.ERROR, + severityText: 'error', + body: error.message, + context: context.active(), + attributes: { + 'service.name': sdkServiceName, + 'service.version': sdkServiceVersion, + 'error.stack': error.stack + } + }) + } +} + +export function createOpenTelemetryMetricsContext ( + name: string, + params: ParamsType, + fullParams: FullParamsType | (() => FullParamsType) = {}, + metrics: Metrics = newMetrics(), + logger?: MeasureLogger, + version?: string +): MeasureContext { + if (!initOpenTelemetrySDK(name, version ?? '')) { + console.warn('OTEL_EXPORTER_OTLP_TRACES_ENDPOINT is not set, OpenTelemetry metrics will not be sent') + return new MeasureMetricsContext(name, params, fullParams, metrics, logger) + } + + // Traces + + const tracer = trace.getTracer(name) + + const otlpLogger = + process.env.OTEL_LOGGER_ENABLED === 'true' ? loggerProvider?.getLogger(sdkServiceName ?? name, version) : undefined + + const meter = otelMetrics.getMeter(name, version) + + const ctx = new OpenTelemetryMetricsContext( + name, + tracer, + undefined, + undefined, + params, + fullParams, + metrics, + logger, + undefined, + undefined, + otlpLogger, + new MetricsContext(meter) + ) + return ctx +} +function parseTraceExporterHeaders (): Record { + const headers: Record = parseBaggage(process.env.OTEL_EXPORTER_OTLP_HEADERS) ?? {} + + if (process.env.OTEL_EXPORTER_OTLP_TRACES_HEADERS !== undefined) { + const extraHeaders = parseBaggage(process.env.OTEL_EXPORTER_OTLP_TRACES_HEADERS) + for (const [key, value] of Object.entries(extraHeaders)) { + headers[key] = value + } + } + return headers +} + +function getTracesUrl (): string | undefined { + let tracesUrl = process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT ?? process.env.OTEL_EXPORTER_OTLP_ENDPOINT + + if (tracesUrl !== undefined && !tracesUrl.endsWith('/v1/traces')) { + if (tracesUrl.endsWith('/')) { + tracesUrl += 'v1/traces' + } else { + tracesUrl += '/v1/traces' + } + } + return tracesUrl +} + +function getLogsUrl (): string | undefined { + let logsUrl = process.env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT ?? process.env.OTEL_EXPORTER_OTLP_ENDPOINT + + if (logsUrl !== undefined && !logsUrl.endsWith('/v1/logs')) { + if (logsUrl.endsWith('/')) { + logsUrl += 'v1/logs' + } else { + logsUrl += '/v1/logs' + } + } + return logsUrl +} +function parseLogsExporterHeaders (): Record { + const headers: Record = parseBaggage(process.env.OTEL_EXPORTER_OTLP_HEADERS) ?? {} + + if (process.env.OTEL_EXPORTER_OTLP_LOGS_HEADERS !== undefined) { + const extraHeaders = parseBaggage(process.env.OTEL_EXPORTER_OTLP_LOGS_HEADERS) + for (const [key, value] of Object.entries(extraHeaders)) { + headers[key] = value + } + } + return headers +} + +function getMetricsUrl (): string | undefined { + let metricsUrl = process.env.OTEL_EXPORTER_OTLP_METRICS_ENDPOINT ?? process.env.OTEL_EXPORTER_OTLP_ENDPOINT + + if (metricsUrl !== undefined && !metricsUrl.endsWith('/v1/metrics')) { + if (metricsUrl.endsWith('/')) { + metricsUrl += 'v1/metrics' + } else { + metricsUrl += '/v1/metrics' + } + } + return metricsUrl +} +function parseMetricsExporterHeaders (): Record { + const headers: Record = parseBaggage(process.env.OTEL_EXPORTER_OTLP_HEADERS) ?? {} + + if (process.env.OTEL_EXPORTER_OTLP_METRICS_HEADERS !== undefined) { + const extraHeaders = parseBaggage(process.env.OTEL_EXPORTER_OTLP_METRICS_HEADERS) + for (const [key, value] of Object.entries(extraHeaders)) { + headers[key] = value + } + } + return headers +} diff --git a/packages/measurements-otlp/tsconfig.json b/packages/measurements-otlp/tsconfig.json new file mode 100644 index 0000000000..b5ae22f6e4 --- /dev/null +++ b/packages/measurements-otlp/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "./node_modules/@hcengineering/platform-rig/profiles/default/tsconfig.json", + + "compilerOptions": { + "rootDir": "./src", + "outDir": "./lib", + "declarationDir": "./types", + "tsBuildInfoFile": ".build/build.tsbuildinfo" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "lib", "dist", "types", "bundle"] +} \ No newline at end of file diff --git a/packages/measurements/.eslintrc.js b/packages/measurements/.eslintrc.js new file mode 100644 index 0000000000..72235dc283 --- /dev/null +++ b/packages/measurements/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: ['./node_modules/@hcengineering/platform-rig/profiles/default/eslint.config.json'], + parserOptions: { + tsconfigRootDir: __dirname, + project: './tsconfig.json' + } +} diff --git a/packages/measurements/.npmignore b/packages/measurements/.npmignore new file mode 100644 index 0000000000..e3ec093c38 --- /dev/null +++ b/packages/measurements/.npmignore @@ -0,0 +1,4 @@ +* +!/lib/** +!CHANGELOG.md +/lib/**/__tests__/ diff --git a/packages/measurements/config/rig.json b/packages/measurements/config/rig.json new file mode 100644 index 0000000000..0110930f55 --- /dev/null +++ b/packages/measurements/config/rig.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/rig-package/rig.schema.json", + "rigPackageName": "@hcengineering/platform-rig" +} diff --git a/packages/measurements/jest.config.js b/packages/measurements/jest.config.js new file mode 100644 index 0000000000..2cfd408b67 --- /dev/null +++ b/packages/measurements/jest.config.js @@ -0,0 +1,7 @@ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', + testMatch: ['**/?(*.)+(spec|test).[jt]s?(x)'], + roots: ["./src"], + coverageReporters: ["text-summary", "html"] +} diff --git a/packages/measurements/package.json b/packages/measurements/package.json new file mode 100644 index 0000000000..892c372c3e --- /dev/null +++ b/packages/measurements/package.json @@ -0,0 +1,51 @@ +{ + "name": "@hcengineering/measurements", + "version": "0.7.0", + "main": "lib/index.js", + "svelte": "src/index.ts", + "types": "types/index.d.ts", + "files": [ + "lib/**/*", + "types/**/*", + "tsconfig.json" + ], + "author": "Anticrm Platform Contributors", + "license": "EPL-2.0", + "scripts": { + "build": "compile", + "build:watch": "compile", + "test": "jest --passWithNoTests --silent", + "format": "format src", + "_phase:build": "compile transpile src", + "_phase:test": "jest --passWithNoTests --silent", + "_phase:format": "format src", + "_phase:validate": "compile validate" + }, + "devDependencies": { + "@hcengineering/platform-rig": "workspace:^0.7.0", + "@typescript-eslint/eslint-plugin": "^6.11.0", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-n": "^15.4.0", + "eslint": "^8.54.0", + "simplytyped": "^3.3.0", + "@typescript-eslint/parser": "^6.11.0", + "eslint-config-standard-with-typescript": "^40.0.0", + "prettier": "^3.1.0", + "typescript": "^5.8.3", + "jest": "^29.7.0", + "ts-jest": "^29.1.1", + "@types/jest": "^29.5.5" + }, + "repository": "https://github.com/hcengineering/platform", + "exports": { + ".": { + "types": "./types/index.d.ts", + "require": "./lib/index.js", + "import": "./lib/index.js" + } + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/measurements/src/context.ts b/packages/measurements/src/context.ts new file mode 100644 index 0000000000..5080866518 --- /dev/null +++ b/packages/measurements/src/context.ts @@ -0,0 +1,386 @@ +// Basic performance metrics suite. + +import { platformNow, platformNowDiff } from '.' +import { childMetrics, newMetrics, updateMeasure } from './metrics' +import { + type FullParamsType, + type MeasureContext, + type MeasureLogger, + type Metrics, + type ParamsType, + type OperationLog, + type OperationLogEntry, + type WithOptions +} from './types' + +const errorPrinter = ({ message, stack, ...rest }: Error): object => ({ + message, + stack, + ...rest +}) +function replacer (value: any): any { + return value instanceof Error ? errorPrinter(value) : value +} + +export const consoleLogger = (logParams: Record): MeasureLogger => ({ + info: (msg, args) => { + console.info( + msg, + ...Object.entries({ ...(args ?? {}), ...(logParams ?? {}) }).map( + (it) => `${it[0]}=${JSON.stringify(replacer(it[1]))}` + ) + ) + }, + error: (msg, args) => { + console.error( + msg, + ...Object.entries({ ...(args ?? {}), ...(logParams ?? {}) }).map( + (it) => `${it[0]}=${JSON.stringify(replacer(it[1]))}` + ) + ) + }, + warn: (msg, args) => { + console.warn(msg, ...Object.entries(args ?? {}).map((it) => `${it[0]}=${JSON.stringify(replacer(it[1]))}`)) + }, + close: async () => {}, + logOperation: (operation, time, params) => {} +}) + +export const noParamsLogger = consoleLogger({}) + +export const nullPromise = Promise.resolve() + +/** + * @public + */ +export class MeasureMetricsContext implements MeasureContext { + private readonly name: string + private readonly params: ParamsType + + private readonly fullParams: FullParamsType | (() => FullParamsType) = {} + logger: MeasureLogger + metrics: Metrics + id?: string + + st = platformNow() + contextData: object = {} + private done (value?: number, override?: boolean): void { + updateMeasure(this.metrics, this.st, this.params, this.fullParams, (spend) => {}, value, override) + } + + constructor ( + name: string, + params: ParamsType, + fullParams: FullParamsType | (() => FullParamsType) = {}, + metrics: Metrics = newMetrics(), + logger?: MeasureLogger, + readonly parent?: MeasureContext, + readonly logParams?: ParamsType + ) { + this.name = name + this.params = params + this.fullParams = fullParams + this.metrics = metrics + this.metrics.namedParams = this.metrics.namedParams ?? {} + for (const [k, v] of Object.entries(params)) { + if (this.metrics.namedParams[k] !== v) { + this.metrics.namedParams[k] = v + } else { + this.metrics.namedParams[k] = '*' + } + } + + this.logger = logger ?? (this.logParams != null ? consoleLogger(this.logParams ?? {}) : noParamsLogger) + } + + measure (name: string, value: number, override?: boolean): void { + const c = new MeasureMetricsContext('#' + name, {}, {}, childMetrics(this.metrics, ['#' + name]), this.logger, this) + c.contextData = this.contextData + c.done(value, override) + } + + newChild ( + name: string, + params: ParamsType, + opt?: { + fullParams?: FullParamsType + logger?: MeasureLogger + span?: WithOptions['span'] // By default true + } + ): MeasureContext { + const result = new MeasureMetricsContext( + name, + params, + opt?.fullParams ?? {}, + childMetrics(this.metrics, [name]), + opt?.logger ?? this.logger, + this, + this.logParams + ) + result.id = this.id + result.contextData = this.contextData + return result + } + + with( + name: string, + params: ParamsType, + op: (ctx: MeasureContext) => T | Promise, + fullParams?: ParamsType | (() => FullParamsType), + opt?: WithOptions + ): Promise { + const c = this.newChild(name, params, { fullParams, logger: this.logger }) + let needFinally = true + try { + const value = op(c) + if (value instanceof Promise) { + needFinally = false + return value.finally(() => { + c.end() + if (opt?.log === true) { + this.logger.logOperation(name, platformNowDiff((c as MeasureMetricsContext).st), { + ...params, + ...fullParams + }) + } + }) + } else { + if (value == null) { + return nullPromise as Promise + } + return Promise.resolve(value) + } + } finally { + if (needFinally) { + c.end() + } + } + } + + extractMeta (): Record { + return {} + } + + withSync( + name: string, + params: ParamsType, + op: (ctx: MeasureContext) => T, + fullParams?: ParamsType | (() => FullParamsType) + ): T { + const c = this.newChild(name, params, { fullParams, logger: this.logger }) + try { + return op(c) + } finally { + c.end() + } + } + + error (message: string, args?: Record): void { + this.logger.error(message, { ...this.params, ...args, ...(this.logParams ?? {}) }) + } + + info (message: string, args?: Record): void { + this.logger.info(message, { ...this.params, ...args, ...(this.logParams ?? {}) }) + } + + warn (message: string, args?: Record): void { + this.logger.warn(message, { ...this.params, ...args, ...(this.logParams ?? {}) }) + } + + end (): void { + this.done() + } + + getParams (): ParamsType { + return this.params + } +} + +export class NoMetricsContext implements MeasureContext { + logger: MeasureLogger + id?: string + + contextData: object = {} + + constructor (logger?: MeasureLogger) { + this.logger = logger ?? consoleLogger({}) + } + + measure (name: string, value: number, override?: boolean): void {} + + newChild ( + name: string, + params: ParamsType, + fullParams?: FullParamsType | (() => FullParamsType), + logger?: MeasureLogger + ): MeasureContext { + const result = new NoMetricsContext(logger ?? this.logger) + result.id = this.id + result.contextData = this.contextData + return result + } + + with( + name: string, + params: ParamsType, + op: (ctx: MeasureContext) => T | Promise, + fullParams?: ParamsType | (() => FullParamsType) + ): Promise { + const r = op(this.newChild(name, params, fullParams, this.logger)) + return r instanceof Promise ? r : Promise.resolve(r) + } + + extractMeta (): Record { + return {} + } + + withSync( + name: string, + params: ParamsType, + op: (ctx: MeasureContext) => T, + fullParams?: ParamsType | (() => FullParamsType) + ): T { + const c = this.newChild(name, params, fullParams, this.logger) + return op(c) + } + + withLog( + name: string, + params: ParamsType, + op: (ctx: MeasureContext) => T | Promise, + fullParams?: ParamsType + ): Promise { + const r = op(this.newChild(name, params, fullParams, this.logger)) + return r instanceof Promise ? r : Promise.resolve(r) + } + + error (message: string, args?: Record): void { + this.logger.error(message, { ...args }) + } + + info (message: string, args?: Record): void { + this.logger.info(message, { ...args }) + } + + warn (message: string, args?: Record): void { + this.logger.warn(message, { ...args }) + } + + end (): void {} + + getParams (): ParamsType { + return {} + } +} + +/** + * Allow to use decorator for context enabled functions + */ +export function withContext (name: string, params: ParamsType = {}): any { + return (target: any, propertyKey: string, descriptor: PropertyDescriptor): PropertyDescriptor => { + const originalMethod = descriptor.value + descriptor.value = function (...args: any[]): Promise { + const ctx = args[0] as MeasureContext + return ctx.with(name, params, (ctx) => originalMethod.apply(this, [ctx, ...args.slice(1)]) as Promise) + } + return descriptor + } +} + +let operationProfiling = false + +export function setOperationLogProfiling (value: boolean): void { + operationProfiling = value +} + +let globalId: number = 0 + +export function registerOperationLog (ctx: MeasureContext): { opLogMetrics?: Metrics, op?: OperationLog } { + if (!operationProfiling) { + return {} + } + const op: OperationLog = { start: platformNow(), ops: [], end: -1 } + let opLogMetrics: Metrics | undefined + + if (ctx.id === undefined) { + ctx.id = 'op_' + (++globalId).toString(16) + } + if (ctx.metrics !== undefined) { + if (ctx.metrics.opLog === undefined) { + ctx.metrics.opLog = {} + } + ctx.metrics.opLog[ctx.id] = op + opLogMetrics = ctx.metrics + } + return { opLogMetrics, op } +} + +export function updateOperationLog (opLogMetrics: Metrics | undefined, op: OperationLog | undefined): void { + if (!operationProfiling) { + return + } + if (op !== undefined) { + op.end = platformNow() + } + // We should keep only longest one entry + if (opLogMetrics?.opLog !== undefined) { + const entries = Object.entries(opLogMetrics.opLog) + + const incomplete = entries.filter((it) => it[1].end === -1) + const complete = entries.filter((it) => it[1].end !== -1) + complete.sort((a, b) => a[1].start - b[1].start) + if (complete.length > 30) { + complete.splice(0, complete.length - 30) + } + + opLogMetrics.opLog = Object.fromEntries(incomplete.concat(complete)) + } +} + +export function addOperation ( + ctx: MeasureContext, + name: string, + params: ParamsType, + op: (ctx: MeasureContext) => Promise, + fullParams?: FullParamsType +): Promise { + if (!operationProfiling) { + return op(ctx) + } + let opEntry: OperationLogEntry | undefined + + let p: MeasureContext | undefined = ctx + let opLogMetrics: Metrics | undefined + let id: string | undefined + + while (p !== undefined) { + if (p.metrics?.opLog !== undefined) { + opLogMetrics = p.metrics + } + if (id === undefined && p.id !== undefined) { + id = p.id + } + p = p.parent + } + const opLog = id !== undefined ? opLogMetrics?.opLog?.[id] : undefined + + if (opLog !== undefined) { + opEntry = { + op: name, + start: performance.now(), + params: {}, + end: -1 + } + } + const result = op(ctx) + if (opEntry !== undefined && opLog !== undefined) { + void result.finally(() => { + if (opEntry !== undefined && opLog !== undefined) { + opEntry.end = performance.now() + opEntry.params = { ...params, ...(typeof fullParams === 'function' ? fullParams() : fullParams) } + opLog.ops.push(opEntry) + } + }) + } + return result +} diff --git a/packages/measurements/src/index.ts b/packages/measurements/src/index.ts new file mode 100644 index 0000000000..d736098c8a --- /dev/null +++ b/packages/measurements/src/index.ts @@ -0,0 +1,13 @@ +export * from './context' +export * from './metrics' +export * from './types' + +/** + * Return a current performance timestamp + */ +export const platformNow: () => number = () => performance.now() + +/** + * Return a diff with previous performance snapshot with 2 digits after . max. + */ +export const platformNowDiff = (old: number): number => Math.round((performance.now() - old) * 100) / 100 diff --git a/packages/measurements/src/metrics.ts b/packages/measurements/src/metrics.ts new file mode 100644 index 0000000000..55b23fc318 --- /dev/null +++ b/packages/measurements/src/metrics.ts @@ -0,0 +1,337 @@ +// Basic performance metrics suite. + +import { platformNow, type MetricsData } from '.' +import { type FullParamsType, type Metrics, type ParamsType } from './types' + +/** + * @public + */ +export const globals: Metrics = newMetrics() + +/** + * @public + * @returns + */ +export function newMetrics (): Metrics { + return { + operations: 0, + value: 0, + measurements: {}, + params: {}, + namedParams: {} + } +} + +function getUpdatedTopResult ( + current: Metrics['topResult'], + time: number, + params: FullParamsType +): Metrics['topResult'] { + if (time === 0) { + return current + } + const result: Metrics['topResult'] = current ?? [] + + const newValue = { + value: time, + params + } + + if (result.length > 6) { + if (result[0].value < newValue.value) { + result[0] = newValue + return result + } + if (result[result.length - 1].value > newValue.value) { + result[result.length - 1] = newValue + return result + } + + // Shift the middle + return [result[0], newValue, ...result.slice(1, 3), result[5]] + } else { + result.push(newValue) + return result + } +} + +/** + * Measure with tree expansion. Operation counter will be added only to leaf's. + * @public + */ +export function measure ( + metrics: Metrics, + params: ParamsType, + fullParams: FullParamsType | (() => FullParamsType) = {}, + endOp?: (spend: number) => void +): () => void { + const st = platformNow() + return () => { + updateMeasure(metrics, st, params, fullParams, endOp) + } +} +export function updateMeasure ( + metrics: Metrics, + st: number, + params: ParamsType, + fullParams: FullParamsType | (() => FullParamsType), + endOp?: (spend: number) => void, + value?: number, + override?: boolean +): void { + const ed = platformNow() + + const fParams = typeof fullParams === 'function' ? fullParams() : fullParams + // Update params if required + const pparams = Object.entries(params) + if (pparams.length > 0) { + const [k, v] = pparams[0] + let params = metrics.params[k] + if (params === undefined) { + params = {} + metrics.params[k] = params + } + const vKey = `${v?.toString() ?? ''}` + let param = params[vKey] + if (param === undefined) { + param = { + operations: 0, + value: 0 + } + params[vKey] = param + } + if (override === true) { + param.operations = value ?? ed - st + } else { + param.value += value ?? ed - st + param.operations++ + } + // Do not update top results for params. + if (pparams.length > 1) { + // We need to update all other params as counters. + if (param.topResult === undefined) { + param.topResult = [] + } + for (const [, v] of pparams.slice(1)) { + const r = (param.topResult ?? []).find((it) => it.params[`${v}`] === true) + if (r !== undefined) { + r.value += 1 // Counter of operations + r.time = (r.time ?? 0) + (value ?? ed - st) + } else { + param.topResult.push({ params: { [`${v}`]: true }, value: 1, time: value ?? ed - st }) + } + } + param.topResult.sort((a, b) => b.value - a.value) + } + } + // Update leaf data + if (override === true) { + metrics.operations = value ?? ed - st + } else { + metrics.value += value ?? ed - st + metrics.operations++ + } + + metrics.topResult = getUpdatedTopResult(metrics.topResult, ed - st, fParams) + endOp?.(ed - st) +} + +/** + * @public + */ +export function childMetrics (root: Metrics, path: string[]): Metrics { + const segments = path + let oop = root + for (const p of segments) { + const v = oop.measurements[p] ?? { operations: 0, value: 0, measurements: {}, params: {} } + oop.measurements[p] = v + oop = v + } + return oop +} + +/** + * @public + */ +export function metricsAggregate (m: Metrics, limit: number = -1, roundMath: boolean = false): Metrics { + let ms = aggregateMetrics(m.measurements, limit) + + // Use child overage, if there is no top level value specified. + const me = Object.entries(ms) + const sumVal: number = + (me.length === 0 ? m.value : 0) + + me + .filter((it) => !it[0].startsWith('#')) + .map((it) => it[1]) + .reduce((p, v) => { + return p + v.value + }, 0) + + if (limit !== -1) { + // We need to keep only top limit items in ms + if (Object.keys(ms).length > 0) { + const newMs: typeof ms = {} + let added = 0 + for (const [k, v] of Object.entries(ms)) { + newMs[k] = v + added++ + if (added >= limit) { + break + } + } + ms = newMs + } + } + + return { + operations: m.operations, + measurements: ms, + params: m.params, + value: sumVal, + topResult: m.topResult, + namedParams: m.namedParams, + opLog: m.opLog + } +} + +function aggregateMetrics (m: Record, limit: number = -1): Record { + const result: Record = {} + for (const [k, v] of Object.entries(m).sort((a, b) => b[1].value - a[1].value)) { + result[k] = metricsAggregate(v, limit) + } + return result +} + +function toLen (val: string, sep: string, len: number): string { + while (val.length < len) { + val += sep + } + return val +} + +function printMetricsChildren (params: Record, offset: number, length: number): string { + let r = '' + if (Object.keys(params).length > 0) { + r += '\n' + toLen('', ' ', offset) + r += Object.entries(params) + .filter((it) => it[1].value > 0.1) + .map(([k, vv]) => toString(k, vv, offset, length)) + .join('\n' + toLen('', ' ', offset)) + } + return r +} + +function printMetricsParams ( + params: Record>, + offset: number, + length: number +): string { + let r = '' + const joinP = (key: string, data: Record): string[] => { + return Object.entries(data) + .filter((it) => it[1].value >= 0.1) + .map(([k, vv]) => + `${toLen('', ' ', offset)}${toLen(key + '=' + k, '-', length - offset)}: avg ${ + Math.round((vv.value / (vv.operations > 0 ? vv.operations : 1)) * 100) / 100 + } total: ${Math.round(vv.value * 100) / 100} ops: ${vv.operations}`.trim() + ) + } + const joinParams = Object.entries(params).reduce((p, c) => [...p, ...joinP(c[0], c[1])], []) + if (Object.keys(joinParams).length > 0) { + r += '\n' + toLen('', ' ', offset) + r += joinParams.join('\n' + toLen('', ' ', offset)) + } + return r +} + +function toString (name: string, m: Metrics, offset: number, length: number): string { + let r = `${toLen('', ' ', offset)}${toLen(name, '-', length - offset)}: avg ${ + Math.round((m.value / (m.operations > 0 ? m.operations : 1)) * 100) / 100 + } total: ${Math.round(m.value * 100) / 100} ops: ${m.operations}`.trim() + r += printMetricsParams(m.params, offset + 4, length) + r += printMetricsChildren(m.measurements, offset + 4, length) + return r +} + +function toJson (m: Metrics): any { + const obj: any = { + $total: m.value, + $ops: m.operations + } + if (m.operations > 1) { + obj.avg = Math.round((m.value / (m.operations > 0 ? m.operations : 1)) * 100) / 100 + } + if (Object.keys(m.params).length > 0) { + obj.params = m.params + } + for (const [k, v] of Object.entries(m.measurements ?? {})) { + obj[ + `${k} ${v.value} ${v.operations} ${ + v.operations > 1 ? Math.round((v.value / (v.operations > 0 ? m.operations : 1)) * 100) / 100 : '' + }` + ] = toJson(v) + } + + return obj +} + +/** + * @public + */ +export function metricsToString (metrics: Metrics, name = 'System', length: number): string { + return toString(name, metricsAggregate(metrics, 50, true), 0, length) +} + +export function metricsToJson (metrics: Metrics): any { + return toJson(metricsAggregate(metrics)) +} + +function printMetricsParamsRows ( + params: Record>, + offset: number +): (string | number)[][] { + const r: (string | number)[][] = [] + function joinP (key: string, data: Record): (string | number)[][] { + return Object.entries(data).map(([k, vv]) => [ + offset, + `${key}=${k}`, + Math.round((vv.value / (vv.operations > 0 ? vv.operations : 1)) * 100) / 100, + Math.round(vv.value * 100) / 100, + vv.operations + ]) + } + for (const [k, v] of Object.entries(params)) { + r.push(...joinP(k, v)) + } + return r +} + +function printMetricsChildrenRows (params: Record, offset: number): (string | number)[][] { + const r: (string | number)[][] = [] + if (Object.keys(params).length > 0) { + Object.entries(params).forEach(([k, vv]) => r.push(...toStringRows(k, vv, offset))) + } + return r +} + +function toStringRows (name: string, m: Metrics, offset: number): (number | string)[][] { + const r: (number | string)[][] = [ + [ + offset, + name, + Math.round((m.value / (m.operations > 0 ? m.operations : 1)) * 100) / 100, + Math.round(m.value * 100) / 100, + m.operations + ] + ] + r.push(...printMetricsParamsRows(m.params, offset + 1)) + r.push(...printMetricsChildrenRows(m.measurements, offset + 1)) + return r +} + +/** + * @public + */ +export function metricsToRows (metrics: Metrics, name = 'System'): (number | string)[][] { + return toStringRows(name, metricsAggregate(metrics, 50, true), 0) +} diff --git a/packages/measurements/src/types.ts b/packages/measurements/src/types.ts new file mode 100644 index 0000000000..18db172604 --- /dev/null +++ b/packages/measurements/src/types.ts @@ -0,0 +1,132 @@ +/** + * @public + */ +export type ParamType = string | number | boolean | undefined + +/** + * @public + */ +export type ParamsType = Record + +/** + * @public + */ +export type FullParamsType = Record + +/** + * @public + */ +export interface MetricsData { + operations: number + value: number + topResult?: { + value: number + time?: number + params: FullParamsType + }[] +} + +export interface OperationLogEntry { + op: string + params: ParamsType + start: number + end: number +} +export interface OperationLog { + ops: OperationLogEntry[] + start: number + end: number +} + +/** + * @public + */ +export interface Metrics extends MetricsData { + namedParams: ParamsType + params: Record> + measurements: Record + + opLog?: Record +} + +/** + * @public + */ +export interface MeasureLogger { + info: (message: string, obj?: Record) => void + error: (message: string, obj?: Record) => void + + warn: (message: string, obj?: Record) => void + + logOperation: (operation: string, time: number, params: ParamsType) => void + + childLogger?: (name: string, params: Record) => MeasureLogger + + close: () => Promise +} + +export interface WithOptions { + span?: true | false | 'disable' | 'skip' | 'inherit' // 'none' means no span will be created, 'disable' means context will be tracing disabled + log?: boolean + inheritParams?: boolean + + // Passed context metadata + meta?: Record +} + +/** + * @public + */ +export interface MeasureContext { + id?: string + + // Context data will be copied referenced for all child contexts. + contextData: Q + // Create a child metrics context + newChild: ( + name: string, + params: ParamsType, + opt?: { + fullParams?: FullParamsType + logger?: MeasureLogger + span?: WithOptions['span'] // By default true + meta?: Record + } + ) => MeasureContext + + metrics?: Metrics + + with: ( + name: string, + params: ParamsType, + op: (ctx: MeasureContext) => T | Promise, + fullParams?: FullParamsType | (() => FullParamsType), + opt?: WithOptions + ) => Promise + + withSync: ( + name: string, + params: ParamsType, + op: (ctx: MeasureContext) => T, + fullParams?: FullParamsType | (() => FullParamsType), + opt?: WithOptions + ) => T + + extractMeta: () => Record + + logger: MeasureLogger + + parent?: MeasureContext + getParams: () => ParamsType + + measure: (name: string, value: number, override?: boolean) => void + + // Capture error + error: (message: string, obj?: Record) => void + info: (message: string, obj?: Record) => void + warn: (message: string, obj?: Record) => void + + // Mark current context as complete + // If no value is passed, time difference will be used. + end: (value?: number) => void +} diff --git a/packages/measurements/tsconfig.json b/packages/measurements/tsconfig.json new file mode 100644 index 0000000000..b5ae22f6e4 --- /dev/null +++ b/packages/measurements/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "./node_modules/@hcengineering/platform-rig/profiles/default/tsconfig.json", + + "compilerOptions": { + "rootDir": "./src", + "outDir": "./lib", + "declarationDir": "./types", + "tsBuildInfoFile": ".build/build.tsbuildinfo" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "lib", "dist", "types", "bundle"] +} \ No newline at end of file diff --git a/packages/platform-rig/bin/bump-package-version.js b/packages/platform-rig/bin/bump-package-version.js new file mode 100755 index 0000000000..a91175092b --- /dev/null +++ b/packages/platform-rig/bin/bump-package-version.js @@ -0,0 +1,27 @@ +// +// Copyright Ā© 2022 Hardcore Engineering Inc. +// + +const child_process = require('child_process') + +child_process.exec('git describe --tags --abbrev=0', (err, stdout, stderr) => { + if (err !== null) { + if (err.message.includes('No names found')) { + console.log('No git version available') + return + } + console.log('Error', err) + process.exit(1) + } + const rawVersion = stdout.trim().replace('v', '').replace('u', '').replace('s', '').split('.') + if (rawVersion.length === 3) { + const version = { + major: parseInt(rawVersion[0]), + minor: parseInt(rawVersion[1]), + patch: parseInt(rawVersion[2]) + } + const versionStr = `${version.major}.${version.minor}.${version.patch}` + console.log(`Setting version to ${versionStr}`) + child_process.exec(`npm version ${versionStr}`) + } +}) diff --git a/packages/platform-rig/bin/compile.js b/packages/platform-rig/bin/compile.js new file mode 100755 index 0000000000..07ebe3e9cd --- /dev/null +++ b/packages/platform-rig/bin/compile.js @@ -0,0 +1,203 @@ +const { join, dirname, basename } = require("path") +const { readFileSync, existsSync, mkdirSync, createWriteStream, readdirSync, lstatSync, rmSync } = require('fs') +const { spawn } = require('child_process') + +const esbuild = require('esbuild') +const { copy } = require('esbuild-plugin-copy') +const fs = require('fs') + +async function execProcess(cmd, logFile, args, buildDir= '.build') { + let compileRoot = dirname(dirname(process.argv[1])) + console.log('Running from',) + console.log("Compiling...\n", process.cwd(), args) + + if (!existsSync(join(process.cwd(), buildDir))) { + mkdirSync(join(process.cwd(), buildDir)) + } + + const compileOut = spawn(cmd, args) + + const stdoutFilePath = `${buildDir}/${logFile}.log` + const stderrFilePath = `${buildDir}/${logFile}-err.log` + + + const outPromise = new Promise((resolve) => { + if (compileOut.stdout != null) { + let outPipe = createWriteStream(stdoutFilePath) + compileOut.stdout.pipe(outPipe) + compileOut.stdout.on('end', function (data) { + outPipe.close() + resolve() + }) + } else { + resolve() + } + }) + + const errPromise = new Promise((resolve) => { + if (compileOut.stderr != null) { + let outPipe = createWriteStream(stderrFilePath) + compileOut.stderr.pipe(outPipe) + compileOut.stderr.on('end', function (data) { + outPipe.close() + resolve() + }) + } else { + resolve() + } + }) + + let editCode = 0 + const closePromise = new Promise(resolve => { + compileOut.on('close', (code) => { + editCode = code + resolve() + }) + compileOut.on('error', (err) => { + console.error(err) + resolve() + }) + }) + + await Promise.all([outPromise, errPromise, closePromise]) + + if (editCode !== 0) { + const data = readFileSync(stdoutFilePath) + const errData = readFileSync(stderrFilePath) + console.error('\n' + data.toString() + '\n' + errData.toString()) + process.exit(editCode) + } +} + +let args = process.argv.splice(2) + +function collectFiles(source) { + const result = [] + const files = readdirSync(source) + for (const f of files) { + const sourceFile = join(source, f) + + if (lstatSync(sourceFile).isDirectory()) { + result.push(...collectFiles(sourceFile)) + } else { + let ext = basename(sourceFile) + if (!ext.endsWith('.ts') && !ext.endsWith('.js') && !ext.endsWith('.svelte')) { + continue + } + result.push(sourceFile) + } + } + return result +} + +function collectFileStats(source, result) { + if( !existsSync(source)) { + return + } + const files = readdirSync(source) + for (const f of files) { + const sourceFile = join(source, f) + const stat = lstatSync(sourceFile) + if (stat.isDirectory()) { + collectFileStats(sourceFile, result) + } else { + let ext = basename(sourceFile) + if (!ext.endsWith('.ts') && !ext.endsWith('.js') && !ext.endsWith('.svelte')) { + continue + } + result[sourceFile] = stat.mtime.getTime() + } + } +} + +function cleanNonModified(before, after) { + for( const [k,v] of Object.entries(before)) { + if( after[k] === v) { + // Same modify date, looks like not modified + console.log('clean file', k) + rmSync(k) + } + } +} + +switch (args[0]) { + case 'ui': { + console.log('Nothing to compile to UI') + break + } + case 'transpile': { + const filesToTranspile = collectFiles(join(process.cwd(), args[1])) + let st = performance.now() + const before = {} + const after = {} + collectFileStats('lib', before) + + performESBuild(filesToTranspile) + .then(() => { + console.log("Transpile time: ", Math.round((performance.now() - st) * 100) / 100) + collectFileStats('lib', after) + cleanNonModified(before, after) + }) + break + } + case 'validate': { + let st = performance.now() + validateTSC(st).then(() => { + console.log("Validate time: ", Math.round((performance.now() - st) * 100) / 100) + }) + break + } + default: { + let st = performance.now() + const filesToTranspile = collectFiles(join(process.cwd(), 'src')) + Promise.all( + [ + performESBuild(filesToTranspile), + validateTSC() + ] + ) + .then(() => { + console.log("Full build time: ", Math.round((performance.now() - st) * 100) / 100) + }) + break + } +} +async function performESBuild(filesToTranspile) { + await esbuild.build({ + entryPoints: filesToTranspile, + bundle: false, + minify: false, + outdir: 'lib', + keepNames: true, + sourcemap: 'linked', + allowOverwrite: true, + format: 'cjs', + color: true, + plugins: [ + copy({ + // this is equal to process.cwd(), which means we use cwd path as base path to resolve `to` path + // if not specified, this plugin uses ESBuild.build outdir/outfile options as base path. + resolveFrom: 'cwd', + assets: { + from: [args[1] + '/**/*.json'], + to: ['./lib'], + }, + watch: false + }) + ] + }) +} + +async function validateTSC(st) { + await execProcess( + 'tsc', + 'validate', + [ + '-pretty', + "--emitDeclarationOnly", + "--incremental", + "--tsBuildInfoFile", ".validate/tsBuildInfoFile.info", + ...args.splice(1) + ], '.validate') +} + diff --git a/packages/platform-rig/bin/do-svelte-check.js b/packages/platform-rig/bin/do-svelte-check.js new file mode 100755 index 0000000000..c61c46a3cb --- /dev/null +++ b/packages/platform-rig/bin/do-svelte-check.js @@ -0,0 +1,122 @@ +const { join, dirname } = require('path') +const { readFileSync, existsSync, mkdirSync, createWriteStream } = require('fs') +const { spawn } = require('child_process') + +function parseSvelteCheckLog(logContent) { + const lines = logContent.split('\n') + const errors = [] + let currentError = null + + let pline = '' + for (const line of lines) { + if (line.includes('Error:')) { + // Start of a new error + if (currentError) { + errors.push(currentError) + } + currentError = { + file: pline, + message: line.split('Error:')[1].trim() + } + } else if (line.includes('====================================')) { + // End of log, push last error if exists + if (currentError) { + errors.push(currentError) + } + break + } + pline = line + } + + // Print errors + if (errors.length === 0) { + console.log('No errors found') + } else { + errors.forEach((error) => { + console.log(`File: ${error.file}`) + console.log(`Message: \x1b[31m ${error.message} \x1b[0m\n`) + }) + } +} + +async function execProcess(cmd, logFile, args, useConsole) { + let compileRoot = dirname(dirname(process.argv[1])) + console.log('Svelte check...\n') + + if (!existsSync(join(process.cwd(), '.svelte-check'))) { + mkdirSync(join(process.cwd(), '.svelte-check')) + } + + const compileOut = spawn(cmd, args) + + const stdoutFilePath = `.svelte-check/${logFile}.log` + const stderrFilePath = `.svelte-check/${logFile}-err.log` + + const outPromise = new Promise((resolve) => { + if (compileOut.stdout != null) { + let outPipe = createWriteStream(stdoutFilePath) + compileOut.stdout.pipe(outPipe) + compileOut.stdout.on('end', function (data) { + outPipe.close() + if (useConsole) { + const data = readFileSync(stdoutFilePath).toString() + readFileSync(stderrFilePath).toString() + parseSvelteCheckLog(data) + } + resolve() + }) + } else { + resolve() + } + }) + + const errPromise = new Promise((resolve) => { + if (compileOut.stderr != null) { + let outPipe = createWriteStream(stderrFilePath) + compileOut.stderr.pipe(outPipe) + compileOut.stderr.on('end', function (data) { + outPipe.close() + resolve() + }) + } else { + resolve() + } + }) + + let editCode = 0 + const closePromise = new Promise((resolve) => { + compileOut.on('close', (code) => { + editCode = code + resolve() + }) + compileOut.on('error', (err) => { + console.error(err) + resolve() + }) + }) + + await Promise.all([outPromise, errPromise, closePromise]) + + if (editCode !== 0) { + if( !useConsole) { + const data = readFileSync(stdoutFilePath).toString() + const errData = readFileSync(stderrFilePath).toString() + parseSvelteCheckLog(data) + console.error('\n' + errData.toString()) + } + process.exit(editCode) + } +} + +let args = [] // process.argv.slice(2) +let useConsole = false +for (const a of process.argv.slice(2)) { + if (a === '--console') { + useConsole = true + } else { + args.push(a) + } +} +let st = performance.now() +execProcess('svelte-check', 'svelte-check', ['--output', 'human', ...args], useConsole).then(() => { + console.log('Svelte check time: ', Math.round((performance.now() - st) * 100) / 100) +}) diff --git a/packages/platform-rig/bin/format.js b/packages/platform-rig/bin/format.js new file mode 100755 index 0000000000..2bd7894f0f --- /dev/null +++ b/packages/platform-rig/bin/format.js @@ -0,0 +1,142 @@ +const { join, dirname, relative, extname, basename } = require("path") +const { readFileSync, writeFileSync, existsSync, readdirSync, lstatSync, copyFileSync, mkdirSync, rmSync, current } = require('fs') +const { spawnSync, execSync } = require('child_process') +const crypto = require('crypto') + +if(!existsSync('.format')) { + mkdirSync('.format', { recursive: true }) +} + +let hash = {} + +if( existsSync('.format/format.json') ) { + hash = JSON.parse(readFileSync('.format/format.json').toString()) +} + +let filesToCheck = [] +let allFiles = [] + +let newHash = {} + +function calcFileHash(sourceFile, msg, addCheck) { + const hasher = crypto.createHash('md5') + hasher.update(readFileSync(sourceFile)) + let digest = hasher.digest('hex') + if( hash[sourceFile] !== digest ) { + if( addCheck ){ + filesToCheck.push(sourceFile) + } + console.log(msg, relative(process.cwd(), sourceFile)) + } + newHash[sourceFile] = digest + if( addCheck ) { + allFiles.push(sourceFile) + } +} + +function calcHash(source, msg, addCheck) { + const files = readdirSync(source) + for (const f of files) { + const sourceFile = join(source, f) + + if (lstatSync(sourceFile).isDirectory()) { + calcHash(sourceFile, msg, addCheck) + } else { + let ext = basename(sourceFile) + if( !ext.endsWith('.ts') && !ext.endsWith('.js') && !ext.endsWith('.svelte')) { + continue + } + if( sourceFile.endsWith('.d.ts') ) { + // Skip declaration files + continue + } + calcFileHash(sourceFile, msg, addCheck) + } + } +} + +for( const v of process.argv.slice(2)) { + if( existsSync(v) ) { + console.info('checking:', join( process.cwd(), v) ) + calcHash(join(process.cwd(), v), 'changed', true) + } +} + +// Add package.json, .eslintrc.js and node_modules/@hcengineering/platform-rig/ as hash roots. +for( const f of ['package.json', '.eslintrc.js']) { + const fFile = join(process.cwd(), f) + if( existsSync(fFile) ) { + calcFileHash(fFile, 'changed', false) + } +} + +const rigPackage = 'node_modules/@hcengineering/platform-rig/' +if( existsSync(rigPackage) ) { + calcHash(join(process.cwd(), rigPackage), 'changed', false) +} + +if( process.argv.includes('-f') || process.argv.includes('--force')) { + console.log('force checking') + filesToCheck = allFiles +} + + +if( filesToCheck.length > 0 ) { + console.info(`running prettier ${filesToCheck.length}`) + // Changes detected. + const prettier = spawnSync(join(process.cwd(), 'node_modules/.bin/prettier'), ["--color", "--write", ...filesToCheck],) + if( prettier.stdout != null) { + writeFileSync('.format/prettier.log', prettier.stdout) + if( prettier.status === null || prettier.status === 0) { + console.info(prettier.stdout.toString()) + } else { + console.error(prettier.stdout.toString()) + } + } + if( prettier.stderr != null) { + writeFileSync('.format/prettier.err', prettier.stderr) + const data = prettier.stderr.toString() + if( data.length > 0) { + console.error(data) + } + } + + console.log(`running eslint ${filesToCheck.length}`) + const eslint = spawnSync(join(process.cwd(), 'node_modules/.bin/eslint'), ["--color", "--fix", ...filesToCheck], { + env: {...process.env, NODE_ENV: '--max-old-space-size=4096' }, + }) + if(eslint.stdout != null) { + writeFileSync('.format/eslint.log', eslint.stdout) + if( prettier.status === null || prettier.status === 0) { + console.info(eslint.stdout.toString()) + } else { + console.error(eslint.stdout.toString()) + } + } + if( eslint.stderr != null) { + writeFileSync('.format/eslint.err', eslint.stderr) + const data = eslint.stderr.toString() + if( data.length > 0) { + console.error(data) + } + } + if( prettier.status || eslint.status) { + console.info('prettier and eslint failed', prettier.status, eslint.status) + // Make file empty, to prevent false passing if called without -f or --force. + writeFileSync('.format/format.json', JSON.stringify({}, undefined, 2)) + process.exit(1) + } + + hash = newHash + for( const v of process.argv.slice(2)) { + if( existsSync(v) ) { + calcHash(join(process.cwd(), v), 'updated') + } + } + writeFileSync('.format/format.json', JSON.stringify(newHash, undefined, 2)) +} else { + console.info('No changes detected.') +} + +process.exit(0) + diff --git a/packages/platform-rig/package.json b/packages/platform-rig/package.json new file mode 100644 index 0000000000..39daeb5994 --- /dev/null +++ b/packages/platform-rig/package.json @@ -0,0 +1,35 @@ +{ + "name": "@hcengineering/platform-rig", + "version": "0.7.0", + "scripts": { + "build": "echo 'Not required'", + "format": "echo 'Not required'" + }, + "exports": { + "./bin/*": "./bin/*", + "./profiles/*": "./profiles/*" + }, + "devDependencies": { + "eslint-config-standard-with-typescript": "^40.0.0", + "svelte-eslint-parser": "^0.33.1", + "esbuild": "^0.24.2", + "esbuild-svelte": "^0.9.0", + "esbuild-plugin-copy": "~2.1.1" + }, + "dependencies": { + "typescript": "^5.8.3" + }, + "bin": { + "format": "./bin/format.js", + "compile": "./bin/compile.js", + "do-svelte-check": "./bin/do-svelte-check.js", + "bump-package-version": "./bin/bump-package-version.js" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.11.0", + "eslint": "^8.54.0" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/platform-rig/profiles/assets/config/rush-project.json b/packages/platform-rig/profiles/assets/config/rush-project.json new file mode 100644 index 0000000000..d1887be02f --- /dev/null +++ b/packages/platform-rig/profiles/assets/config/rush-project.json @@ -0,0 +1,44 @@ +{ + "incrementalBuildIgnoredGlobs": [ + "temp/**", + "lib/**", + "**/*.svelte", + ".build/**", + ".validate/**", + ".format/**", + "types" + ], + "disableBuildCacheForProject": false, + + "operationSettings": [ + { + "operationName": "build", + "outputFolderNames": ["lib", ".build"] + }, + { + "operationName": "test", + "outputFolderNames": ["coverage"] + }, + { + "operationName": "format", + "outputFolderNames": [".format"] + }, + { + "operationName": "_phase:build", + "outputFolderNames": ["lib", ".build"] + }, + { + "operationName": "_phase:validate", + "outputFolderNames": ["types", ".validate"] + }, + { + "operationName": "_phase:bundle", + "outputFolderNames": ["bundle"], + "disableBuildCacheForOperation": true + }, + { + "operationName": "_phase:test", + "outputFolderNames": ["coverage"] + } + ] + } \ No newline at end of file diff --git a/packages/platform-rig/profiles/assets/eslint.config.json b/packages/platform-rig/profiles/assets/eslint.config.json new file mode 100644 index 0000000000..51c13994f1 --- /dev/null +++ b/packages/platform-rig/profiles/assets/eslint.config.json @@ -0,0 +1,10 @@ +{ + "extends": [ + "standard-with-typescript" + ], + "ignorePatterns": ["*.json", "node_modules/*", ".eslintrc.js"], + "rules": { + "@typescript-eslint/array-type": "off", + "@typescript-eslint/promise-function-async": "off" + } +} diff --git a/packages/platform-rig/profiles/assets/tsconfig.json b/packages/platform-rig/profiles/assets/tsconfig.json new file mode 100644 index 0000000000..94a2d03e17 --- /dev/null +++ b/packages/platform-rig/profiles/assets/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "moduleResolution": "node", + "target": "esnext", + "module": "commonjs", + "sourceMap": true, + "declaration": true, + "rootDir": "./src", + "outDir": "./lib", + "strict": true, + "skipLibCheck": true, + "skipDefaultLibCheck": true, + "esModuleInterop": true, + "lib": [ + "esnext", + "dom" + ], + "types": ["node", "jest"], + "incremental": true, + "isolatedModules": true, + + } +} \ No newline at end of file diff --git a/packages/platform-rig/profiles/default/config/rush-project.json b/packages/platform-rig/profiles/default/config/rush-project.json new file mode 100644 index 0000000000..3c9c6bdb5f --- /dev/null +++ b/packages/platform-rig/profiles/default/config/rush-project.json @@ -0,0 +1,49 @@ +{ + "incrementalBuildIgnoredGlobs": [ + "lib/**", + "rush-logs/**", + "coverage/**", + ".rush/**", + ".build/**", + ".validate/**", + ".format/**", + "types" + ], + "disableBuildCacheForProject": false, + + "operationSettings": [ + { + "operationName": "build", + "outputFolderNames": ["lib", ".build"] + }, + { + "operationName": "test", + "outputFolderNames": ["coverage"] + }, + { + "operationName": "format", + "outputFolderNames": [".format"] + }, + { + "operationName": "_phase:build", + "outputFolderNames": ["lib", ".build"] + }, + { + "operationName": "_phase:validate", + "outputFolderNames": ["types", ".validate"] + }, + { + "operationName": "_phase:bundle", + "outputFolderNames": ["bundle"], + "disableBuildCacheForOperation": true + }, + { + "operationName": "_phase:package", + "outputFolderNames": ["dist"] + }, + { + "operationName": "_phase:test", + "outputFolderNames": ["coverage"] + } + ] +} \ No newline at end of file diff --git a/packages/platform-rig/profiles/default/eslint.config.json b/packages/platform-rig/profiles/default/eslint.config.json new file mode 100644 index 0000000000..f91dabca82 --- /dev/null +++ b/packages/platform-rig/profiles/default/eslint.config.json @@ -0,0 +1,11 @@ +{ + "extends": [ + "standard-with-typescript" + ], + "ignorePatterns": ["*.json", "node_modules/*", ".eslintrc.js"], + "rules": { + "@typescript-eslint/array-type": "off", + "@typescript-eslint/promise-function-async": "off", + "@typescript-eslint/consistent-type-imports": "off" + } +} diff --git a/packages/platform-rig/profiles/default/tsconfig.json b/packages/platform-rig/profiles/default/tsconfig.json new file mode 100644 index 0000000000..f6ccee4ce9 --- /dev/null +++ b/packages/platform-rig/profiles/default/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "esnext", + "module": "commonjs", + "declaration": true, + "strict": true, + "sourceMap": true, + "resolveJsonModule": true, + "types": ["jest"], + "skipLibCheck": true, + "skipDefaultLibCheck": true, + "declarationMap": true, + "disableReferencedProjectLoad": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "esModuleInterop": true, + "rootDir": "./src", + "outDir": "./lib", + "incremental": true, + "isolatedModules": true, + + } +} \ No newline at end of file diff --git a/packages/platform-rig/profiles/model/config/rush-project.json b/packages/platform-rig/profiles/model/config/rush-project.json new file mode 100644 index 0000000000..c84032e4bb --- /dev/null +++ b/packages/platform-rig/profiles/model/config/rush-project.json @@ -0,0 +1,40 @@ +{ + "incrementalBuildIgnoredGlobs": [ + "temp/**", + "lib/**", + "coverage/**", + ".build/**", + ".validate/**", + ".format/**", + "types" + ], + "disableBuildCacheForProject": false, + + "operationSettings": [ + { + "operationName": "build", + "outputFolderNames": ["lib", ".build"] + }, + { + "operationName": "format", + "outputFolderNames": [".rush/temp/.format"] + }, + { + "operationName": "_phase:build", + "outputFolderNames": ["lib", ".build"] + }, + { + "operationName": "_phase:validate", + "outputFolderNames": ["types", ".validate"] + }, + { + "operationName": "_phase:bundle", + "outputFolderNames": ["bundle"], + "disableBuildCacheForOperation": true + }, + { + "operationName": "_phase:test", + "outputFolderNames": ["coverage"] + } + ] +} \ No newline at end of file diff --git a/packages/platform-rig/profiles/model/eslint.config.json b/packages/platform-rig/profiles/model/eslint.config.json new file mode 100644 index 0000000000..51c13994f1 --- /dev/null +++ b/packages/platform-rig/profiles/model/eslint.config.json @@ -0,0 +1,10 @@ +{ + "extends": [ + "standard-with-typescript" + ], + "ignorePatterns": ["*.json", "node_modules/*", ".eslintrc.js"], + "rules": { + "@typescript-eslint/array-type": "off", + "@typescript-eslint/promise-function-async": "off" + } +} diff --git a/packages/platform-rig/profiles/model/tsconfig.json b/packages/platform-rig/profiles/model/tsconfig.json new file mode 100644 index 0000000000..4745a3d6d9 --- /dev/null +++ b/packages/platform-rig/profiles/model/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "target": "esnext", + "module": "commonjs", + "declaration": true, + "strict": true, + "sourceMap": true, + "resolveJsonModule": true, + "experimentalDecorators": true, + "skipLibCheck": true, + "skipDefaultLibCheck": true, + "declarationMap": true, + "esModuleInterop": true, + "incremental": true, + "types": ["node", "jest"], + "isolatedModules": true + } +} diff --git a/packages/platform-rig/profiles/node/config/rush-project.json b/packages/platform-rig/profiles/node/config/rush-project.json new file mode 100644 index 0000000000..474d2ef1f8 --- /dev/null +++ b/packages/platform-rig/profiles/node/config/rush-project.json @@ -0,0 +1,48 @@ +{ + "incrementalBuildIgnoredGlobs": [ + "temp/**", + "lib/**", + "coverage/**", + ".build/**", + ".validate/**", + ".format/**", + "types" + ], + "disableBuildCacheForProject": false, + + "operationSettings": [ + { + "operationName": "build", + "outputFolderNames": ["lib", ".build"] + }, + { + "operationName": "test", + "outputFolderNames": ["coverage"] + }, + { + "operationName": "format", + "outputFolderNames": [".rush/temp/.format"] + }, + { + "operationName": "_phase:build", + "outputFolderNames": ["lib", ".build"] + }, + { + "operationName": "_phase:validate", + "outputFolderNames": ["types", ".validate"] + }, + { + "operationName": "_phase:bundle", + "outputFolderNames": ["bundle"], + "disableBuildCacheForOperation": true + }, + { + "operationName": "_phase:package", + "outputFolderNames": ["dist"] + }, + { + "operationName": "_phase:test", + "outputFolderNames": ["coverage"] + } + ] +} \ No newline at end of file diff --git a/packages/platform-rig/profiles/node/eslint.config.json b/packages/platform-rig/profiles/node/eslint.config.json new file mode 100644 index 0000000000..eccad255ce --- /dev/null +++ b/packages/platform-rig/profiles/node/eslint.config.json @@ -0,0 +1,10 @@ +{ + "extends": [ + "standard-with-typescript" + ], + "ignorePatterns": ["*.json", "node_modules/*", ".eslintrc.js"], + "rules": { + "@typescript-eslint/array-type": "off", + "@typescript-eslint/promise-function-async": "off" + } +} diff --git a/packages/platform-rig/profiles/node/tsconfig.json b/packages/platform-rig/profiles/node/tsconfig.json new file mode 100644 index 0000000000..5430cf1c5a --- /dev/null +++ b/packages/platform-rig/profiles/node/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "esnext", + "module": "commonjs", + "declaration": true, + "strict": true, + "sourceMap": true, + "resolveJsonModule": true, + "types": ["node", "jest"], + "skipLibCheck": true, + "skipDefaultLibCheck": true, + "declarationMap": true, + "experimentalDecorators": true, + "esModuleInterop": true, + "rootDir": "./src", + "outDir": "./lib", + "incremental": true, + "isolatedModules": true, + + } +} diff --git a/packages/platform-rig/profiles/package/config/rush-project.json b/packages/platform-rig/profiles/package/config/rush-project.json new file mode 100644 index 0000000000..f0e86441a4 --- /dev/null +++ b/packages/platform-rig/profiles/package/config/rush-project.json @@ -0,0 +1,55 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/rush-project.schema.json", + "incrementalBuildIgnoredGlobs": [ + "lib/**", + "rush-logs/**", + "coverage/**", + ".rush/**", + ".build/**", + ".validate/**", + ".format/**", + "types", + "dist" + ], + "disableBuildCacheForProject": false, + + "operationSettings": [ + { + "operationName": "build", + "outputFolderNames": ["lib", ".build"] + }, + { + "operationName": "package", + "outputFolderNames": ["dist", ".build"] + }, + { + "operationName": "test", + "outputFolderNames": ["coverage"] + }, + { + "operationName": "format", + "outputFolderNames": [".rush/temp/.format"] + }, + { + "operationName": "_phase:build", + "outputFolderNames": ["lib", ".build"] + }, + { + "operationName": "_phase:validate", + "outputFolderNames": ["types", ".validate"] + }, + { + "operationName": "_phase:bundle", + "outputFolderNames": ["bundle"], + "disableBuildCacheForOperation": true + }, + { + "operationName": "_phase:package", + "outputFolderNames": ["dist"] + }, + { + "operationName": "_phase:test", + "outputFolderNames": ["coverage"] + } + ] +} \ No newline at end of file diff --git a/packages/platform-rig/profiles/package/config/typescript.json b/packages/platform-rig/profiles/package/config/typescript.json new file mode 100644 index 0000000000..aea78e1837 --- /dev/null +++ b/packages/platform-rig/profiles/package/config/typescript.json @@ -0,0 +1,76 @@ +/** + * Configures the TypeScript plugin for Heft. This plugin also manages linting. + */ + { + "$schema": "https://developer.microsoft.com/json-schemas/heft/typescript.schema.json", + + /** + * Can be set to "copy" or "hardlink". If set to "copy", copy files from cache. + * If set to "hardlink", files will be hardlinked to the cache location. + * This option is useful when producing a tarball of build output as TAR files don't + * handle these hardlinks correctly. "hardlink" is the default behavior. + */ + // "copyFromCacheMode": "copy", + + /** + * If provided, emit these module kinds in addition to the modules specified in the tsconfig. + * Note that this option only applies to the main tsconfig.json configuration. + */ + "additionalModuleKindsToEmit": [ + // { + // /** + // * (Required) Must be one of "commonjs", "amd", "umd", "system", "es2015", "esnext" + // */ + // "moduleKind": "amd", + // + // /** + // * (Required) The name of the folder where the output will be written. + // */ + // "outFolderName": "lib-amd" + // } + ], + + /** + * Specifies the intermediary folder that tests will use. Because Jest uses the + * Node.js runtime to execute tests, the module format must be CommonJS. + * + * The default value is "lib". + */ + // "emitFolderNameForTests": "lib-commonjs", + + /** + * If set to "true", the TSlint task will not be invoked. + */ + // "disableTslint": true, + + /** + * Set this to change the maximum number of file handles that will be opened concurrently for writing. + * The default is 50. + */ + // "maxWriteParallelism": 50, + + /** + * Describes the way files should be statically coped from src to TS output folders + */ + "staticAssetsToCopy": { + /** + * File extensions that should be copied from the src folder to the destination folder(s). + */ + "fileExtensions": [".json"] + + /** + * Glob patterns that should be explicitly included. + */ + // "includeGlobs": [ + // "some/path/*.js" + // ], + + /** + * Glob patterns that should be explicitly excluded. This takes precedence over globs listed + * in "includeGlobs" and files that match the file extensions provided in "fileExtensions". + */ + // "excludeGlobs": [ + // "some/path/*.css" + // ] + } + } \ No newline at end of file diff --git a/packages/platform-rig/profiles/package/eslint.config.json b/packages/platform-rig/profiles/package/eslint.config.json new file mode 100644 index 0000000000..5fc789658b --- /dev/null +++ b/packages/platform-rig/profiles/package/eslint.config.json @@ -0,0 +1,11 @@ +{ + "extends": [ + "standard-with-typescript" + ], + "ignorePatterns": ["*.json", "node_modules/*", ".eslintrc.js"], + "rules": { + "@typescript-eslint/array-type": "off", + "@typescript-eslint/promise-function-async": "off", + "@typescript-eslint/consistent-type-imports": "off" + } +} diff --git a/packages/platform-rig/profiles/package/tsconfig.json b/packages/platform-rig/profiles/package/tsconfig.json new file mode 100644 index 0000000000..be76b62921 --- /dev/null +++ b/packages/platform-rig/profiles/package/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "esnext", + "module": "commonjs", + "declaration": true, + "strict": true, + "sourceMap": true, + "resolveJsonModule": true, + "types": ["jest"], + "skipLibCheck": true, + "skipDefaultLibCheck": true, + "declarationMap": true, + "experimentalDecorators": true, + "esModuleInterop": true, + "rootDir": "./src", + "outDir": "./lib", + "incremental": true, + "isolatedModules": true, + + } +} \ No newline at end of file diff --git a/packages/platform-rig/profiles/ui/config/rush-project.json b/packages/platform-rig/profiles/ui/config/rush-project.json new file mode 100644 index 0000000000..b1a8f0c8c5 --- /dev/null +++ b/packages/platform-rig/profiles/ui/config/rush-project.json @@ -0,0 +1,44 @@ +{ + "incrementalBuildIgnoredGlobs": [ + "temp/**", + ".build/**", + "coverage/**", + ".build/**", + ".validate/**", + ".format/**", + "types" + ], + "disableBuildCacheForProject": false, + + "operationSettings": [ + { + "operationName": "build", + "outputFolderNames": ["lib", ".build"] + }, + { + "operationName": "test", + "outputFolderNames": ["coverage"] + }, + { + "operationName": "_phase:build", + "outputFolderNames": ["lib", ".build"] + }, + { + "operationName": "_phase:validate", + "outputFolderNames": ["types", ".validate"] + }, + { + "operationName": "_phase:bundle", + "outputFolderNames": ["bundle"], + "disableBuildCacheForOperation": true + }, + { + "operationName": "_phase:svelte-check", + "outputFolderNames": [".svelte-check"] + }, + { + "operationName": "_phase:test", + "outputFolderNames": ["coverage"] + } + ] +} \ No newline at end of file diff --git a/packages/platform-rig/profiles/ui/eslint.config.json b/packages/platform-rig/profiles/ui/eslint.config.json new file mode 100644 index 0000000000..538de3db4d --- /dev/null +++ b/packages/platform-rig/profiles/ui/eslint.config.json @@ -0,0 +1,65 @@ +{ + "root": true, + "env": { + "browser": true, + "es6": true, + "node": true + }, + "extends": ["standard-with-typescript", "plugin:svelte/prettier"], + "globals": { + "Atomics": "readonly", + "SharedArrayBuffer": "readonly" + }, + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 2020, + "sourceType": "module", + "project": ["tsconfig.json"], + "extraFileExtensions": [".svelte"] + }, + "plugins": ["@typescript-eslint", "import"], + "ignorePatterns": ["*.json", "node_modules/*", ".eslintrc.js"], + "settings": { + "import/resolver": { + "node": { + "extensions": [".ts"], + "moduleDirectory": ["src", "node_modules"] + } + } + }, + "overrides": [ + { + "files": ["**/*.svelte"], + "parser": "svelte-eslint-parser", + "parserOptions": { + "parser": "@typescript-eslint/parser" + }, + "rules": { + "@typescript-eslint/no-unused-vars": ["warn", { + // Registered Svelte names for better component typings, + // see https://raqueebuddinaziz.com/blog/svelte-type-events-slots-and-props/#restprops-props + "varsIgnorePattern": "^\\$\\$(Props|Events|Slots)$" + }], + "@typescript-eslint/array-type": "off", + "@typescript-eslint/promise-function-async": "off", + "@typescript-eslint/consistent-type-imports": "off", + "import/first": "warn", + "import/no-duplicates": "warn", + "import/no-mutable-exports": "off", + "import/no-unresolved": "warn", + "no-multiple-empty-lines": "warn", + "no-undef-init": "off", + "no-use-before-define": "warn", + // This need to be enabled eventually + "@typescript-eslint/explicit-function-return-type": "warn", + "@typescript-eslint/strict-boolean-expressions":"warn", + "@typescript-eslint/prefer-nullish-coalescing": "warn", + "@typescript-eslint/no-use-before-define": "warn", + "@typescript-eslint/no-floating-promises": "warn" + } + } + ], + "rules": { + "svelte/no-at-html-tags": "error" + } +} diff --git a/packages/platform-rig/profiles/ui/svelte/index.d.ts b/packages/platform-rig/profiles/ui/svelte/index.d.ts new file mode 100644 index 0000000000..0cab9b4c05 --- /dev/null +++ b/packages/platform-rig/profiles/ui/svelte/index.d.ts @@ -0,0 +1,4 @@ +declare module "*.svelte" { + const value: any; + export default value; +} \ No newline at end of file diff --git a/packages/platform-rig/profiles/ui/tsconfig.json b/packages/platform-rig/profiles/ui/tsconfig.json new file mode 100644 index 0000000000..b2ec4aec54 --- /dev/null +++ b/packages/platform-rig/profiles/ui/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "moduleResolution": "node", + "target": "esnext", + "module": "esnext", + "declaration": true, + "rootDir": "./src", + "outDir": "./.build/dist", + "strict": true, + "skipLibCheck": true, + "skipDefaultLibCheck": true, + "esModuleInterop": true, + "declarationMap": true, + "sourceMap": true, + "lib": ["esnext", "dom"], + "incremental": true, + "types": ["jest"], + "isolatedModules": true + } +} diff --git a/packages/postgres-base/.eslintrc.js b/packages/postgres-base/.eslintrc.js new file mode 100644 index 0000000000..ce90fb9646 --- /dev/null +++ b/packages/postgres-base/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: ['./node_modules/@hcengineering/platform-rig/profiles/node/eslint.config.json'], + parserOptions: { + tsconfigRootDir: __dirname, + project: './tsconfig.json' + } +} diff --git a/packages/postgres-base/.npmignore b/packages/postgres-base/.npmignore new file mode 100644 index 0000000000..e3ec093c38 --- /dev/null +++ b/packages/postgres-base/.npmignore @@ -0,0 +1,4 @@ +* +!/lib/** +!CHANGELOG.md +/lib/**/__tests__/ diff --git a/packages/postgres-base/config/rig.json b/packages/postgres-base/config/rig.json new file mode 100644 index 0000000000..78cc5a1733 --- /dev/null +++ b/packages/postgres-base/config/rig.json @@ -0,0 +1,5 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/rig-package/rig.schema.json", + "rigPackageName": "@hcengineering/platform-rig", + "rigProfile": "node" +} diff --git a/packages/postgres-base/jest.config.js b/packages/postgres-base/jest.config.js new file mode 100644 index 0000000000..2cfd408b67 --- /dev/null +++ b/packages/postgres-base/jest.config.js @@ -0,0 +1,7 @@ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', + testMatch: ['**/?(*.)+(spec|test).[jt]s?(x)'], + roots: ["./src"], + coverageReporters: ["text-summary", "html"] +} diff --git a/packages/postgres-base/package.json b/packages/postgres-base/package.json new file mode 100644 index 0000000000..9ff39ed3a6 --- /dev/null +++ b/packages/postgres-base/package.json @@ -0,0 +1,42 @@ +{ + "name": "@hcengineering/postgres-base", + "version": "0.7.0", + "main": "lib/index.js", + "svelte": "src/index.ts", + "types": "types/index.d.ts", + "author": "Copyright Ā© Hardcore Engineering Inc.", + "template": "@hcengineering/node-package", + "license": "EPL-2.0", + "scripts": { + "build": "compile", + "build:watch": "compile", + "test": "jest --passWithNoTests --silent --forceExit", + "format": "format src", + "_phase:build": "compile transpile src", + "_phase:test": "jest --passWithNoTests --silent --forceExit", + "_phase:format": "format src", + "_phase:validate": "compile validate" + }, + "devDependencies": { + "@hcengineering/platform-rig": "workspace:^0.7.0", + "@typescript-eslint/eslint-plugin": "^6.11.0", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-n": "^15.4.0", + "eslint": "^8.54.0", + "@typescript-eslint/parser": "^6.11.0", + "eslint-config-standard-with-typescript": "^40.0.0", + "prettier": "^3.1.0", + "typescript": "^5.8.3", + "jest": "^29.7.0", + "ts-jest": "^29.1.1", + "@types/jest": "^29.5.5", + "@types/node": "^22.15.29" + }, + "dependencies": { + "postgres": "^3.4.7" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/postgres-base/src/index.ts b/packages/postgres-base/src/index.ts new file mode 100644 index 0000000000..4f820c16be --- /dev/null +++ b/packages/postgres-base/src/index.ts @@ -0,0 +1,439 @@ +// +// Copyright Ā© 2025 Hardcore Engineering Inc. +// +// Licensed under the Eclipse Public License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. You may +// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import postgres, { type Options, type ParameterOrJSON } from 'postgres' + +const clientRefs = new Map() + +let clId = 0 + +export type DBResult = any[] & { count: number } +export interface DBClient { + execute: (query: string, parameters?: ParameterOrJSON[] | undefined) => Promise + + release: () => void + + reserve: () => Promise + + raw: () => postgres.Sql +} + +export function createDBClient (client: postgres.Sql, release: () => void = () => {}): DBClient { + return { + execute: (query, parameters) => + client.unsafe(query, doFetchTypes ? parameters : convertArrayParams(parameters), getPrepare()), + release, + reserve: async () => { + const reserved = await client.reserve() + return createDBClient(reserved, () => { + reserved.release() + }) + }, + raw: () => client + } +} + +export function convertArrayParams (params?: unknown[]): any[] | undefined { + if (params === undefined) return undefined + + return params.map((param) => { + if (!Array.isArray(param)) return param + + if (param.length === 0) return '{}' + + const sanitized = param.map((item) => { + if (item === null || item === undefined) return 'NULL' + + if (typeof item === 'number' || typeof item === 'boolean') { + return String(item) + } + + if (typeof item === 'string') { + const escaped = item.replace(/\\/g, '\\\\').replace(/"/g, '\\"') + return `"${escaped}"` + } + + const json = JSON.stringify(item) + const escapedJson = json.replace(/\\/g, '\\\\').replace(/"/g, '\\"') + return `"${escapedJson}"` + }) + + return `{${sanitized.join(',')}}` + }) +} + +export async function retryTxn ( + pool: postgres.Sql, + operation: (client: postgres.TransactionSql) => Promise +): Promise { + await pool.begin(async (client) => { + const result = await operation(client) + return result + }) +} + +/** + * @public + */ +export async function shutdownPostgres (): Promise { + for (const c of connections.values()) { + c.close(true) + } + connections.clear() +} + +export interface PostgresClientReference { + getClient: () => Promise + + mgr: ConnectionMgr + close: () => void + url: () => string +} + +class PostgresClientReferenceImpl { + count: number + client: postgres.Sql + + mgr: ConnectionMgr + + constructor ( + readonly connectionString: string, + client: postgres.Sql, + readonly onclose: () => void + ) { + this.count = 0 + this.client = client + this.mgr = new ConnectionMgr(createDBClient(this.client)) + } + + url (): string { + return this.connectionString + } + + getClient (): postgres.Sql { + return this.client + } + + close (force: boolean = false): void { + this.count-- + if (this.count === 0 || force) { + if (force) { + this.count = 0 + } + void (async () => { + this.mgr.close() + this.onclose() + const cl = this.client + await cl.end({ timeout: 1 }) + })() + } + } + + addRef (): void { + this.count++ + } +} +export class ClientRef implements PostgresClientReference { + id = ++clId + constructor ( + readonly client: PostgresClientReferenceImpl, + readonly mgr: ConnectionMgr + ) { + clientRefs.set(this.id, this) + } + + url (): string { + return this.client.url() + } + + closed = false + async getClient (): Promise { + if (!this.closed) { + return this.client.getClient() + } else { + throw Error('DB client is already closed') + } + } + + close (): void { + // Do not allow double close of mongo connection client + if (!this.closed) { + clientRefs.delete(this.id) + this.closed = true + this.client.close() + } + } +} + +export let dbExtraOptions: Partial> = {} +export function setDBExtraOptions (options: Partial>): void { + dbExtraOptions = options +} + +export function getPrepare (): { prepare: boolean } { + return { prepare: dbExtraOptions.prepare ?? false } +} + +export const doFetchTypes = true + +const connections = new Map() + +/** + * Initialize a connection to DB + * @public + */ +export function getDBClient ( + connectionString: string, + database?: string, + serviceName: string = 'transactor' +): PostgresClientReference { + const extraOptions = JSON.parse(process.env.POSTGRES_OPTIONS ?? '{}') + const key = `${connectionString}${extraOptions}` + + let existing = connections.get(key) + + if (existing === undefined) { + const sql = postgres(connectionString, { + connection: { + application_name: serviceName + }, + database, + max: 10, + min: 2, + connect_timeout: 30, + idle_timeout: 0, + transform: { + undefined: null + }, + debug: false, + notice: false, + onnotice (notice) {}, + onparameter (key, value) {}, + ...dbExtraOptions, + ...extraOptions, + fetch_types: doFetchTypes + }) + + existing = new PostgresClientReferenceImpl(connectionString, sql, () => { + connections.delete(key) + }) + connections.set(key, existing) + } + // Add reference and return once closable + existing.addRef() + return new ClientRef(existing, existing.mgr) +} + +class ConnectionInfo { + // It should preserve at least one available connection in pool, other connection should be closed + available: DBClient[] = [] + + released: boolean = false + + constructor ( + readonly connectionId: string, + protected readonly client: DBClient, + readonly managed: boolean, + readonly mgrId: string + ) {} + + async withReserve (action: (reservedClient: DBClient) => Promise, forced: boolean = false): Promise { + let reserved: DBClient | undefined + + // Check if we have at least one available connection and reserve one more if required. + if (this.available.length === 0) { + if (this.managed || forced) { + reserved = await this.client.reserve() + } + } else { + reserved = this.available.shift() as DBClient + } + + try { + // Use reserved or pool + return await action(reserved ?? this.client) + } catch (err: any) { + console.error(err) + throw err + } finally { + if (this.released) { + try { + reserved?.release() + } catch (err: any) { + console.error('failed to release', err) + } + } else if (reserved !== undefined) { + if (this.available.length > 0) { + reserved?.release() + } else { + this.available.push(reserved) + } + } + } + } + + release (): void { + for (const c of [...this.available]) { + c.release() + } + this.available = [] + } +} + +export class ConnectionMgr { + private readonly connections = new Map() + constructor (protected readonly client: DBClient) {} + + async write (id: string | undefined, mgrId: string, fn: (client: DBClient) => Promise): Promise { + const backoffInterval = 25 // millis + const maxTries = 5 + let tries = 0 + + const realId = id ?? `${++clId}` + + const connection = this.getConnection(realId, mgrId, false) + + try { + while (true) { + const retry: boolean | Error = await connection.withReserve(async (client) => { + tries++ + try { + await client.execute('BEGIN;') + await fn(client) + await client.execute('COMMIT;') + return true + } catch (err: any) { + await client.execute('ROLLBACK;') + console.error({ message: 'failed to process tx', error: err.message, cause: err }) + + if (!this.isRetryableError(err) || tries === maxTries) { + return err + } else { + console.log('Transaction failed. Retrying.') + console.log(err.message) + return false + } + } + }, true) + if (retry === true) { + break + } + if (retry instanceof Error) { + // Pass it to exit + throw retry + } + // Retry for a timeout + await new Promise((resolve) => setTimeout(resolve, backoffInterval)) + } + } finally { + if (!connection.managed) { + // We need to relase in case it temporaty connection was used + connection.release() + } + } + } + + async retry (id: string | undefined, mgrId: string, fn: (client: DBClient) => Promise): Promise { + const backoffInterval = 25 // millis + const maxTries = 5 + let tries = 0 + + const realId = id ?? `${++clId}` + // Will reuse reserved if had and use new one if not + const connection = this.getConnection(realId, mgrId, false) + + try { + while (true) { + const retry: false | { result: any } | Error = await connection.withReserve(async (client) => { + tries++ + try { + return { result: await fn(client) } + } catch (err: any) { + console.error({ message: 'failed to process sql', error: err.message, cause: err }) + if (!this.isRetryableError(err) || tries === maxTries) { + return err + } else { + console.log('Read Transaction failed. Retrying.') + console.log(err.message) + return false + } + } + }) + if (retry instanceof Error) { + // Pass it to exit + throw retry + } + if (retry === false) { + // Retry for a timeout + await new Promise((resolve) => setTimeout(resolve, backoffInterval)) + continue + } + return retry.result + } + } finally { + if (!connection.managed) { + // We need to relase in case it temporaty connection was used + connection.release() + } + } + } + + release (id: string): void { + const conn = this.connections.get(id) + if (conn !== undefined) { + conn.released = true + this.connections.delete(id) // We need to delete first + conn.release() + } + } + + close (mgrId?: string): void { + const cnts = this.connections + for (const [k, conn] of Array.from(cnts.entries())) { + if (mgrId !== undefined && conn.mgrId !== mgrId) { + continue + } + cnts.delete(k) + try { + conn.release() + } catch (err: any) { + console.error('failed to release connection') + } + } + } + + getConnection (id: string, mgrId: string, managed: boolean = true): ConnectionInfo { + let conn = this.connections.get(id) + if (conn === undefined) { + conn = new ConnectionInfo(id, this.client, managed, mgrId) + } + if (managed) { + this.connections.set(id, conn) + } + return conn + } + + private isRetryableError (err: any): boolean { + const msg: string = err?.message ?? '' + + return ( + err.code === '40001' || // Retry transaction + err.code === '55P03' || // Lock not available + err.code === 'CONNECTION_CLOSED' || // This error is thrown if the connection was closed without an error. + err.code === 'CONNECTION_DESTROYED' || // This error is thrown for any queries that were pending when the timeout to sql.end({ timeout: X }) was reached. If the DB client is being closed completely retry will result in CONNECTION_ENDED which is not retried so should be fine. + msg.includes('RETRY_SERIALIZABLE') + ) + } +} diff --git a/packages/postgres-base/tsconfig.json b/packages/postgres-base/tsconfig.json new file mode 100644 index 0000000000..c6a877cf6c --- /dev/null +++ b/packages/postgres-base/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "./node_modules/@hcengineering/platform-rig/profiles/node/tsconfig.json", + + "compilerOptions": { + "rootDir": "./src", + "outDir": "./lib", + "declarationDir": "./types", + "tsBuildInfoFile": ".build/build.tsbuildinfo" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "lib", "dist", "types", "bundle"] +} \ No newline at end of file diff --git a/rush.json b/rush.json new file mode 100644 index 0000000000..a8402c4dbf --- /dev/null +++ b/rush.json @@ -0,0 +1,355 @@ +/** + * This is the main configuration file for Rush. + * For full documentation, please see https://rushjs.io + */ +{ + "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/rush.schema.json", + + /** + * (Required) This specifies the version of the Rush engine to be used in this repo. + * Rush's "version selector" feature ensures that the globally installed tool will + * behave like this release, regardless of which version is installed globally. + * + * The common/scripts/install-run-rush.js automation script also uses this version. + * + * NOTE: If you upgrade to a new major version of Rush, you should replace the "v5" + * path segment in the "$schema" field for all your Rush config files. This will ensure + * correct error-underlining and tab-completion for editors such as VS Code. + */ + "rushVersion": "5.158.1", + + /** + * The next field selects which package manager should be installed and determines its version. + * Rush installs its own local copy of the package manager to ensure that your build process + * is fully isolated from whatever tools are present in the local environment. + * + * Specify one of: "pnpmVersion", "npmVersion", or "yarnVersion". See the Rush documentation + * for details about these alternatives. + */ + "pnpmVersion": "10.15.1", + + // "npmVersion": "6.14.15", + // "yarnVersion": "1.9.4", + + /** + * Older releases of the Node.js engine may be missing features required by your system. + * Other releases may have bugs. In particular, the "latest" version will not be a + * Long Term Support (LTS) version and is likely to have regressions. + * + * Specify a SemVer range to ensure developers use a Node.js version that is appropriate + * for your repo. + * + * LTS schedule: https://nodejs.org/en/about/releases/ + * LTS versions: https://nodejs.org/en/download/releases/ + */ + "nodeSupportedVersionRange": ">=18.20.3 <19.0.0 || >=20.14.0 <23.0.0", + + /** + * If the version check above fails, Rush will display a message showing the current + * node version and the supported version range. You can use this setting to provide + * additional instructions that will display below the warning, if there's a specific + * tool or script you'd like the user to use to get in line with the expected version. + */ + // "nodeSupportedVersionInstructions": "Run 'nvs use' to switch to the expected node version.", + + /** + * Odd-numbered major versions of Node.js are experimental. Even-numbered releases + * spend six months in a stabilization period before the first Long Term Support (LTS) version. + * For example, 8.9.0 was the first LTS version of Node.js 8. Pre-LTS versions are not recommended + * for production usage because they frequently have bugs. They may cause Rush itself + * to malfunction. + * + * Rush normally prints a warning if it detects a pre-LTS Node.js version. If you are testing + * pre-LTS versions in preparation for supporting the first LTS version, you can use this setting + * to disable Rush's warning. + */ + // "suppressNodeLtsWarning": false, + + /** + * Rush normally prints a warning if it detects that the current version is not one published to the + * public npmjs.org registry. If you need to block calls to the npm registry, you can use this setting to disable + * Rush's check. + */ + // "suppressRushIsPublicVersionCheck": false, + + /** + * Large monorepos can become intimidating for newcomers if project folder paths don't follow + * a consistent and recognizable pattern. When the system allows nested folder trees, + * we've found that teams will often use subfolders to create islands that isolate + * their work from others ("shipping the org"). This hinders collaboration and code sharing. + * + * The Rush developers recommend a "category folder" model, where buildable project folders + * must always be exactly two levels below the repo root. The parent folder acts as the category. + * This provides a basic facility for grouping related projects (e.g. "apps", "libraries", + * "tools", "prototypes") while still encouraging teams to organize their projects into + * a unified taxonomy. Limiting to 2 levels seems very restrictive at first, but if you have + * 20 categories and 20 projects in each category, this scheme can easily accommodate hundreds + * of projects. In practice, you will find that the folder hierarchy needs to be rebalanced + * occasionally, but if that's painful, it's a warning sign that your development style may + * discourage refactoring. Reorganizing the categories should be an enlightening discussion + * that brings people together, and maybe also identifies poor coding practices (e.g. file + * references that reach into other project's folders without using Node.js module resolution). + * + * The defaults are projectFolderMinDepth=1 and projectFolderMaxDepth=2. + * + * To remove these restrictions, you could set projectFolderMinDepth=1 + * and set projectFolderMaxDepth to a large number. + */ + // "projectFolderMinDepth": 2, + // "projectFolderMaxDepth": 2, + + /** + * Today the npmjs.com registry enforces fairly strict naming rules for packages, but in the early + * days there was no standard and hardly any enforcement. A few large legacy projects are still using + * nonstandard package names, and private registries sometimes allow it. Set "allowMostlyStandardPackageNames" + * to true to relax Rush's enforcement of package names. This allows upper case letters and in the future may + * relax other rules, however we want to minimize these exceptions. Many popular tools use certain punctuation + * characters as delimiters, based on the assumption that they will never appear in a package name; thus if we relax + * the rules too much it is likely to cause very confusing malfunctions. + * + * The default value is false. + */ + // "allowMostlyStandardPackageNames": true, + + /** + * This feature helps you to review and approve new packages before they are introduced + * to your monorepo. For example, you may be concerned about licensing, code quality, + * performance, or simply accumulating too many libraries with overlapping functionality. + * The approvals are tracked in two config files "browser-approved-packages.json" + * and "nonbrowser-approved-packages.json". See the Rush documentation for details. + */ + // "approvedPackagesPolicy": { + // /** + // * The review categories allow you to say for example "This library is approved for usage + // * in prototypes, but not in production code." + // * + // * Each project can be associated with one review category, by assigning the "reviewCategory" field + // * in the "projects" section of rush.json. The approval is then recorded in the files + // * "common/config/rush/browser-approved-packages.json" and "nonbrowser-approved-packages.json" + // * which are automatically generated during "rush update". + // * + // * Designate categories with whatever granularity is appropriate for your review process, + // * or you could just have a single category called "default". + // */ + // "reviewCategories": [ + // // Some example categories: + // "production", // projects that ship to production + // "tools", // non-shipping projects that are part of the developer toolchain + // "prototypes" // experiments that should mostly be ignored by the review process + // ], + // + // /** + // * A list of NPM package scopes that will be excluded from review. + // * We recommend to exclude TypeScript typings (the "@types" scope), because + // * if the underlying package was already approved, this would imply that the typings + // * are also approved. + // */ + // // "ignoredNpmScopes": ["@types"] + // }, + + /** + * If you use Git as your version control system, this section has some additional + * optional features you can use. + */ + "gitPolicy": { + /** + * Work at a big company? Tired of finding Git commits at work with unprofessional Git + * emails such as "beer-lover@my-college.edu"? Rush can validate people's Git email address + * before they get started. + * + * Define a list of regular expressions describing allowable e-mail patterns for Git commits. + * They are case-insensitive anchored JavaScript RegExps. Example: ".*@example\.com" + * + * IMPORTANT: Because these are regular expressions encoded as JSON string literals, + * RegExp escapes need two backslashes, and ordinary periods should be "\\.". + */ + // "allowedEmailRegExps": [ + // "[^@]+@users\\.noreply\\.github\\.com", + // "rush-bot@example\\.org" + // ], + /** + * When Rush reports that the address is malformed, the notice can include an example + * of a recommended email. Make sure it conforms to one of the allowedEmailRegExps + * expressions. + */ + // "sampleEmail": "example@users.noreply.github.com", + /** + * The commit message to use when committing changes during 'rush publish'. + * + * For example, if you want to prevent these commits from triggering a CI build, + * you might configure your system's trigger to look for a special string such as "[skip-ci]" + * in the commit message, and then customize Rush's message to contain that string. + */ + // "versionBumpCommitMessage": "Bump versions [skip ci]", + /** + * The commit message to use when committing changes during 'rush version'. + * + * For example, if you want to prevent these commits from triggering a CI build, + * you might configure your system's trigger to look for a special string such as "[skip-ci]" + * in the commit message, and then customize Rush's message to contain that string. + */ + // "changeLogUpdateCommitMessage": "Update changelogs [skip ci]", + /** + * The commit message to use when committing changefiles during 'rush change --commit' + * + * If no commit message is set it will default to 'Rush change' + */ + // "changefilesCommitMessage": "Rush change" + }, + + "repository": { + /** + * The URL of this Git repository, used by "rush change" to determine the base branch for your PR. + * + * The "rush change" command needs to determine which files are affected by your PR diff. + * If you merged or cherry-picked commits from the main branch into your PR branch, those commits + * should be excluded from this diff (since they belong to some other PR). In order to do that, + * Rush needs to know where to find the base branch for your PR. This information cannot be + * determined from Git alone, since the "pull request" feature is not a Git concept. Ideally + * Rush would use a vendor-specific protocol to query the information from GitHub, Azure DevOps, etc. + * But to keep things simple, "rush change" simply assumes that your PR is against the "main" branch + * of the Git remote indicated by the repository.url setting in rush.json. If you are working in + * a GitHub "fork" of the real repo, this setting will be different from the repository URL of your + * your PR branch, and in this situation "rush change" will also automatically invoke "git fetch" + * to retrieve the latest activity for the remote main branch. + */ + // "url": "https://github.com/microsoft/rush-example", + /** + * The default branch name. This tells "rush change" which remote branch to compare against. + * The default value is "main" + */ + // "defaultBranch": "main", + /** + * The default remote. This tells "rush change" which remote to compare against if the remote URL is + * not set or if a remote matching the provided remote URL is not found. + */ + // "defaultRemote": "origin" + }, + + /** + * Event hooks are customized script actions that Rush executes when specific events occur + */ + "eventHooks": { + /** + * A list of shell commands to run before "rush install" or "rush update" starts installation + */ + "preRushInstall": [ + // "common/scripts/pre-rush-install.js" + ], + + /** + * A list of shell commands to run after "rush install" or "rush update" finishes installation + */ + "postRushInstall": [], + + /** + * A list of shell commands to run before "rush build" or "rush rebuild" starts building + */ + "preRushBuild": [], + + /** + * A list of shell commands to run after "rush build" or "rush rebuild" finishes building + */ + "postRushBuild": [], + + /** + * A list of shell commands to run before the "rushx" command starts + */ + "preRushx": [], + + /** + * A list of shell commands to run after the "rushx" command finishes + */ + "postRushx": [] + }, + + /** + * Installation variants allow you to maintain a parallel set of configuration files that can be + * used to build the entire monorepo with an alternate set of dependencies. For example, suppose + * you upgrade all your projects to use a new release of an important framework, but during a transition period + * you intend to maintain compatibility with the old release. In this situation, you probably want your + * CI validation to build the entire repo twice: once with the old release, and once with the new release. + * + * Rush "installation variants" correspond to sets of config files located under this folder: + * + * common/config/rush/variants/ + * + * The variant folder can contain an alternate common-versions.json file. Its "preferredVersions" field can be used + * to select older versions of dependencies (within a loose SemVer range specified in your package.json files). + * To install a variant, run "rush install --variant ". + * + * For more details and instructions, see this article: https://rushjs.io/pages/advanced/installation_variants/ + */ + "variants": [ + // { + // /** + // * The folder name for this variant. + // */ + // "variantName": "old-sdk", + // + // /** + // * An informative description + // */ + // "description": "Build this repo using the previous release of the SDK" + // } + ], + + /** + * Rush can collect anonymous telemetry about everyday developer activity such as + * success/failure of installs, builds, and other operations. You can use this to identify + * problems with your toolchain or Rush itself. THIS TELEMETRY IS NOT SHARED WITH MICROSOFT. + * It is written into JSON files in the common/temp folder. It's up to you to write scripts + * that read these JSON files and do something with them. These scripts are typically registered + * in the "eventHooks" section. + */ + // "telemetryEnabled": false, + + /** + * Allows creation of hotfix changes. This feature is experimental so it is disabled by default. + * If this is set, 'rush change' only allows a 'hotfix' change type to be specified. This change type + * will be used when publishing subsequent changes from the monorepo. + */ + // "hotfixChangeEnabled": false, + + /** + * This is an optional, but recommended, list of allowed tags that can be applied to Rush projects + * using the "tags" setting in this file. This list is useful for preventing mistakes such as misspelling, + * and it also provides a centralized place to document your tags. If "allowedProjectTags" list is + * not specified, then any valid tag is allowed. A tag name must be one or more words + * separated by hyphens or slashes, where a word may contain lowercase ASCII letters, digits, + * ".", and "@" characters. + */ + // "allowedProjectTags": [ "tools", "frontend-team", "1.0.0-release" ], + + /** + * (Required) This is the inventory of projects to be managed by Rush. + * + * Rush does not automatically scan for projects using wildcards, for a few reasons: + * 1. Depth-first scans are expensive, particularly when tools need to repeatedly collect the list. + * 2. On a caching CI machine, scans can accidentally pick up files left behind from a previous build. + * 3. It's useful to have a centralized inventory of all projects and their important metadata. + */ + "projects": [ + { + "packageName": "@hcengineering/platform-rig", + "projectFolder": "packages/platform-rig", + "reviewCategory": "tools", + "shouldPublish": true + }, + { + "packageName": "@hcengineering/measurements", + "projectFolder": "packages/measurements", + "shouldPublish": true + }, + { + "packageName": "@hcengineering/measurements-otlp", + "projectFolder": "packages/measurements-otlp", + "shouldPublish": true + }, + { + "packageName": "@hcengineering/postgres-base", + "projectFolder": "packages/postgres-base", + "shouldPublish": true + } + ] +} diff --git a/scripts/bump-version.sh b/scripts/bump-version.sh new file mode 100755 index 0000000000..cb0ebf9aec --- /dev/null +++ b/scripts/bump-version.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +# Exit immediately if a command exits with a non-zero status +set -e + +# Ensure Rush is installed +if [ ! -f "common/scripts/install-run-rush.js" ]; then + echo "Rush.js is not installed. Please ensure Rush is set up correctly." + exit 1 +fi + +# Bump versions using Rush +node common/scripts/install-run-rush.js version --bump --override-bump minor + +# Commit the changes +git add . +git commit -m "Bump versions using Rush.js" + +echo "Version bump completed successfully." From ef6ae5e1783f9b217a7b689eb2efb5e68b8baeea Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Mon, 8 Sep 2025 13:27:22 +0700 Subject: [PATCH 02/40] Formatting and VSCode utils --- .prettierrc | 20 + .vscode/extensions.json | 8 + .vscode/launch.json | 995 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 1023 insertions(+) create mode 100644 .prettierrc create mode 100644 .vscode/extensions.json create mode 100644 .vscode/launch.json diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000000..00d5897747 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,20 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "trailingComma": "none", + "tabWidth": 2, + "semi": false, + "singleQuote": true, + "printWidth": 120, + "useTabs": false, + "bracketSpacing": true, + "proseWrap": "preserve", + "plugins": [], + "overrides": [ + { + "files": "*.svelte", + "options": { + "parser": "svelte" + } + } + ] +} diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000000..b8552f9c56 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,8 @@ +{ + "recommendations": [ + "dbaeumer.vscode-eslint", + "svelte.svelte-vscode", + "esbenp.prettier-vscode", + "firsttris.vscode-jest-runner" + ] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000000..e7ad3953d3 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,995 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "address": "127.0.0.1", + "localRoot": "${workspaceFolder}", + "name": "Attach to Remote", + "port": 9229, + "request": "attach", + "sourceMaps": true, + "skipFiles": ["/**"], + "type": "node" + }, + { + "name": "Python: Embeddings", + "type": "python", + "request": "launch", + "program": "./pods/embeddings/server.py", + "args": ["--model", "sentence-transformers/all-MiniLM-L6-v2", "--device", "cpu"], + "console": "integratedTerminal", + "justMyCode": true, + "env": { + "PYTORCH_ENABLE_MPS_FALLBACK": "1" + } + }, + { + "name": "Debug server", + "type": "node", + "request": "launch", + "args": ["src/__start.ts"], + "env": { + // "FULLTEXT_URL": "http://localhost:4700", + "FULLTEXT_URL": "http://huly.local:4702", + // "MONGO_URL": "mongodb://localhost:27017", + "DB_URL": "mongodb://localhost:27017", + // "DB_URL": "postgresql://postgres:example@localhost:5432", + // "DB_URL": "postgresql://root@huly.local:26257/defaultdb?sslmode=disable", + // "GREEN_URL": "http://huly.local:6767?token=secret", + "SERVER_PORT": "3333", + "APM_SERVER_URL2": "http://localhost:8200", + "METRICS_CONSOLE": "false", + "METRICS_FILE": "${workspaceRoot}/metrics.txt", // Show metrics in console evert 30 seconds., + "STORAGE_CONFIG": "datalake|http://huly.local:4030", + "SERVER_SECRET": "secret", + "ENABLE_CONSOLE": "true", + "COLLABORATOR_URL": "ws://localhost:3078", + "REKONI_URL": "http://localhost:4004", + "FRONT_URL": "http://localhost:8080", + "ACCOUNTS_URL": "http://localhost:3000", + "MODEL_JSON": "${workspaceRoot}/models/all/bundle/model.json", + // "SERVER_PROVIDER":"uweb" + "SERVER_PROVIDER": "ws", + "MODEL_VERSION": "0.7.48", + // "VERSION": "0.6.289", + "ELASTIC_INDEX_NAME": "local_storage_index", + "UPLOAD_URL": "/files", + "AI_BOT_URL": "http://localhost:4010", + "STATS_URL": "http://huly.local:4900", + "STREAM_URL": "http://huly.local:1080/recording", + "QUEUE_CONFIG": "localhost:19092" + }, + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "runtimeVersion": "20", + "showAsyncStacks": true, + "outputCapture": "std", + "sourceMaps": true, + "cwd": "${workspaceRoot}/pods/server", + "protocol": "inspector" + }, + { + "name": "Debug server (CR)", + "type": "node", + "request": "launch", + "args": ["src/__start.ts"], + "env": { + // "FULLTEXT_URL": "http://localhost:4700", + "FULLTEXT_URL": "http://huly.local:4702", + // "MONGO_URL": "mongodb://localhost:27017", + // "DB_URL": "mongodb://localhost:27017", + // "DB_URL": "postgresql://postgres:example@localhost:5432", + "DB_URL": "postgresql://root@localhost:26257/defaultdb?sslmode=disable", + // "GREEN_URL": "http://huly.local:6767?token=secret", + "SERVER_PORT": "3332", + "APM_SERVER_URL2": "http://localhost:8200", + "METRICS_CONSOLE": "false", + "METRICS_FILE": "${workspaceRoot}/metrics.txt", // Show metrics in console evert 30 seconds., + "STORAGE_CONFIG": "datalake|http://huly.local:4030", + "SERVER_SECRET": "secret", + "ENABLE_CONSOLE": "true", + "COLLABORATOR_URL": "ws://localhost:3078", + "REKONI_URL": "http://localhost:4004", + "FRONT_URL": "http://localhost:8080", + "ACCOUNTS_URL": "http://localhost:3000", + "MODEL_JSON": "${workspaceRoot}/models/all/bundle/model.json", + // "SERVER_PROVIDER":"uweb" + "SERVER_PROVIDER": "ws", + "MODEL_VERSION": "0.7.186", + // "VERSION": "0.6.289", + "COMMUNICATION_API_ENABLED": "true", + "ELASTIC_INDEX_NAME": "local_storage_index", + "UPLOAD_URL": "/files", + "AI_BOT_URL": "http://localhost:4010", + "STATS_URL": "http://huly.local:4900", + "QUEUE_CONFIG": "localhost:19092", + "FILES_URL": "http://huly.local:4030/blob/:workspace/:blobId/:filename", + "OTEL_EXPORTER_OTLP_ENDPOINT": "http://huly.local:4318/v1/traces" + }, + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "runtimeVersion": "20", + "showAsyncStacks": true, + "outputCapture": "std", + "sourceMaps": true, + "cwd": "${workspaceRoot}/pods/server", + "protocol": "inspector" + }, + { + "name": "Debug server(Test)", + "type": "node", + "request": "launch", + "args": ["src/__start.ts"], + "env": { + "FULLTEXT_URL": "http://localhost:4710", + // "DB_URL": "mongodb://localhost:27018", + // "DB_URL": "postgresql://postgres:example@localhost:5432", + "DB_URL": "postgresql://root@huly.local:26258/defaultdb?sslmode=disable", + // "GREEN_URL": "http://huly.local:6767?token=secret", + "SERVER_PORT": "3334", + "METRICS_CONSOLE": "false", + "DEBUG_PRINT_SQL": "true", + "METRICS_FILE": "${workspaceRoot}/metrics.txt", // Show metrics in console evert 30 seconds., + "STORAGE_CONFIG": "minio|localhost?accessKey=minioadmin&secretKey=minioadmin", + "SERVER_SECRET": "secret", + "ENABLE_CONSOLE": "true", + "COLLABORATOR_URL": "ws://localhost:3079", + "FRONT_URL": "http://localhost:8083", + "ACCOUNTS_URL": "http://localhost:3003", + "MODEL_JSON": "${workspaceRoot}/models/all/bundle/model.json", + "MODEL_VERSION": "0.7.173", + "STATS_URL": "http://huly.local:4901", + "QUEUE_CONFIG": "localhost:19093" + }, + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "runtimeVersion": "22", + "showAsyncStacks": true, + "outputCapture": "std", + "sourceMaps": true, + "cwd": "${workspaceRoot}/pods/server", + "protocol": "inspector" + }, + { + "name": "Debug Fulltext", + "type": "node", + "request": "launch", + "args": ["src/index.ts"], + "env": { + // "PORT": "4700",// For mongo + "PORT": "4710", // for cockroach + "FULLTEXT_DB_URL": "http://localhost:9201", + // "DB_URL": "mongodb://localhost:27018", + // "DB_URL": "postgresql://postgres:example@localhost:5432", + "DB_URL": "postgresql://root@huly.local:26258/defaultdb?sslmode=disable", + "STORAGE_CONFIG": "minio|localhost?accessKey=minioadmin&secretKey=minioadmin", + "SERVER_SECRET": "secret", + "REKONI_URL": "http://localhost:4004", + "MODEL_JSON": "${workspaceRoot}/models/all/bundle/model.json", + "ELASTIC_INDEX_NAME": "local_storage_index", + "REGION": "", + "STATS_URL": "http://huly.local:4901", + "ACCOUNTS_URL": "http://huly.local:3003", + "QUEUE_CONFIG": "localhost:19093;-staging" + }, + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "runtimeVersion": "20", + "showAsyncStacks": true, + "outputCapture": "std", + "sourceMaps": true, + "cwd": "${workspaceRoot}/pods/fulltext", + "protocol": "inspector" + }, + { + "name": "Debug Account", + "type": "node", + "request": "launch", + "args": ["src/__start.ts"], + "env": { + "MONGO_URL": "mongodb://localhost:27017", + // "DB_URL": "mongodb://localhost:27017", + "DB_URL": "postgresql://root@huly.local:26257/defaultdb?sslmode=disable", + "SERVER_SECRET": "secret", + "REGION_INFO": "|Mongo;cockroach|CockroachDB", + "TRANSACTOR_URL": "ws://huly.local:3333,ws://huly.local:3332;;cockroach", + "ACCOUNTS_URL": "http://localhost:3000", + "ACCOUNT_PORT": "3000", + // "FRONT_URL": "http://huly.local:8080", + "FRONT_URL": "http://huly.local:8087", + "STATS_URL": "http://huly.local:4900", + "MAIL_URL": "", + // "DB_NS": "account-2", + // "WS_LIVENESS_DAYS": "1", + // "WORKSPACE_LIMIT_PER_USER": "1", + "MINIO_ACCESS_KEY": "minioadmin", + "MINIO_SECRET_KEY": "minioadmin", + "MINIO_ENDPOINT": "localhost", + // "DISABLE_SIGNUP": "true", + "OTLP_ENDPOINT": "http://huly.local:4318/v1/traces" + }, + "runtimeVersion": "20", + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "sourceMaps": true, + "outputCapture": "std", + "cwd": "${workspaceRoot}/pods/account", + "protocol": "inspector" + }, + { + "name": "Debug Account(Staging)", + "type": "node", + "request": "launch", + "args": ["src/__start.ts"], + "env": { + // "MONGO_URL": "mongodb://localhost:27018", + // "DB_URL": "mongodb://localhost:27018", + // "DB_URL": "postgresql://postgres:example@localhost:5432", + "DB_URL": "postgresql://root@huly.local:26258/defaultdb?sslmode=disable", + "SERVER_SECRET": "secret", + "REGION_INFO": "|Mongo;pg|Postgres;cockroach|CockroachDB", + "TRANSACTOR_URL": "ws://transactor:3334;ws://localhost:3334", + "ACCOUNTS_URL": "http://localhost:3003", + "ACCOUNT_PORT": "3003", + "FRONT_URL": "http://localhost:8083", + "STATS_URL": "http://huly.local:4901", + "MAIL_URL": "", + // "DB_NS": "account-2", + // "WS_LIVENESS_DAYS": "1", + "MINIO_ACCESS_KEY": "minioadmin", + "MINIO_SECRET_KEY": "minioadmin", + "MINIO_ENDPOINT": "localhost" + // "DISABLE_SIGNUP": "true", + }, + "runtimeVersion": "20", + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "sourceMaps": true, + "outputCapture": "std", + "cwd": "${workspaceRoot}/pods/account", + "protocol": "inspector" + }, + { + "name": "Debug Stats", + "type": "node", + "request": "launch", + "args": ["src/__start.ts"], + "env": { + "PORT": "4901", + "SERVER_SECRET": "secret" + }, + "runtimeVersion": "20", + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "sourceMaps": true, + "outputCapture": "std", + "cwd": "${workspaceRoot}/pods/stats", + "protocol": "inspector" + }, + { + "name": "Debug Workspace(mongo)", + "type": "node", + "request": "launch", + "args": ["src/__start.ts"], + "env": { + "DB_URL": "mongodb://localhost:27017", + // "DB_URL": "postgresql://postgres:example@localhost:5432", + // "DB_URL": "postgresql://root@huly.local:26257/defaultdb?sslmode=disable", + + "REGION": "", + "SERVER_SECRET": "secret", + "TRANSACTOR_URL": "ws://localhost:3333", + "ACCOUNTS_URL": "http://localhost:3000", + "FRONT_URL": "http://localhost:8080", + "MAIL_URL": "", + "MINIO_ACCESS_KEY": "minioadmin", + "MINIO_SECRET_KEY": "minioadmin", + "MINIO_ENDPOINT": "localhost", + "MODEL_VERSION": "v0.7.75", + "WS_OPERATION": "all+backup", + "BACKUP_STORAGE": "minio|minio?accessKey=minioadmin&secretKey=minioadmin", + "BACKUP_BUCKET": "dev-backups", + "INIT_REPO_DIR": "${workspaceRoot}/pods/workspace/init", + "INIT_WORKSPACE": "staging-dev", + "QUEUE_CONFIG": "huly.local:19092", + "QUEUE_REGION": "" + }, + "runtimeVersion": "20", + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "sourceMaps": true, + "outputCapture": "std", + "cwd": "${workspaceRoot}/pods/workspace", + "protocol": "inspector" + }, + { + "name": "Debug Workspace(cockroach)", + "type": "node", + "request": "launch", + "args": ["src/__start.ts"], + "env": { + // "DB_URL": "mongodb://localhost:27017", + // "DB_URL": "postgresql://postgres:example@localhost:5432", + "DB_URL": "postgresql://root@huly.local:26257/defaultdb?sslmode=disable", + "FULLTEXT_URL": "http://huly.local:4702", + "REGION": "cockroach", + "SERVER_SECRET": "secret", + "TRANSACTOR_URL": "ws://localhost:3332", + "ACCOUNTS_URL": "http://localhost:3000", + "FRONT_URL": "http://localhost:8080", + "MAIL_URL": "", + "STORAGE_CONFIG": "datalake|http://localhost:4030", + "MODEL_VERSION": "0.7.153", + "WS_OPERATION": "all+backup", + "BACKUP_STORAGE": "minio|minio?accessKey=minioadmin&secretKey=minioadmin", + "BACKUP_BUCKET": "dev-backups", + "QUEUE_CONFIG": "huly.local:19092" + // "INIT_REPO_DIR": "${workspaceRoot}/pods/workspace/init", + // "INIT_WORKSPACE": "staging-dev" + }, + "runtimeVersion": "20", + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "sourceMaps": true, + "outputCapture": "std", + "cwd": "${workspaceRoot}/pods/workspace", + "protocol": "inspector" + }, + { + "name": "Debug Front", + "type": "node", + "request": "launch", + "args": ["src/__start.ts"], + "env": { + "MONGO_URL": "mongodb://localhost:27017", + "METRICS_CONSOLE": "false", + "STORAGE_CONFIG": "minio|localhost?accessKey=minioadmin&secretKey=minioadmin", + "SERVER_SECRET": "secret", + "REKONI_URL": "http://localhost:4004", + "FRONT_URL": "http://localhost:8080", + "ACCOUNTS_URL": "http://localhost:3000", + "UPLOAD_URL": "/files", + "SERVER_PORT": "8087", + "COLLABORATOR_URL": "ws://localhost:3078", + "CALENDAR_URL": "http://localhost:8095", + "GMAIL_URL": "http://localhost:8088", + "TELEGRAM_URL": "http://localhost:8086", + "MODEL_VERSION": "", + "VERSION": "" + }, + "runtimeVersion": "20", + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "showAsyncStacks": true, + "sourceMaps": true, + "cwd": "${workspaceRoot}/pods/front", + "protocol": "inspector", + "outputCapture": "std" + }, + { + "name": "Debug Collaborator", + "type": "node", + "request": "launch", + "args": ["src/__start.ts"], + "env": { + "SECRET": "secret", + "METRICS_CONSOLE": "true", + "ACCOUNTS_URL": "http://localhost:3000", + "MONGO_URL": "mongodb://localhost:27017", + "STORAGE_CONFIG": "datalake|http://localhost:4030" + }, + "runtimeVersion": "20", + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "sourceMaps": true, + "cwd": "${workspaceRoot}/pods/collaborator", + "protocol": "inspector" + }, + { + "type": "node", + "request": "launch", + "name": "Debug Jest tests", + "program": "${fileDirname}/../../node_modules/@rushstack/heft/lib/start.js", + "cwd": "${fileDirname}/../../", + "args": ["--debug", "test", "--clean", "--test-path-pattern", "${file}"], + "console": "integratedTerminal", + "sourceMaps": true, + "protocol": "inspector" + }, + { + "name": "Debug generator", + "type": "node", + "request": "launch", + "args": ["src/index.ts", "gen-recruit", "ws1", "20"], + "env": { + "ACCOUNTS_URL": "ws://localhost:3000", + "MINIO_ACCESS_KEY": "minioadmin", + "MINIO_SECRET_KEY": "minioadmin", + "MINIO_ENDPOINT": "localhost" + }, + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "sourceMaps": true, + "cwd": "${workspaceRoot}/dev/generator", + "protocol": "inspector" + }, + { + "name": "Debug backup tool", + "type": "node", + "request": "launch", + "args": [ + "src/__start.ts", + "backup-restore", + "/Users/haiodo/Develop/private/platform/tests/sanity-ws", + "sanity-ws", + "--upgrade" + ], + "env": { + "MODEL_VERSION": "0.7.153", + "STORAGE_CONFIG": "datalake|http://huly.local:4030", + "ACCOUNTS_URL": "http://localhost:3003", + "TRANSACTOR_URL": "ws://localhost:3334", + "ACCOUNT_DB_URL": "postgresql://root@localhost:26258/defaultdb?sslmode=disable", + "MONGO_URL": "mongodb://localhost:27018", + "ELASTIC_URL": "http://localhost:9201", + "SERVER_SECRET": "secret", + "DB_URL": "postgresql://root@localhost:26258/defaultdb?sslmode=disable", + "QUEUE_CONFIG": "localhost:19093;-staging" + }, + "smartStep": false, + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "sourceMaps": true, + "sourceMapRenames": false, + "skipFiles": ["/**"], + "cwd": "${workspaceRoot}/dev/tool", + "protocol": "inspector", + "outputCapture": "std", + "runtimeVersion": "22", + "showAsyncStacks": true + }, + { + "name": "Debug tool upgrade", + "type": "node", + "request": "launch", + "args": ["src/__start.ts", "migrate-github-account", "--region", "cockroach", "--db", "%github"], + "env": { + "SERVER_SECRET": "secret", + "MINIO_ACCESS_KEY": "minioadmin", + "MINIO_SECRET_KEY": "minioadmin", + "MINIO_ENDPOINT": "localhost:9000", + "TRANSACTOR_URL": "ws://localhost:3333", + "MONGO_URL": "mongodb://localhost:27017", + "DB_URL": "mongodb://localhost:27017", + "ACCOUNTS_URL": "http://127.0.0.1:3000", + "ACCOUNT_DB_URL": "mongodb://localhost:27017", + "TELEGRAM_DATABASE": "telegram-service", + "REKONI_URL": "http://localhost:4004", + "MODEL_VERSION": "0.7.1" + }, + "runtimeVersion": "20", + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "sourceMaps": true, + "outputCapture": "std", + "cwd": "${workspaceRoot}/dev/tool" + }, + { + "name": "Debug tool upgrade PG(Cockroach)", + "type": "node", + "request": "launch", + "args": ["src/__start.ts", "upgrade-workspace", "platform"], + "env": { + "SERVER_SECRET": "secret", + "MINIO_ACCESS_KEY": "minioadmin", + "MINIO_SECRET_KEY": "minioadmin", + "MINIO_ENDPOINT": "localhost:9000", + "TRANSACTOR_URL": "ws://localhost:3332", + "ACCOUNTS_URL": "http://localhost:3000", + "ACCOUNT_DB_URL": "postgresql://root@huly.local:26257/defaultdb?sslmode=disable", + // "ACCOUNT_DB_URL": "postgresql://postgres:example@localhost:5433", + // "DB_URL": "postgresql://postgres:example@localhost:5433", + "DB_URL": "postgresql://root@huly.local:26257/defaultdb?sslmode=disable", + "MONGO_URL": "mongodb://localhost:27017", + "TELEGRAM_DATABASE": "telegram-service", + "REKONI_URL": "http://localhost:4004", + "MODEL_VERSION": "0.7.75" + }, + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "sourceMaps": true, + "outputCapture": "std", + "cwd": "${workspaceRoot}/dev/tool" + }, + { + "name": "Debug tool move", + "type": "node", + "request": "launch", + "args": ["src/__start.ts", "move-to-pg"], + "env": { + "SERVER_SECRET": "secret", + "MINIO_ACCESS_KEY": "minioadmin", + "MINIO_SECRET_KEY": "minioadmin", + "MINIO_ENDPOINT": "localhost", + "TRANSACTOR_URL": "ws://localhost:3333", + "MONGO_URL": "mongodb://localhost:27017", + "DB_URL": "postgresql://postgres:example@localhost:5432", + "ACCOUNTS_URL": "http://localhost:3000", + "TELEGRAM_DATABASE": "telegram-service", + "REKONI_URL": "http://localhost:4004" + }, + "runtimeVersion": "20", + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "sourceMaps": true, + "outputCapture": "std", + "cwd": "${workspaceRoot}/dev/tool" + }, + { + "name": "Debug backup", + "type": "node", + "request": "launch", + "args": ["src/index.ts"], + "env": { + "ACCOUNTS_URL": "http://localhost:3000", + "STORAGE": "minio|localhost?accessKey=minioadmin&secretKey=minioadmin", + "WORKSPACE_STORAGE": "minio|localhost?accessKey=minioadmin&secretKey=minioadmin", + "DB_URL": "postgresql://root@host.docker.internal:26257/defaultdb?sslmode=disable", + "MODEL_JSON": "${workspaceRoot}/models/all/bundle/model.json", + "SECRET": "secret", + "REGION": "cockroach", + "BUCKET_NAME": "backups", + "INTERVAL": "300" + }, + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "showAsyncStacks": true, + "sourceMaps": true, + "outputCapture": "std", + "cwd": "${workspaceRoot}/pods/backup", + "protocol": "inspector" + }, + { + "name": "Debug backup API", + "type": "node", + "request": "launch", + "args": ["src/index.ts"], + "env": { + "ACCOUNTS_URL": "http://localhost:3000", + "STORAGE": "minio|localhost?accessKey=minioadmin&secretKey=minioadmin", + "SECRET": "secret", + "BUCKET_NAME": "backups" + }, + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "showAsyncStacks": true, + "sourceMaps": true, + "outputCapture": "std", + "cwd": "${workspaceRoot}/services/backup/backup-api-pod", + "protocol": "inspector" + }, + { + "name": "Debug archive tool", + "type": "node", + "request": "launch", + "args": ["src/__start.ts", "archive-workspaces-mongo", "--timeout", "7", "--remove"], + "env": { + "ACCOUNTS_URL": "http://localhost:3000", + "STORAGE": "minio|localhost?accessKey=minioadmin&secretKey=minioadmin", + "WORKSPACE_STORAGE": "minio|localhost?accessKey=minioadmin&secretKey=minioadmin", + "MONGO_URL": "mongodb://localhost:27017", + "DB_URL": "mongodb://localhost:27017", + "SERVER_SECRET": "secret", + "SECRET": "secret", + "BUCKET_NAME": "backups" + }, + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "showAsyncStacks": true, + "sourceMaps": true, + "outputCapture": "std", + "cwd": "${workspaceRoot}/dev/tool", + "protocol": "inspector" + }, + { + "name": "Debug restore-all tool", + "type": "node", + "request": "launch", + "args": ["src/__start.ts", "restore-all"], + "env": { + "ACCOUNTS_URL": "http://localhost:3000", + "STORAGE": "minio|localhost?accessKey=minioadmin&secretKey=minioadmin", + // "DB_URL": "mongodb://localhost:27017", + "DB_URL": "postgresql://root@host.docker.internal:26258/defaultdb?sslmode=disable", + "SERVER_SECRET": "secret", + "BUCKET_NAME": "dev-backups" + }, + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "showAsyncStacks": true, + "sourceMaps": true, + "outputCapture": "std", + "cwd": "${workspaceRoot}/dev/tool", + "protocol": "inspector" + }, + { + "name": "Debug Github integration", + "type": "node", + "request": "launch", + "args": ["src/index.ts"], + "env": { + "SERVER_SECRET": "secret", + "ACCOUNTS_URL": "http://localhost:3000", + "APP_ID": "${env:POD_GITHUB_APPID}", + "CLIENT_ID": "${env:POD_GITHUB_CLIENTID}", + "CLIENT_SECRET": "${env:POD_GITHUB_CLIENT_SECRET}", + "PRIVATE_KEY": "${env:POD_GITHUB_PRIVATE_KEY}", + "COLLABORATOR_URL": "ws://huly.local:3078", + "STORAGE_CONFIG": "datalake|http://huly.local:4030", + "PLATFORM_OPERATION_LOGGING": "true", + "FRONT_URL": "http://localhost:8080", + "PORT": "3500", + "STATS_URL": "http://huly.local:4900", + "OTEL_EXPORTER_OTLP_ENDPOINT": "http://huly.local:4318/v1/traces" + }, + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "sourceMaps": true, + "cwd": "${workspaceRoot}/services/github/pod-github", + "protocol": "inspector", + "outputCapture": "std" + }, + { + "name": "Debug qms workers", + "type": "node", + "request": "launch", + "args": ["src/index.ts"], + "env": { + "ACCOUNTS_URL": "http://localhost:3000", + "SECRET": "secret", + "DOCS_RELEASE_INTERVAL": "10000", + "DOCS_IN_REVIEW_CHECK_INTERVAL": "10000", + "DOCS_REVIEW_PERIOD_IN_MONTHS": "1" + }, + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "showAsyncStacks": true, + "sourceMaps": true, + "cwd": "${workspaceRoot}/pods/workers" + }, + { + "name": "Debug doc import tool", + "type": "node", + "request": "launch", + "args": ["src/__start.ts", "import", "--spec", "toc.json", "docx", "ws", "person-owner"], + "env": { + "SERVER_SECRET": "secret", + "ACCOUNTS_URL": "http://localhost:3000", + "COLLABORATOR_URL": "ws://localhost:3078", + "STORAGE_CONFIG": "minio|localhost?accessKey=minioadmin&secretKey=minioadmin", + "MONGO_URL": "mongodb://localhost:27017" + }, + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "runtimeVersion": "20", + "showAsyncStacks": true, + "sourceMaps": true, + "cwd": "${workspaceRoot}/dev/doc-import-tool", + "protocol": "inspector" + }, + { + "name": "Debug process", + "type": "node", + "request": "launch", + "args": ["src/index.ts"], + "env": { + "SECRET": "secret", + "ACCOUNTS_URL": "http://localhost:3000", + "QUEUE_CONFIG": "localhost:19092", + "QUEUE_REGION": "cockroach", + "TEMPORAL_ADDRESS": "localhost:7233" + }, + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "runtimeVersion": "20", + "sourceMaps": true, + "cwd": "${workspaceRoot}/services/process" + }, + { + "name": "Debug print", + "type": "node", + "request": "launch", + "args": ["src/index.ts"], + "env": { + "PORT": "4005", + "SECRET": "secret", + "MONGO_URL": "mongodb://localhost:27017", + "STORAGE_CONFIG": "minio|localhost?accessKey=minioadmin&secretKey=minioadmin" + }, + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "runtimeVersion": "20", + "sourceMaps": true, + "cwd": "${workspaceRoot}/services/print/pod-print" + }, + { + "name": "Debug sign", + "type": "node", + "request": "launch", + "args": ["src/index.ts"], + "env": { + "PORT": "4006", + "SECRET": "secret", + "CERTIFICATE_PATH": "${workspaceRoot}/services/sign/pod-sign/debug/certificate.p12", + "MONGO_URL": "mongodb://localhost:27017", + "MINIO_ENDPOINT": "localhost", + "MINIO_ACCESS_KEY": "minioadmin", + "MINIO_SECRET_KEY": "minioadmin", + "SERVICE_ID": "sign-service", + "ACCOUNTS_URL": "http://localhost:3000", + "BRANDING_PATH": "${workspaceRoot}/services/sign/pod-sign/debug/branding.json" + }, + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "runtimeVersion": "20", + "sourceMaps": true, + "cwd": "${workspaceRoot}/services/sign/pod-sign" + }, + { + "name": "Debug rekoni", + "type": "node", + "request": "launch", + "args": ["src/index.ts"], + "env": { + "PORT": "4004", + "SERVICE_ID": "rekoni-service", + "SECRET": "secret" + }, + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "sourceMaps": true, + "cwd": "${workspaceRoot}/services/rekoni", + "protocol": "inspector" + }, + { + "name": "Debug analytics collector", + "type": "node", + "request": "launch", + "args": ["src/index.ts"], + "env": { + "PORT": "4017", + "SECRET": "secret", + "MONGO_URL": "mongodb://localhost:27017", + "MINIO_ENDPOINT": "localhost", + "MINIO_ACCESS_KEY": "minioadmin", + "MINIO_SECRET_KEY": "minioadmin", + "SERVER_SECRET": "secret", + "SERVICE_ID": "analytics-collector", + "ACCOUNTS_URL": "http://localhost:3000" + }, + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "runtimeVersion": "20", + "sourceMaps": true, + "showAsyncStacks": true, + "outputCapture": "std", + "cwd": "${workspaceRoot}/services/analytics-collector/pod-analytics-collector" + }, + { + "name": "Debug calendar", + "type": "node", + "request": "launch", + "args": ["src/index.ts"], + "env": { + "ACCOUNTS_URL": "http://localhost:3000", + "Credentials": "", + "KVS_URL": "http://localhost:8094", + "SECRET": "secret", + "WATCH_URL": "https://calendar.hc.engineering/push" + }, + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "runtimeVersion": "20", + "sourceMaps": true, + "showAsyncStacks": true, + "outputCapture": "std", + "cwd": "${workspaceRoot}/services/calendar/pod-calendar" + }, + { + "name": "Debug AI bot", + "type": "node", + "request": "launch", + "args": ["src/index.ts"], + "env": { + "ACCOUNTS_URL": "http://localhost:3000", + "MONGO_URL": "mongodb://localhost:27017", + "PORT": "4010", + "SERVER_SECRET": "secret", + "FIRST_NAME": "Jolie", + "LAST_NAME": "AI", + "PASSWORD": "password", + "AVATAR_PATH": "./assets/avatar.png", + "AVATAR_CONTENT_TYPE": ".png", + "STORAGE_CONFIG": "minio|localhost?accessKey=minioadmin&secretKey=minioadmin", + "LOVE_ENDPOINT": "http://localhost:8096" + }, + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "sourceMaps": true, + "runtimeVersion": "20", + "cwd": "${workspaceRoot}/services/ai-bot/pod-ai-bot", + "protocol": "inspector", + "outputCapture": "std" + }, + { + "name": "Debug telegram bot", + "type": "node", + "request": "launch", + "args": ["src/index.ts"], + "env": { + "PORT": "4020", + "BOT_TOKEN": "token", + "MONGO_URL": "mongodb://localhost:27017", + "MONGO_DB": "telegram-bot", + "SECRET": "secret", + "ACCOUNTS_URL": "http://huly.local:3000", + "SERVICE_ID": "telegram-bot-service", + "MINIO_ACCESS_KEY": "minioadmin", + "MINIO_SECRET_KEY": "minioadmin", + "MINIO_ENDPOINT": "localhost", + "QUEUE_CONFIG": "localhost:19092", + "QUEUE_REGION": "cockroach", + "DB_URL": "postgresql://root@huly.local:26257/defaultdb?sslmode=disable" + }, + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "runtimeVersion": "20", + "sourceMaps": true, + "cwd": "${workspaceRoot}/services/telegram-bot/pod-telegram-bot" + }, + { + "name": "Debug datalake", + "type": "node", + "request": "launch", + "args": ["src/index.ts"], + "env": { + "PORT": "4030", + "SECRET": "secret", + "DB_URL": "postgresql://root@localhost:26257/defaultdb?sslmode=disable", + "BUCKETS": "blobs,eu|http://localhost:9000?accessKey=minioadmin&secretKey=minioadmin", + "ACCOUNTS_URL": "http://localhost:3000", + "STATS_URL": "http://huly.local:4900", + "QUEUE_CONFIG": "localhost:19092" + }, + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "runtimeVersion": "20", + "sourceMaps": true, + "cwd": "${workspaceRoot}/services/datalake/pod-datalake" + }, + { + "name": "Debug media", + "type": "node", + "request": "launch", + "args": ["src/index.ts"], + "env": { + "ACCOUNTS_URL": "http://huly.local:3000", + "SECRET": "secret", + "REGION": "cockroach", + "QUEUE_CONFIG": "localhost:19092" + }, + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "runtimeVersion": "20", + "sourceMaps": true, + "cwd": "${workspaceRoot}/pods/media" + }, + { + "name": "Debug preview", + "type": "node", + "request": "launch", + "args": ["src/index.ts"], + "env": { + "ACCOUNTS_URL": "http://huly.local:3000", + "STORAGE_CONFIG": "datalake|http://huly.local:4030", + "SECRET": "secret", + "CACHE_PATH": "/tmp/preview" + }, + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "runtimeVersion": "20", + "sourceMaps": true, + "cwd": "${workspaceRoot}/pods/preview" + }, + { + "type": "chrome", + "name": "Attach to Browser", + "request": "attach", + "urlFilter": "http://localhost:8080/*", + "port": 9222, + "sourceMapPathOverrides": { + "webpack://*": "${workspaceFolder}/*" + } + }, + { + "name": "Debug Notion import", + "type": "node", + "request": "launch", + "args": [ + "src/__start.ts", + "import-notion-to-teamspace", + "/home/anna/work/notion/natalya/Export-fad9ecb4-a1a5-4623-920d-df32dd423743", + "-u", + "user1", + "-pw", + "1234", + "-ws", + "ws5", + "-ts", + "notion" + ], + // "args": ["src/__start.ts", "import-notion-with-teamspaces", "/home/anna/work/notion/natalya/Export-fad9ecb4-a1a5-4623-920d-df32dd423743", "-u", "user1", "-pw", "1234", "-ws", "ws1"], + "env": { + "FRONT_URL": "http://localhost:8087" + }, + "runtimeVersion": "20", + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "sourceMaps": true, + "outputCapture": "std", + "cwd": "${workspaceRoot}/dev/import-tool" + }, + { + "name": "Debug ClickUp import", + "type": "node", + "request": "launch", + "args": [ + "src/__start.ts", + "import-clickup-tasks", + "/home/anna/work/clickup/aleksandr/debug/mentions.csv", + "-u", + "user1", + "-pw", + "1234", + "-ws", + "ws10" + ], + "env": { + "FRONT_URL": "http://localhost:8087" + }, + "runtimeVersion": "20", + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "sourceMaps": true, + "outputCapture": "std", + "cwd": "${workspaceRoot}/dev/import-tool" + }, + { + "name": "Debug Huly import", + "type": "node", + "request": "launch", + "args": [ + "src/__start.ts", + "import", + "/home/anna/huly/platform/dev/import-tool/docs/huly/example-workspace", + "-u", + "user1", + "-pw", + "1234", + "-ws", + "ws1" + ], + "env": { + "FRONT_URL": "http://localhost:8087" + }, + "runtimeVersion": "20", + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "sourceMaps": true, + "outputCapture": "std", + "cwd": "${workspaceRoot}/dev/import-tool" + }, + { + "name": "Debug Export service", + "type": "node", + "request": "launch", + "args": ["src/index.ts"], + "env": { + "PORT": "4009", + "SECRET": "secret", + "ACCOUNTS_URL": "http://localhost:3000", + "STORAGE_CONFIG": "datalake|http://huly.local:4030", + "TRANSACTOR_URL": "ws://localhost:3333", + "SERVICE_ID": "export-service" + }, + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "sourceMaps": true, + "cwd": "${workspaceRoot}/services/export/pod-export" + }, + { + "name": "Msg2File", + "type": "node", + "request": "launch", + "args": ["src/index.ts"], + "env": { + "ACCOUNTS_URL": "http://localhost:3000", + "DB_URL": "postgresql://root@localhost:26257/defaultdb?sslmode=disable", + "PORT": "9087", + "SECRET": "secret", + "SERVICE_ID": "msg2file-service", + "STORAGE_CONFIG": "datalake|http://huly.local:4030" + }, + "runtimeVersion": "20", + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "sourceMaps": true, + "outputCapture": "std", + "cwd": "${workspaceRoot}/services/msg2file" + } + ] +} From fbefda75c2f06000389ed446e1c9f0fa32f0a834 Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Mon, 8 Sep 2025 17:54:19 +0700 Subject: [PATCH 03/40] Bump versions using Rush.js --- packages/platform-rig/package.json | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/platform-rig/package.json b/packages/platform-rig/package.json index 39daeb5994..d1e74afc50 100644 --- a/packages/platform-rig/package.json +++ b/packages/platform-rig/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/platform-rig", - "version": "0.7.0", + "version": "0.7.1", "scripts": { "build": "echo 'Not required'", "format": "echo 'Not required'" @@ -9,14 +9,13 @@ "./bin/*": "./bin/*", "./profiles/*": "./profiles/*" }, - "devDependencies": { + "devDependencies": {}, + "dependencies": { "eslint-config-standard-with-typescript": "^40.0.0", "svelte-eslint-parser": "^0.33.1", "esbuild": "^0.24.2", "esbuild-svelte": "^0.9.0", - "esbuild-plugin-copy": "~2.1.1" - }, - "dependencies": { + "esbuild-plugin-copy": "~2.1.1", "typescript": "^5.8.3" }, "bin": { From 661e51e7f40c66055008f6293a800c276e001dfe Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Mon, 8 Sep 2025 17:55:20 +0700 Subject: [PATCH 04/40] Fix compile --- common/config/rush/pnpm-lock.yaml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 4b24acd963..cc548ad65b 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -148,10 +148,6 @@ importers: ../../packages/platform-rig: dependencies: - typescript: - specifier: ^5.8.3 - version: 5.9.2 - devDependencies: esbuild: specifier: ^0.24.2 version: 0.24.2 @@ -167,6 +163,9 @@ importers: svelte-eslint-parser: specifier: ^0.33.1 version: 0.33.1 + typescript: + specifier: ^5.8.3 + version: 5.9.2 ../../packages/postgres-base: dependencies: From 0790143bfd164a9e3ab13d9439b36723ac0c7d6a Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Mon, 8 Sep 2025 18:31:20 +0700 Subject: [PATCH 05/40] Fix use of peer deps --- packages/platform-rig/package.json | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/platform-rig/package.json b/packages/platform-rig/package.json index d1e74afc50..8974e7d400 100644 --- a/packages/platform-rig/package.json +++ b/packages/platform-rig/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/platform-rig", - "version": "0.7.1", + "version": "0.7.2", "scripts": { "build": "echo 'Not required'", "format": "echo 'Not required'" @@ -9,8 +9,7 @@ "./bin/*": "./bin/*", "./profiles/*": "./profiles/*" }, - "devDependencies": {}, - "dependencies": { + "devDependencies": { "eslint-config-standard-with-typescript": "^40.0.0", "svelte-eslint-parser": "^0.33.1", "esbuild": "^0.24.2", @@ -18,6 +17,7 @@ "esbuild-plugin-copy": "~2.1.1", "typescript": "^5.8.3" }, + "dependencies": {}, "bin": { "format": "./bin/format.js", "compile": "./bin/compile.js", @@ -25,8 +25,11 @@ "bump-package-version": "./bin/bump-package-version.js" }, "peerDependencies": { - "@typescript-eslint/parser": "^6.11.0", - "eslint": "^8.54.0" + "@typescript-eslint/parser": ">=6.0 <10", + "eslint": ">=8 <10", + "typescript": ">=4.3 <6", + "prettier": ">=2.0 <4", + "esbuild": ">=0.14 <1" }, "publishConfig": { "access": "public" From 00ba3f0e02a3e66f3d6fc05a18714139e513ff16 Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Mon, 8 Sep 2025 19:12:26 +0700 Subject: [PATCH 06/40] Fixes --- common/config/rush/pnpm-lock.yaml | 293 +++++++++----------- packages/measurements-otlp/src/telemetry.ts | 2 +- packages/platform-rig/bin/format.js | 85 +++--- packages/platform-rig/package.json | 26 +- rush.json | 2 +- 5 files changed, 187 insertions(+), 221 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index cc548ad65b..0a9e016d67 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -149,20 +149,15 @@ importers: ../../packages/platform-rig: dependencies: esbuild: - specifier: ^0.24.2 - version: 0.24.2 + specifier: ^0.25.9 + version: 0.25.9 esbuild-plugin-copy: - specifier: ~2.1.1 - version: 2.1.1(esbuild@0.24.2) + specifier: ^2.1.1 + version: 2.1.1(esbuild@0.25.9) esbuild-svelte: - specifier: ^0.9.0 - version: 0.9.3(esbuild@0.24.2) - eslint-config-standard-with-typescript: - specifier: ^40.0.0 - version: 40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.2) - svelte-eslint-parser: - specifier: ^0.33.1 - version: 0.33.1 + specifier: ^0.9.3 + version: 0.9.3(esbuild@0.25.9) + devDependencies: typescript: specifier: ^5.8.3 version: 5.9.2 @@ -383,152 +378,158 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@esbuild/aix-ppc64@0.24.2': - resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} + '@esbuild/aix-ppc64@0.25.9': + resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.24.2': - resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} + '@esbuild/android-arm64@0.25.9': + resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.24.2': - resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} + '@esbuild/android-arm@0.25.9': + resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.24.2': - resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} + '@esbuild/android-x64@0.25.9': + resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.24.2': - resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} + '@esbuild/darwin-arm64@0.25.9': + resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.24.2': - resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} + '@esbuild/darwin-x64@0.25.9': + resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.24.2': - resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} + '@esbuild/freebsd-arm64@0.25.9': + resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.24.2': - resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} + '@esbuild/freebsd-x64@0.25.9': + resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.24.2': - resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} + '@esbuild/linux-arm64@0.25.9': + resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.24.2': - resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} + '@esbuild/linux-arm@0.25.9': + resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.24.2': - resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} + '@esbuild/linux-ia32@0.25.9': + resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.24.2': - resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} + '@esbuild/linux-loong64@0.25.9': + resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.24.2': - resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} + '@esbuild/linux-mips64el@0.25.9': + resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.24.2': - resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} + '@esbuild/linux-ppc64@0.25.9': + resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.24.2': - resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} + '@esbuild/linux-riscv64@0.25.9': + resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.24.2': - resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} + '@esbuild/linux-s390x@0.25.9': + resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.24.2': - resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} + '@esbuild/linux-x64@0.25.9': + resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.24.2': - resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} + '@esbuild/netbsd-arm64@0.25.9': + resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.24.2': - resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} + '@esbuild/netbsd-x64@0.25.9': + resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.24.2': - resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} + '@esbuild/openbsd-arm64@0.25.9': + resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.24.2': - resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} + '@esbuild/openbsd-x64@0.25.9': + resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.24.2': - resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} + '@esbuild/openharmony-arm64@0.25.9': + resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.9': + resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.24.2': - resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} + '@esbuild/win32-arm64@0.25.9': + resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.24.2': - resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} + '@esbuild/win32-ia32@0.25.9': + resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.24.2': - resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} + '@esbuild/win32-x64@0.25.9': + resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -1697,8 +1698,8 @@ packages: esbuild: '>=0.17.0' svelte: '>=4.2.1 <6' - esbuild@0.24.2: - resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} + esbuild@0.25.9: + resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} engines: {node: '>=18'} hasBin: true @@ -2472,11 +2473,6 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -2622,16 +2618,6 @@ packages: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} - postcss-scss@4.0.9: - resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.4.29 - - postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} - engines: {node: ^10 || ^12 || >=14} - postgres-array@2.0.0: resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} engines: {node: '>=4'} @@ -2815,10 +2801,6 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} - source-map-support@0.5.13: resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} @@ -2889,15 +2871,6 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - svelte-eslint-parser@0.33.1: - resolution: {integrity: sha512-vo7xPGTlKBGdLH8T5L64FipvTrqv3OQRx9d2z5X05KKZDlF4rQk8KViZO4flKERY+5BiVdOh7zZ7JGJWo5P0uA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - svelte: ^3.37.0 || ^4.0.0 - peerDependenciesMeta: - svelte: - optional: true - test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} @@ -3287,79 +3260,82 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} - '@esbuild/aix-ppc64@0.24.2': + '@esbuild/aix-ppc64@0.25.9': optional: true - '@esbuild/android-arm64@0.24.2': + '@esbuild/android-arm64@0.25.9': optional: true - '@esbuild/android-arm@0.24.2': + '@esbuild/android-arm@0.25.9': optional: true - '@esbuild/android-x64@0.24.2': + '@esbuild/android-x64@0.25.9': optional: true - '@esbuild/darwin-arm64@0.24.2': + '@esbuild/darwin-arm64@0.25.9': optional: true - '@esbuild/darwin-x64@0.24.2': + '@esbuild/darwin-x64@0.25.9': optional: true - '@esbuild/freebsd-arm64@0.24.2': + '@esbuild/freebsd-arm64@0.25.9': optional: true - '@esbuild/freebsd-x64@0.24.2': + '@esbuild/freebsd-x64@0.25.9': optional: true - '@esbuild/linux-arm64@0.24.2': + '@esbuild/linux-arm64@0.25.9': optional: true - '@esbuild/linux-arm@0.24.2': + '@esbuild/linux-arm@0.25.9': optional: true - '@esbuild/linux-ia32@0.24.2': + '@esbuild/linux-ia32@0.25.9': optional: true - '@esbuild/linux-loong64@0.24.2': + '@esbuild/linux-loong64@0.25.9': optional: true - '@esbuild/linux-mips64el@0.24.2': + '@esbuild/linux-mips64el@0.25.9': optional: true - '@esbuild/linux-ppc64@0.24.2': + '@esbuild/linux-ppc64@0.25.9': optional: true - '@esbuild/linux-riscv64@0.24.2': + '@esbuild/linux-riscv64@0.25.9': optional: true - '@esbuild/linux-s390x@0.24.2': + '@esbuild/linux-s390x@0.25.9': optional: true - '@esbuild/linux-x64@0.24.2': + '@esbuild/linux-x64@0.25.9': optional: true - '@esbuild/netbsd-arm64@0.24.2': + '@esbuild/netbsd-arm64@0.25.9': optional: true - '@esbuild/netbsd-x64@0.24.2': + '@esbuild/netbsd-x64@0.25.9': optional: true - '@esbuild/openbsd-arm64@0.24.2': + '@esbuild/openbsd-arm64@0.25.9': optional: true - '@esbuild/openbsd-x64@0.24.2': + '@esbuild/openbsd-x64@0.25.9': optional: true - '@esbuild/sunos-x64@0.24.2': + '@esbuild/openharmony-arm64@0.25.9': optional: true - '@esbuild/win32-arm64@0.24.2': + '@esbuild/sunos-x64@0.25.9': optional: true - '@esbuild/win32-ia32@0.24.2': + '@esbuild/win32-arm64@0.25.9': optional: true - '@esbuild/win32-x64@0.24.2': + '@esbuild/win32-ia32@0.25.9': + optional: true + + '@esbuild/win32-x64@0.25.9': optional: true '@eslint-community/eslint-utils@4.9.0(eslint@8.57.1)': @@ -4982,46 +4958,47 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - esbuild-plugin-copy@2.1.1(esbuild@0.24.2): + esbuild-plugin-copy@2.1.1(esbuild@0.25.9): dependencies: chalk: 4.1.2 chokidar: 3.6.0 - esbuild: 0.24.2 + esbuild: 0.25.9 fs-extra: 10.1.0 globby: 11.1.0 - esbuild-svelte@0.9.3(esbuild@0.24.2): + esbuild-svelte@0.9.3(esbuild@0.25.9): dependencies: '@jridgewell/trace-mapping': 0.3.30 - esbuild: 0.24.2 + esbuild: 0.25.9 - esbuild@0.24.2: + esbuild@0.25.9: 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 + '@esbuild/aix-ppc64': 0.25.9 + '@esbuild/android-arm': 0.25.9 + '@esbuild/android-arm64': 0.25.9 + '@esbuild/android-x64': 0.25.9 + '@esbuild/darwin-arm64': 0.25.9 + '@esbuild/darwin-x64': 0.25.9 + '@esbuild/freebsd-arm64': 0.25.9 + '@esbuild/freebsd-x64': 0.25.9 + '@esbuild/linux-arm': 0.25.9 + '@esbuild/linux-arm64': 0.25.9 + '@esbuild/linux-ia32': 0.25.9 + '@esbuild/linux-loong64': 0.25.9 + '@esbuild/linux-mips64el': 0.25.9 + '@esbuild/linux-ppc64': 0.25.9 + '@esbuild/linux-riscv64': 0.25.9 + '@esbuild/linux-s390x': 0.25.9 + '@esbuild/linux-x64': 0.25.9 + '@esbuild/netbsd-arm64': 0.25.9 + '@esbuild/netbsd-x64': 0.25.9 + '@esbuild/openbsd-arm64': 0.25.9 + '@esbuild/openbsd-x64': 0.25.9 + '@esbuild/openharmony-arm64': 0.25.9 + '@esbuild/sunos-x64': 0.25.9 + '@esbuild/win32-arm64': 0.25.9 + '@esbuild/win32-ia32': 0.25.9 + '@esbuild/win32-x64': 0.25.9 escalade@3.2.0: {} @@ -6045,8 +6022,6 @@ snapshots: ms@2.1.3: {} - nanoid@3.3.11: {} - natural-compare@1.4.0: {} neo-async@2.6.2: {} @@ -6184,16 +6159,6 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss-scss@4.0.9(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - - postcss@8.5.6: - dependencies: - nanoid: 3.3.11 - picocolors: 1.1.1 - source-map-js: 1.2.1 - postgres-array@2.0.0: {} postgres-bytea@1.0.0: {} @@ -6395,8 +6360,6 @@ snapshots: slash@3.0.0: {} - source-map-js@1.2.1: {} - source-map-support@0.5.13: dependencies: buffer-from: 1.1.2 @@ -6471,14 +6434,6 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte-eslint-parser@0.33.1: - dependencies: - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - postcss: 8.5.6 - postcss-scss: 4.0.9(postcss@8.5.6) - test-exclude@6.0.0: dependencies: '@istanbuljs/schema': 0.1.3 diff --git a/packages/measurements-otlp/src/telemetry.ts b/packages/measurements-otlp/src/telemetry.ts index ec170c0162..bf35a7c4cf 100644 --- a/packages/measurements-otlp/src/telemetry.ts +++ b/packages/measurements-otlp/src/telemetry.ts @@ -138,7 +138,7 @@ export class OpenTelemetryMetricsContext implements MeasureContext { let _span: Span | undefined let childContext: Context | undefined if (opt?.span === true || opt?.span === 'inherit') { - childContext = opt?.span === 'inherit' ? context.active() : this.context ?? context.active() + childContext = opt?.span === 'inherit' ? context.active() : (this.context ?? context.active()) if (opt.meta !== undefined && Object.keys(opt.meta).length > 0) { // We need to set meta params diff --git a/packages/platform-rig/bin/format.js b/packages/platform-rig/bin/format.js index 2bd7894f0f..26f4510b68 100755 --- a/packages/platform-rig/bin/format.js +++ b/packages/platform-rig/bin/format.js @@ -1,15 +1,25 @@ -const { join, dirname, relative, extname, basename } = require("path") -const { readFileSync, writeFileSync, existsSync, readdirSync, lstatSync, copyFileSync, mkdirSync, rmSync, current } = require('fs') +const { join, dirname, relative, extname, basename } = require('path') +const { + readFileSync, + writeFileSync, + existsSync, + readdirSync, + lstatSync, + copyFileSync, + mkdirSync, + rmSync, + current +} = require('fs') const { spawnSync, execSync } = require('child_process') const crypto = require('crypto') -if(!existsSync('.format')) { +if (!existsSync('.format')) { mkdirSync('.format', { recursive: true }) } let hash = {} -if( existsSync('.format/format.json') ) { +if (existsSync('.format/format.json')) { hash = JSON.parse(readFileSync('.format/format.json').toString()) } @@ -20,16 +30,16 @@ let newHash = {} function calcFileHash(sourceFile, msg, addCheck) { const hasher = crypto.createHash('md5') - hasher.update(readFileSync(sourceFile)) + hasher.update(readFileSync(sourceFile)) let digest = hasher.digest('hex') - if( hash[sourceFile] !== digest ) { - if( addCheck ){ + if (hash[sourceFile] !== digest) { + if (addCheck) { filesToCheck.push(sourceFile) } console.log(msg, relative(process.cwd(), sourceFile)) } newHash[sourceFile] = digest - if( addCheck ) { + if (addCheck) { allFiles.push(sourceFile) } } @@ -37,16 +47,16 @@ function calcFileHash(sourceFile, msg, addCheck) { function calcHash(source, msg, addCheck) { const files = readdirSync(source) for (const f of files) { - const sourceFile = join(source, f) - + const sourceFile = join(source, f) + if (lstatSync(sourceFile).isDirectory()) { calcHash(sourceFile, msg, addCheck) } else { let ext = basename(sourceFile) - if( !ext.endsWith('.ts') && !ext.endsWith('.js') && !ext.endsWith('.svelte')) { + if (!ext.endsWith('.ts') && !ext.endsWith('.js') && !ext.endsWith('.svelte')) { continue } - if( sourceFile.endsWith('.d.ts') ) { + if (sourceFile.endsWith('.d.ts')) { // Skip declaration files continue } @@ -55,81 +65,81 @@ function calcHash(source, msg, addCheck) { } } -for( const v of process.argv.slice(2)) { - if( existsSync(v) ) { - console.info('checking:', join( process.cwd(), v) ) +for (const v of process.argv.slice(2)) { + if (existsSync(v)) { + console.info('checking:', join(process.cwd(), v)) calcHash(join(process.cwd(), v), 'changed', true) } } // Add package.json, .eslintrc.js and node_modules/@hcengineering/platform-rig/ as hash roots. -for( const f of ['package.json', '.eslintrc.js']) { +for (const f of ['package.json', '.eslintrc.js']) { const fFile = join(process.cwd(), f) - if( existsSync(fFile) ) { + if (existsSync(fFile)) { calcFileHash(fFile, 'changed', false) } } const rigPackage = 'node_modules/@hcengineering/platform-rig/' -if( existsSync(rigPackage) ) { +if (existsSync(rigPackage)) { calcHash(join(process.cwd(), rigPackage), 'changed', false) } -if( process.argv.includes('-f') || process.argv.includes('--force')) { +if (process.argv.includes('-f') || process.argv.includes('--force')) { console.log('force checking') filesToCheck = allFiles } - -if( filesToCheck.length > 0 ) { +if (filesToCheck.length > 0) { console.info(`running prettier ${filesToCheck.length}`) // Changes detected. - const prettier = spawnSync(join(process.cwd(), 'node_modules/.bin/prettier'), ["--color", "--write", ...filesToCheck],) - if( prettier.stdout != null) { + const prettier = spawnSync(join(process.cwd(), 'node_modules/.bin/prettier'), ['--color', '--write', ...filesToCheck]) + if (prettier.stdout != null) { writeFileSync('.format/prettier.log', prettier.stdout) - if( prettier.status === null || prettier.status === 0) { + if (prettier.status === null || prettier.status === 0) { console.info(prettier.stdout.toString()) } else { console.error(prettier.stdout.toString()) } } - if( prettier.stderr != null) { + if (prettier.stderr != null) { writeFileSync('.format/prettier.err', prettier.stderr) const data = prettier.stderr.toString() - if( data.length > 0) { + if (data.length > 0) { console.error(data) } } console.log(`running eslint ${filesToCheck.length}`) - const eslint = spawnSync(join(process.cwd(), 'node_modules/.bin/eslint'), ["--color", "--fix", ...filesToCheck], { - env: {...process.env, NODE_ENV: '--max-old-space-size=4096' }, + const eslint = spawnSync(join(process.cwd(), 'node_modules/.bin/eslint'), ['--color', '--fix', ...filesToCheck], { + env: { ...process.env, NODE_ENV: '--max-old-space-size=4096' } }) - if(eslint.stdout != null) { + if (eslint.stdout != null) { writeFileSync('.format/eslint.log', eslint.stdout) - if( prettier.status === null || prettier.status === 0) { + if (prettier.status === null || prettier.status === 0) { console.info(eslint.stdout.toString()) } else { console.error(eslint.stdout.toString()) } } - if( eslint.stderr != null) { + if (eslint.stderr != null) { writeFileSync('.format/eslint.err', eslint.stderr) const data = eslint.stderr.toString() - if( data.length > 0) { + if (data.length > 0) { console.error(data) } } - if( prettier.status || eslint.status) { - console.info('prettier and eslint failed', prettier.status, eslint.status) + console.log(eslint.error, prettier.error) + if (prettier.status || eslint.status || eslint.error || prettier.error) { + console.info('prettier or eslint failed', prettier.status, eslint.status, prettier.error, eslint.error) // Make file empty, to prevent false passing if called without -f or --force. - writeFileSync('.format/format.json', JSON.stringify({}, undefined, 2)) + writeFileSync('.format/format.json', JSON.stringify({}, undefined, 2)) process.exit(1) } hash = newHash - for( const v of process.argv.slice(2)) { - if( existsSync(v) ) { + for (const v of process.argv.slice(2)) { + if (existsSync(v)) { calcHash(join(process.cwd(), v), 'updated') } } @@ -139,4 +149,3 @@ if( filesToCheck.length > 0 ) { } process.exit(0) - diff --git a/packages/platform-rig/package.json b/packages/platform-rig/package.json index 8974e7d400..9384b19c1e 100644 --- a/packages/platform-rig/package.json +++ b/packages/platform-rig/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/platform-rig", - "version": "0.7.2", + "version": "0.7.3", "scripts": { "build": "echo 'Not required'", "format": "echo 'Not required'" @@ -10,14 +10,13 @@ "./profiles/*": "./profiles/*" }, "devDependencies": { - "eslint-config-standard-with-typescript": "^40.0.0", - "svelte-eslint-parser": "^0.33.1", - "esbuild": "^0.24.2", - "esbuild-svelte": "^0.9.0", - "esbuild-plugin-copy": "~2.1.1", "typescript": "^5.8.3" }, - "dependencies": {}, + "dependencies": { + "esbuild": "^0.25.9", + "esbuild-svelte": "^0.9.3", + "esbuild-plugin-copy": "^2.1.1" + }, "bin": { "format": "./bin/format.js", "compile": "./bin/compile.js", @@ -25,11 +24,14 @@ "bump-package-version": "./bin/bump-package-version.js" }, "peerDependencies": { - "@typescript-eslint/parser": ">=6.0 <10", - "eslint": ">=8 <10", - "typescript": ">=4.3 <6", - "prettier": ">=2.0 <4", - "esbuild": ">=0.14 <1" + "@typescript-eslint/eslint-plugin": "^6.11.0", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-n": "^15.4.0", + "eslint": "^8.54.0", + "@typescript-eslint/parser": "^6.11.0", + "eslint-config-standard-with-typescript": "^40.0.0", + "prettier": "^3.0.0" }, "publishConfig": { "access": "public" diff --git a/rush.json b/rush.json index a8402c4dbf..d5e9570649 100644 --- a/rush.json +++ b/rush.json @@ -42,7 +42,7 @@ * LTS schedule: https://nodejs.org/en/about/releases/ * LTS versions: https://nodejs.org/en/download/releases/ */ - "nodeSupportedVersionRange": ">=18.20.3 <19.0.0 || >=20.14.0 <23.0.0", + "nodeSupportedVersionRange": ">=18.20.3 <19.0.0 || >=20.14.0 <25.0.0", /** * If the version check above fails, Rush will display a message showing the current From 84b91b62b1f58ae4368869af652227a8c000cda0 Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Mon, 8 Sep 2025 19:19:03 +0700 Subject: [PATCH 07/40] Remove esbuild-svelte --- common/config/rush/pnpm-lock.yaml | 15 --------------- packages/platform-rig/package.json | 3 +-- 2 files changed, 1 insertion(+), 17 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 0a9e016d67..1851f43f44 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -154,9 +154,6 @@ importers: esbuild-plugin-copy: specifier: ^2.1.1 version: 2.1.1(esbuild@0.25.9) - esbuild-svelte: - specifier: ^0.9.3 - version: 0.9.3(esbuild@0.25.9) devDependencies: typescript: specifier: ^5.8.3 @@ -1691,13 +1688,6 @@ packages: peerDependencies: esbuild: '>= 0.14.0' - esbuild-svelte@0.9.3: - resolution: {integrity: sha512-CgEcGY1r/d16+aggec3czoFBEBaYIrFOnMxpsO6fWNaNEqHregPN5DLAPZDqrL7rXDNplW+WMu8s3GMq9FqgJA==} - engines: {node: '>=18'} - peerDependencies: - esbuild: '>=0.17.0' - svelte: '>=4.2.1 <6' - esbuild@0.25.9: resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} engines: {node: '>=18'} @@ -4966,11 +4956,6 @@ snapshots: fs-extra: 10.1.0 globby: 11.1.0 - esbuild-svelte@0.9.3(esbuild@0.25.9): - dependencies: - '@jridgewell/trace-mapping': 0.3.30 - esbuild: 0.25.9 - esbuild@0.25.9: optionalDependencies: '@esbuild/aix-ppc64': 0.25.9 diff --git a/packages/platform-rig/package.json b/packages/platform-rig/package.json index 9384b19c1e..90c9ac6f1c 100644 --- a/packages/platform-rig/package.json +++ b/packages/platform-rig/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/platform-rig", - "version": "0.7.3", + "version": "0.7.4", "scripts": { "build": "echo 'Not required'", "format": "echo 'Not required'" @@ -14,7 +14,6 @@ }, "dependencies": { "esbuild": "^0.25.9", - "esbuild-svelte": "^0.9.3", "esbuild-plugin-copy": "^2.1.1" }, "bin": { From 69e71354c4d9862de0c49ef4bbe393cc02b43972 Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Wed, 1 Oct 2025 10:11:38 +0700 Subject: [PATCH 08/40] Bump version to 0.7.5 --- common/config/rush/pnpm-lock.yaml | 8 +- common/scripts/bump-changes-from-tag.sh | 411 ++++++++++++++++++++++++ packages/measurements-otlp/.npmignore | 6 +- packages/measurements-otlp/package.json | 22 +- packages/measurements/.npmignore | 6 +- packages/measurements/package.json | 11 +- packages/platform-rig/package.json | 2 +- packages/postgres-base/.npmignore | 6 +- packages/postgres-base/package.json | 22 +- 9 files changed, 476 insertions(+), 18 deletions(-) create mode 100755 common/scripts/bump-changes-from-tag.sh diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 1851f43f44..581a00f618 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -13,7 +13,7 @@ importers: ../../packages/measurements: devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.0 + specifier: workspace:^0.7.5 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 @@ -58,7 +58,7 @@ importers: ../../packages/measurements-otlp: dependencies: '@hcengineering/measurements': - specifier: workspace:^0.7.0 + specifier: workspace:^0.7.5 version: link:../measurements '@opentelemetry/api': specifier: ^1.9.0 @@ -104,7 +104,7 @@ importers: version: 2.1.0(@opentelemetry/api@1.9.0) devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.0 + specifier: workspace:^0.7.5 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 @@ -166,7 +166,7 @@ importers: version: 3.4.7 devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.0 + specifier: workspace:^0.7.5 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 diff --git a/common/scripts/bump-changes-from-tag.sh b/common/scripts/bump-changes-from-tag.sh new file mode 100755 index 0000000000..b8b1c92127 --- /dev/null +++ b/common/scripts/bump-changes-from-tag.sh @@ -0,0 +1,411 @@ +#!/usr/bin/env bash + +# Script to bump version of ALL Node.js packages by incrementing from previous tag +# and update dependencies accordingly in a Rush.js monorepo +# +# Usage: ./bump-changes-from-tag.sh [git-revision] [major|minor|patch] +# Example: ./bump-changes-from-tag.sh # Auto-detect latest v*.*.* tag, patch bump +# Example: ./bump-changes-from-tag.sh patch # Auto-detect latest tag + patch bump +# Example: ./bump-changes-from-tag.sh minor # Auto-detect latest tag + minor bump +# Example: ./bump-changes-from-tag.sh v0.7.0 major # Use specific tag + major bump + +set -e + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Function to print colored output +print_info() { + echo -e "${BLUE}[INFO]${NC} $1" +} + +print_success() { + echo -e "${GREEN}[SUCCESS]${NC} $1" +} + +print_warning() { + echo -e "${YELLOW}[WARNING]${NC} $1" +} + +print_error() { + echo -e "${RED}[ERROR]${NC} $1" +} + +# Function to get the latest tag matching pattern v*.*.* (e.g., v0.7.x) +get_latest_version_tag() { + local latest_tag + # Get all tags matching v*.*.* pattern, sort them by version, and pick the latest + latest_tag=$(git tag -l 'v*.*.*' | sort -V | tail -n 1) + + if [ -z "$latest_tag" ]; then + print_warning "No version tags found matching v*.*.* pattern" + return 1 + fi + + echo "$latest_tag" +} + +# Check if git revision is provided +if [ -z "$1" ]; then + # No arguments provided - auto-detect tag and use patch + print_info "No git revision provided, attempting to auto-detect latest version tag..." + GIT_REVISION=$(get_latest_version_tag) + + if [ -z "$GIT_REVISION" ]; then + print_error "Could not auto-detect latest version tag" + print_error "" + print_error "Usage: $0 [git-revision] [major|minor|patch]" + print_error "Example: $0 # Auto-detect latest v*.*.* tag, patch bump" + print_error "Example: $0 patch # Auto-detect latest tag + patch bump" + print_error "Example: $0 minor # Auto-detect latest tag + minor bump" + print_error "Example: $0 HEAD~5" + print_error "Example: $0 HEAD~5 minor" + print_error "Example: $0 v0.7.0 major" + exit 1 + fi + + print_success "Auto-detected latest version tag: $GIT_REVISION" + BUMP_TYPE="patch" +elif [ "$1" = "major" ] || [ "$1" = "minor" ] || [ "$1" = "patch" ]; then + # First argument is bump type - auto-detect tag + print_info "Bump type '$1' provided, attempting to auto-detect latest version tag..." + GIT_REVISION=$(get_latest_version_tag) + + if [ -z "$GIT_REVISION" ]; then + print_error "Could not auto-detect latest version tag" + exit 1 + fi + + print_success "Auto-detected latest version tag: $GIT_REVISION" + BUMP_TYPE="$1" +else + # First argument is git revision + GIT_REVISION="$1" + BUMP_TYPE="${2:-patch}" # Default to patch if not specified +fi +REPO_ROOT=$(git rev-parse --show-toplevel) +RUSH_JSON="${REPO_ROOT}/rush.json" + +# Validate bump type +case "$BUMP_TYPE" in + major|minor|patch) + ;; + *) + print_error "Invalid bump type: $BUMP_TYPE" + print_error "Valid options are: major, minor, patch" + exit 1 + ;; +esac + +# Verify we're in a git repository +if [ ! -d ".git" ] && [ ! -f ".git" ]; then + print_error "Not in a git repository" + exit 1 +fi + +# Verify rush.json exists +if [ ! -f "$RUSH_JSON" ]; then + print_error "rush.json not found at $RUSH_JSON" + exit 1 +fi + +print_info "Repository root: $REPO_ROOT" +print_info "Reference tag: $GIT_REVISION" +print_info "Bump type: $BUMP_TYPE" + +# Function to get version from previous tag +get_tag_version() { + local tag="$1" + # Remove 'v' prefix if present + local version="${tag#v}" + echo "$version" +} + +# Function to increment version based on bump type +increment_version() { + local version="$1" + local bump_type="$2" + + # Remove any pre-release suffix first + local base_version="${version%%-*}" + local suffix="" + if [[ "$version" != "$base_version" ]]; then + suffix="-${version#*-}" + fi + + # Extract major.minor.patch + local major=$(echo "$base_version" | cut -d'.' -f1) + local minor=$(echo "$base_version" | cut -d'.' -f2) + local patch=$(echo "$base_version" | cut -d'.' -f3) + + # Validate numeric components + if ! [[ "$major" =~ ^[0-9]+$ ]] || ! [[ "$minor" =~ ^[0-9]+$ ]] || ! [[ "$patch" =~ ^[0-9]+$ ]]; then + print_error "Invalid version format: $version" + return 1 + fi + + # Increment version based on bump type + case "$bump_type" in + major) + major=$((major + 1)) + minor=0 + patch=0 + ;; + minor) + minor=$((minor + 1)) + patch=0 + ;; + patch) + patch=$((patch + 1)) + ;; + esac + + echo "${major}.${minor}.${patch}${suffix}" +} + +# Function to get Rush projects from rush.json +get_rush_projects() { + node -e " + const fs = require('fs'); + try { + // Read and strip comments from JSON + let content = fs.readFileSync('$RUSH_JSON', 'utf8'); + // Remove single line comments that start with // + content = content.replace(/^\s*\/\/.*$/gm, ''); + // Remove multi-line comments /* ... */ + content = content.replace(/\/\*[\s\S]*?\*\//g, ''); + + const rush = JSON.parse(content); + if (rush.projects && Array.isArray(rush.projects)) { + rush.projects.forEach(project => { + console.log(project.packageName + '|' + project.projectFolder + '|' + (project.shouldPublish || false)); + }); + } + } catch (error) { + console.error('Error parsing rush.json:', error.message); + process.exit(1); + } + " +} + +# Function to update package.json version +update_package_version() { + local package_file="$1" + local new_version="$2" + + print_info "Updating version in $package_file to $new_version" + + # Use node to update the version in package.json + node -e " + const fs = require('fs'); + const path = '$package_file'; + try { + const pkg = JSON.parse(fs.readFileSync(path, 'utf8')); + pkg.version = '$new_version'; + fs.writeFileSync(path, JSON.stringify(pkg, null, 2) + '\n'); + } catch (error) { + console.error('Error updating package.json:', error.message); + process.exit(1); + } + " +} + +# Function to update dependencies in package.json +update_dependencies() { + local package_file="$1" + local package_name="$2" + local new_version="$3" + + node -e " + const fs = require('fs'); + const path = '$package_file'; + try { + const pkg = JSON.parse(fs.readFileSync(path, 'utf8')); + let updated = false; + + // Update in dependencies + if (pkg.dependencies && pkg.dependencies['$package_name']) { + const oldDep = pkg.dependencies['$package_name']; + if (oldDep.startsWith('workspace:')) { + pkg.dependencies['$package_name'] = 'workspace:^$new_version'; + } else { + pkg.dependencies['$package_name'] = '^$new_version'; + } + updated = true; + } + + // Update in devDependencies + if (pkg.devDependencies && pkg.devDependencies['$package_name']) { + const oldDep = pkg.devDependencies['$package_name']; + if (oldDep.startsWith('workspace:')) { + pkg.devDependencies['$package_name'] = 'workspace:^$new_version'; + } else { + pkg.devDependencies['$package_name'] = '^$new_version'; + } + updated = true; + } + + // Update in peerDependencies + if (pkg.peerDependencies && pkg.peerDependencies['$package_name']) { + const oldDep = pkg.peerDependencies['$package_name']; + if (oldDep.startsWith('workspace:')) { + pkg.peerDependencies['$package_name'] = 'workspace:^$new_version'; + } else { + pkg.peerDependencies['$package_name'] = '^$new_version'; + } + updated = true; + } + + if (updated) { + fs.writeFileSync(path, JSON.stringify(pkg, null, 2) + '\n'); + console.log('Updated dependencies for $package_name'); + } + } catch (error) { + console.error('Error updating dependencies:', error.message); + } + " +} + +# Get base version from tag +BASE_VERSION=$(get_tag_version "$GIT_REVISION") +NEW_VERSION=$(increment_version "$BASE_VERSION" "$BUMP_TYPE") + +print_info "Base version from tag: $BASE_VERSION" +print_success "New version for all packages: $NEW_VERSION" + +# Temporary files to store package information +TEMP_DIR=$(mktemp -d) +PACKAGE_DATA_FILE="$TEMP_DIR/package_data" +UPDATED_PACKAGES_FILE="$TEMP_DIR/updated_packages" + +# Get all Rush projects +print_info "Getting all Rush projects..." +get_rush_projects > "$PACKAGE_DATA_FILE" + +package_count=$(wc -l < "$PACKAGE_DATA_FILE") +print_info "Found $package_count package(s) to update" + +# Step 1: Update all package versions to the new version +print_info "Updating all package versions to $NEW_VERSION..." +while IFS='|' read -r package_name project_folder publish_flag; do + package_file="${REPO_ROOT}/${project_folder}/package.json" + + if [ -f "$package_file" ]; then + # Get current version + current_version=$(node -e " + try { + const pkg = JSON.parse(require('fs').readFileSync('$package_file', 'utf8')); + console.log(pkg.version); + } catch (error) { + console.error('Error reading version from $package_file'); + process.exit(1); + } + ") + + update_package_version "$package_file" "$NEW_VERSION" + echo "$package_name|$NEW_VERSION|$project_folder|$publish_flag|$current_version" >> "$UPDATED_PACKAGES_FILE" + print_success "Updated $package_name: $current_version -> $NEW_VERSION" + else + print_warning "package.json not found for $package_name at $package_file" + fi +done < "$PACKAGE_DATA_FILE" + +# Step 2: Update all internal dependencies to reference the new version +print_info "Updating internal dependencies to version $NEW_VERSION..." +while IFS='|' read -r package_name project_folder publish_flag; do + package_file="${REPO_ROOT}/${project_folder}/package.json" + + if [ -f "$package_file" ]; then + # Update dependencies for each package in the monorepo + while IFS='|' read -r dep_package_name dep_project_folder dep_publish_flag _old_version; do + node -e " + const fs = require('fs'); + const path = '$package_file'; + try { + const pkg = JSON.parse(fs.readFileSync(path, 'utf8')); + let updated = false; + + // Check and update in dependencies + if (pkg.dependencies && pkg.dependencies['$dep_package_name']) { + const oldDep = pkg.dependencies['$dep_package_name']; + if (oldDep.startsWith('workspace:')) { + pkg.dependencies['$dep_package_name'] = 'workspace:^$NEW_VERSION'; + } else { + pkg.dependencies['$dep_package_name'] = '^$NEW_VERSION'; + } + updated = true; + } + + // Check and update in devDependencies + if (pkg.devDependencies && pkg.devDependencies['$dep_package_name']) { + const oldDep = pkg.devDependencies['$dep_package_name']; + if (oldDep.startsWith('workspace:')) { + pkg.devDependencies['$dep_package_name'] = 'workspace:^$NEW_VERSION'; + } else { + pkg.devDependencies['$dep_package_name'] = '^$NEW_VERSION'; + } + updated = true; + } + + // Check and update in peerDependencies + if (pkg.peerDependencies && pkg.peerDependencies['$dep_package_name']) { + const oldDep = pkg.peerDependencies['$dep_package_name']; + if (oldDep.startsWith('workspace:')) { + pkg.peerDependencies['$dep_package_name'] = 'workspace:^$NEW_VERSION'; + } else { + pkg.peerDependencies['$dep_package_name'] = '^$NEW_VERSION'; + } + updated = true; + } + + if (updated) { + fs.writeFileSync(path, JSON.stringify(pkg, null, 2) + '\n'); + } + } catch (error) { + console.error('Error updating dependencies:', error.message); + } + " 2>/dev/null + done < "$UPDATED_PACKAGES_FILE" + fi +done < "$PACKAGE_DATA_FILE" + +print_success "Updated internal dependencies across all packages" + +print_success "Version bump complete!" + +# Summary +echo +print_info "Summary of changes:" +echo -e " ${BLUE}Base version (from tag ${GIT_REVISION}):${NC} $BASE_VERSION" +echo -e " ${GREEN}New version (${BUMP_TYPE} bump):${NC} $NEW_VERSION" +echo +print_info "Updated packages:" +while IFS='|' read -r package_name new_version project_folder publish_flag old_version; do + if [ "$publish_flag" = "true" ]; then + echo -e " ${GREEN}āœ“${NC} $package_name: $old_version -> $new_version ${YELLOW}(will be published)${NC}" + else + echo -e " ${GREEN}āœ“${NC} $package_name: $old_version -> $new_version ${BLUE}(private package)${NC}" + fi +done < "$UPDATED_PACKAGES_FILE" + +echo +print_info "Next steps:" +echo " 1. Review the changes: git diff" +echo " 2. Update lockfile: rush update" +echo " 3. Run tests: rush test" +echo " 4. Build all packages: rush build" +echo " 5. Commit changes: git add . && git commit -m 'Bump all versions to $NEW_VERSION'" +echo " 6. Tag the release: git tag v$NEW_VERSION && git push origin v$NEW_VERSION" +echo " 7. For publishable packages, run: rush publish" + +# Cleanup +rm -rf "$TEMP_DIR" + +print_info "Running rush update to sync lockfile..." +rush update + +print_success "Done!" diff --git a/packages/measurements-otlp/.npmignore b/packages/measurements-otlp/.npmignore index e3ec093c38..9b083cb0c4 100644 --- a/packages/measurements-otlp/.npmignore +++ b/packages/measurements-otlp/.npmignore @@ -1,4 +1,8 @@ * !/lib/** +!/types/** +!/src/** !CHANGELOG.md -/lib/**/__tests__/ +/lib/**/__test__/ +/types/**/__test__/ +/src/**/__test__/ \ No newline at end of file diff --git a/packages/measurements-otlp/package.json b/packages/measurements-otlp/package.json index c692c85def..c5445bd9ab 100644 --- a/packages/measurements-otlp/package.json +++ b/packages/measurements-otlp/package.json @@ -1,13 +1,18 @@ { "name": "@hcengineering/measurements-otlp", - "version": "0.7.0", + "version": "0.7.5", "main": "lib/index.js", "svelte": "src/index.ts", "types": "types/index.d.ts", "files": [ "lib/**/*", + "!lib/**/__test__/**", "types/**/*", - "tsconfig.json" + "!types/**/__test__/**", + "src/**/*", + "!src/**/__test__/**", + "README.md", + "CHANGELOG.md" ], "author": "Anticrm Platform Contributors", "license": "EPL-2.0", @@ -22,7 +27,7 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.0", + "@hcengineering/platform-rig": "workspace:^0.7.5", "@typescript-eslint/eslint-plugin": "^6.11.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-promise": "^6.1.1", @@ -38,7 +43,7 @@ "@types/jest": "^29.5.5" }, "dependencies": { - "@hcengineering/measurements": "workspace:^0.7.0", + "@hcengineering/measurements": "workspace:^0.7.5", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-logs": "^0.203.0", "@opentelemetry/auto-instrumentations-node": "^0.62.0", @@ -54,7 +59,14 @@ "@opentelemetry/api-logs": "^0.203.0", "@opentelemetry/sdk-metrics": "^2.0.1" }, - "repository": "https://github.com/hcengineering/platform", + "repository": "https://github.com/hcengineering/huly.utils", + "exports": { + ".": { + "types": "./types/index.d.ts", + "require": "./lib/index.js", + "import": "./lib/index.js" + } + }, "publishConfig": { "access": "public" } diff --git a/packages/measurements/.npmignore b/packages/measurements/.npmignore index e3ec093c38..9b083cb0c4 100644 --- a/packages/measurements/.npmignore +++ b/packages/measurements/.npmignore @@ -1,4 +1,8 @@ * !/lib/** +!/types/** +!/src/** !CHANGELOG.md -/lib/**/__tests__/ +/lib/**/__test__/ +/types/**/__test__/ +/src/**/__test__/ \ No newline at end of file diff --git a/packages/measurements/package.json b/packages/measurements/package.json index 892c372c3e..c898bf7815 100644 --- a/packages/measurements/package.json +++ b/packages/measurements/package.json @@ -1,13 +1,18 @@ { "name": "@hcengineering/measurements", - "version": "0.7.0", + "version": "0.7.5", "main": "lib/index.js", "svelte": "src/index.ts", "types": "types/index.d.ts", "files": [ "lib/**/*", + "!lib/**/__test__/**", "types/**/*", - "tsconfig.json" + "!types/**/__test__/**", + "src/**/*", + "!src/**/__test__/**", + "README.md", + "CHANGELOG.md" ], "author": "Anticrm Platform Contributors", "license": "EPL-2.0", @@ -22,7 +27,7 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.0", + "@hcengineering/platform-rig": "workspace:^0.7.5", "@typescript-eslint/eslint-plugin": "^6.11.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-promise": "^6.1.1", diff --git a/packages/platform-rig/package.json b/packages/platform-rig/package.json index 90c9ac6f1c..8060e2dd69 100644 --- a/packages/platform-rig/package.json +++ b/packages/platform-rig/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/platform-rig", - "version": "0.7.4", + "version": "0.7.5", "scripts": { "build": "echo 'Not required'", "format": "echo 'Not required'" diff --git a/packages/postgres-base/.npmignore b/packages/postgres-base/.npmignore index e3ec093c38..9b083cb0c4 100644 --- a/packages/postgres-base/.npmignore +++ b/packages/postgres-base/.npmignore @@ -1,4 +1,8 @@ * !/lib/** +!/types/** +!/src/** !CHANGELOG.md -/lib/**/__tests__/ +/lib/**/__test__/ +/types/**/__test__/ +/src/**/__test__/ \ No newline at end of file diff --git a/packages/postgres-base/package.json b/packages/postgres-base/package.json index 9ff39ed3a6..02e007df74 100644 --- a/packages/postgres-base/package.json +++ b/packages/postgres-base/package.json @@ -1,12 +1,22 @@ { "name": "@hcengineering/postgres-base", - "version": "0.7.0", + "version": "0.7.5", "main": "lib/index.js", "svelte": "src/index.ts", "types": "types/index.d.ts", "author": "Copyright Ā© Hardcore Engineering Inc.", "template": "@hcengineering/node-package", "license": "EPL-2.0", + "files": [ + "lib/**/*", + "!lib/**/__test__/**", + "types/**/*", + "!types/**/__test__/**", + "src/**/*", + "!src/**/__test__/**", + "README.md", + "CHANGELOG.md" + ], "scripts": { "build": "compile", "build:watch": "compile", @@ -18,7 +28,7 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.0", + "@hcengineering/platform-rig": "workspace:^0.7.5", "@typescript-eslint/eslint-plugin": "^6.11.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-promise": "^6.1.1", @@ -36,6 +46,14 @@ "dependencies": { "postgres": "^3.4.7" }, + "repository": "https://github.com/hcengineering/huly.utils", + "exports": { + ".": { + "types": "./types/index.d.ts", + "require": "./lib/index.js", + "import": "./lib/index.js" + } + }, "publishConfig": { "access": "public" } From 1357cb6a62da7e83a58f4dcb7d2f0ade12c9de41 Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Wed, 1 Oct 2025 10:43:04 +0700 Subject: [PATCH 09/40] Fix publish script --- .github/workflows/ci.yml | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ef78e37002..106a1b21c2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,20 +24,8 @@ jobs: run: node common/scripts/install-run-rush.js install - name: Rush validate run: node common/scripts/install-run-rush.js validate --verbose - - publish: - runs-on: ubuntu-latest - if: startsWith(github.ref, 'refs/tags/v0.7.') - steps: - - uses: actions/checkout@v3 - with: - fetch-depth: 2 - - uses: actions/setup-node@v3 - with: - node-version: 22 - - name: Install dependencies - run: node common/scripts/install-run-rush.js install - name: Publish packages + if: startsWith(github.ref, 'refs/tags/v0.7.') env: NPM_TOKEN: ${{ secrets.NPM_TOKEN }} run: node common/scripts/install-run-rush.js publish --include-all --publish From 98a5d9a5eb587c3da5c55860e031592308401297 Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Wed, 1 Oct 2025 10:43:30 +0700 Subject: [PATCH 10/40] Bump version to 0.7.6 --- common/config/rush/pnpm-lock.yaml | 8 ++++---- packages/measurements-otlp/package.json | 6 +++--- packages/measurements/package.json | 4 ++-- packages/platform-rig/package.json | 2 +- packages/postgres-base/package.json | 4 ++-- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 581a00f618..d82989b747 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -13,7 +13,7 @@ importers: ../../packages/measurements: devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.5 + specifier: workspace:^0.7.6 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 @@ -58,7 +58,7 @@ importers: ../../packages/measurements-otlp: dependencies: '@hcengineering/measurements': - specifier: workspace:^0.7.5 + specifier: workspace:^0.7.6 version: link:../measurements '@opentelemetry/api': specifier: ^1.9.0 @@ -104,7 +104,7 @@ importers: version: 2.1.0(@opentelemetry/api@1.9.0) devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.5 + specifier: workspace:^0.7.6 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 @@ -166,7 +166,7 @@ importers: version: 3.4.7 devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.5 + specifier: workspace:^0.7.6 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 diff --git a/packages/measurements-otlp/package.json b/packages/measurements-otlp/package.json index c5445bd9ab..ed8d13846f 100644 --- a/packages/measurements-otlp/package.json +++ b/packages/measurements-otlp/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/measurements-otlp", - "version": "0.7.5", + "version": "0.7.6", "main": "lib/index.js", "svelte": "src/index.ts", "types": "types/index.d.ts", @@ -27,7 +27,7 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.5", + "@hcengineering/platform-rig": "workspace:^0.7.6", "@typescript-eslint/eslint-plugin": "^6.11.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-promise": "^6.1.1", @@ -43,7 +43,7 @@ "@types/jest": "^29.5.5" }, "dependencies": { - "@hcengineering/measurements": "workspace:^0.7.5", + "@hcengineering/measurements": "workspace:^0.7.6", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-logs": "^0.203.0", "@opentelemetry/auto-instrumentations-node": "^0.62.0", diff --git a/packages/measurements/package.json b/packages/measurements/package.json index c898bf7815..6e7065c73b 100644 --- a/packages/measurements/package.json +++ b/packages/measurements/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/measurements", - "version": "0.7.5", + "version": "0.7.6", "main": "lib/index.js", "svelte": "src/index.ts", "types": "types/index.d.ts", @@ -27,7 +27,7 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.5", + "@hcengineering/platform-rig": "workspace:^0.7.6", "@typescript-eslint/eslint-plugin": "^6.11.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-promise": "^6.1.1", diff --git a/packages/platform-rig/package.json b/packages/platform-rig/package.json index 8060e2dd69..8dd5d8266c 100644 --- a/packages/platform-rig/package.json +++ b/packages/platform-rig/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/platform-rig", - "version": "0.7.5", + "version": "0.7.6", "scripts": { "build": "echo 'Not required'", "format": "echo 'Not required'" diff --git a/packages/postgres-base/package.json b/packages/postgres-base/package.json index 02e007df74..962caa82c3 100644 --- a/packages/postgres-base/package.json +++ b/packages/postgres-base/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/postgres-base", - "version": "0.7.5", + "version": "0.7.6", "main": "lib/index.js", "svelte": "src/index.ts", "types": "types/index.d.ts", @@ -28,7 +28,7 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.5", + "@hcengineering/platform-rig": "workspace:^0.7.6", "@typescript-eslint/eslint-plugin": "^6.11.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-promise": "^6.1.1", From ae3cdbfb2cdf933b716ad24316ef8109e005674c Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Thu, 2 Oct 2025 11:10:33 +0700 Subject: [PATCH 11/40] 0.7.7 --- common/config/rush/pnpm-lock.yaml | 8 +++---- packages/measurements-otlp/package.json | 6 ++--- packages/measurements-otlp/src/telemetry.ts | 26 ++++++++++++++++++++- packages/measurements/package.json | 4 ++-- packages/platform-rig/package.json | 2 +- packages/postgres-base/package.json | 4 ++-- 6 files changed, 37 insertions(+), 13 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index d82989b747..b816d29e97 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -13,7 +13,7 @@ importers: ../../packages/measurements: devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.6 + specifier: workspace:^0.7.7 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 @@ -58,7 +58,7 @@ importers: ../../packages/measurements-otlp: dependencies: '@hcengineering/measurements': - specifier: workspace:^0.7.6 + specifier: workspace:^0.7.7 version: link:../measurements '@opentelemetry/api': specifier: ^1.9.0 @@ -104,7 +104,7 @@ importers: version: 2.1.0(@opentelemetry/api@1.9.0) devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.6 + specifier: workspace:^0.7.7 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 @@ -166,7 +166,7 @@ importers: version: 3.4.7 devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.6 + specifier: workspace:^0.7.7 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 diff --git a/packages/measurements-otlp/package.json b/packages/measurements-otlp/package.json index ed8d13846f..6026604f83 100644 --- a/packages/measurements-otlp/package.json +++ b/packages/measurements-otlp/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/measurements-otlp", - "version": "0.7.6", + "version": "0.7.7", "main": "lib/index.js", "svelte": "src/index.ts", "types": "types/index.d.ts", @@ -27,7 +27,7 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.6", + "@hcengineering/platform-rig": "workspace:^0.7.7", "@typescript-eslint/eslint-plugin": "^6.11.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-promise": "^6.1.1", @@ -43,7 +43,7 @@ "@types/jest": "^29.5.5" }, "dependencies": { - "@hcengineering/measurements": "workspace:^0.7.6", + "@hcengineering/measurements": "workspace:^0.7.7", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-logs": "^0.203.0", "@opentelemetry/auto-instrumentations-node": "^0.62.0", diff --git a/packages/measurements-otlp/src/telemetry.ts b/packages/measurements-otlp/src/telemetry.ts index bf35a7c4cf..da1a492250 100644 --- a/packages/measurements-otlp/src/telemetry.ts +++ b/packages/measurements-otlp/src/telemetry.ts @@ -479,7 +479,7 @@ export function initOpenTelemetrySDK (serviceName: string, version: string): boo return true } -export function reportOTELError (error: Error): void { +export function reportOTELError (error: Error, attributes?: Record): void { if (sdkServiceName !== undefined && sdkServiceVersion !== undefined && loggerProvider !== undefined) { const otlpLogger = loggerProvider?.getLogger(sdkServiceName, sdkServiceVersion) otlpLogger?.emit({ @@ -488,6 +488,7 @@ export function reportOTELError (error: Error): void { body: error.message, context: context.active(), attributes: { + ...attributes, 'service.name': sdkServiceName, 'service.version': sdkServiceVersion, 'error.stack': error.stack @@ -496,6 +497,29 @@ export function reportOTELError (error: Error): void { } } +export function reportOTEL ( + severity: 'info' | 'warning', + message: string, + time: number, + attributes?: Record +): void { + if (sdkServiceName !== undefined && sdkServiceVersion !== undefined && loggerProvider !== undefined) { + const otlpLogger = loggerProvider?.getLogger(sdkServiceName, sdkServiceVersion) + otlpLogger?.emit({ + severityNumber: severity === 'info' ? SeverityNumber.INFO : SeverityNumber.WARN, + body: message, + severityText: severity, + timestamp: time, + context: context.active(), + attributes: { + ...attributes, + 'service.name': sdkServiceName, + 'service.version': sdkServiceVersion + } + }) + } +} + export function createOpenTelemetryMetricsContext ( name: string, params: ParamsType, diff --git a/packages/measurements/package.json b/packages/measurements/package.json index 6e7065c73b..d1ef659d4a 100644 --- a/packages/measurements/package.json +++ b/packages/measurements/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/measurements", - "version": "0.7.6", + "version": "0.7.7", "main": "lib/index.js", "svelte": "src/index.ts", "types": "types/index.d.ts", @@ -27,7 +27,7 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.6", + "@hcengineering/platform-rig": "workspace:^0.7.7", "@typescript-eslint/eslint-plugin": "^6.11.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-promise": "^6.1.1", diff --git a/packages/platform-rig/package.json b/packages/platform-rig/package.json index 8dd5d8266c..eee1202e21 100644 --- a/packages/platform-rig/package.json +++ b/packages/platform-rig/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/platform-rig", - "version": "0.7.6", + "version": "0.7.7", "scripts": { "build": "echo 'Not required'", "format": "echo 'Not required'" diff --git a/packages/postgres-base/package.json b/packages/postgres-base/package.json index 962caa82c3..d2eb0d6dbb 100644 --- a/packages/postgres-base/package.json +++ b/packages/postgres-base/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/postgres-base", - "version": "0.7.6", + "version": "0.7.7", "main": "lib/index.js", "svelte": "src/index.ts", "types": "types/index.d.ts", @@ -28,7 +28,7 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.6", + "@hcengineering/platform-rig": "workspace:^0.7.7", "@typescript-eslint/eslint-plugin": "^6.11.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-promise": "^6.1.1", From 691406d3429930028d0d58f2301199f8a0736581 Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Mon, 6 Oct 2025 23:35:16 +0700 Subject: [PATCH 12/40] v0.7.8 --- common/config/rush/command-line.json | 31 +- common/config/rush/pnpm-lock.yaml | 8 +- common/scripts/bump-changes-from-tag.sh | 411 ------------------ packages/measurements-otlp/package.json | 6 +- packages/measurements/package.json | 4 +- packages/platform-rig/.npmignore | 4 + .../platform-rig/bin/bump-changes-from-tag.js | 392 +++++++++++++++++ packages/platform-rig/package.json | 2 +- packages/postgres-base/package.json | 4 +- scripts/bump-version.sh | 19 - 10 files changed, 411 insertions(+), 470 deletions(-) delete mode 100755 common/scripts/bump-changes-from-tag.sh create mode 100644 packages/platform-rig/.npmignore create mode 100755 packages/platform-rig/bin/bump-changes-from-tag.js delete mode 100755 scripts/bump-version.sh diff --git a/common/config/rush/command-line.json b/common/config/rush/command-line.json index c356ff1d2a..5b39ca5861 100644 --- a/common/config/rush/command-line.json +++ b/common/config/rush/command-line.json @@ -207,12 +207,7 @@ "summary": "docker:build", "commandKind": "phased", "name": "docker:build", - "phases": [ - "_phase:build", - "_phase:bundle", - "_phase:package", - "_phase:docker-build" - ], + "phases": ["_phase:build", "_phase:bundle", "_phase:package", "_phase:docker-build"], "enableParallelism": true, "incremental": true }, @@ -220,12 +215,7 @@ "summary": "docker:rebuild", "commandKind": "phased", "name": "docker:rebuild", - "phases": [ - "_phase:build", - "_phase:bundle", - "_phase:package", - "_phase:docker-build" - ], + "phases": ["_phase:build", "_phase:bundle", "_phase:package", "_phase:docker-build"], "enableParallelism": true, "incremental": false }, @@ -233,12 +223,7 @@ "summary": "docker:staging", "commandKind": "phased", "name": "docker:staging", - "phases": [ - "_phase:build", - "_phase:bundle", - "_phase:package", - "_phase:docker-staging" - ], + "phases": ["_phase:build", "_phase:bundle", "_phase:package", "_phase:docker-staging"], "enableParallelism": true, "incremental": true }, @@ -389,16 +374,6 @@ "shortName": "-f", "description": "Force formatting", "associatedCommands": ["format"] - }, - { - "parameterKind": "string", - "argumentName": "BRANCH", - "required": false, - "associatedPhases": [], - "shortName": "-b", - "longName": "--branch", - "description": "Force formatting of branch", - "associatedCommands": ["fast-format"] } // { // /** diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index b816d29e97..efbc5704d1 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -13,7 +13,7 @@ importers: ../../packages/measurements: devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.7 + specifier: workspace:^0.7.8 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 @@ -58,7 +58,7 @@ importers: ../../packages/measurements-otlp: dependencies: '@hcengineering/measurements': - specifier: workspace:^0.7.7 + specifier: workspace:^0.7.8 version: link:../measurements '@opentelemetry/api': specifier: ^1.9.0 @@ -104,7 +104,7 @@ importers: version: 2.1.0(@opentelemetry/api@1.9.0) devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.7 + specifier: workspace:^0.7.8 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 @@ -166,7 +166,7 @@ importers: version: 3.4.7 devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.7 + specifier: workspace:^0.7.8 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 diff --git a/common/scripts/bump-changes-from-tag.sh b/common/scripts/bump-changes-from-tag.sh deleted file mode 100755 index b8b1c92127..0000000000 --- a/common/scripts/bump-changes-from-tag.sh +++ /dev/null @@ -1,411 +0,0 @@ -#!/usr/bin/env bash - -# Script to bump version of ALL Node.js packages by incrementing from previous tag -# and update dependencies accordingly in a Rush.js monorepo -# -# Usage: ./bump-changes-from-tag.sh [git-revision] [major|minor|patch] -# Example: ./bump-changes-from-tag.sh # Auto-detect latest v*.*.* tag, patch bump -# Example: ./bump-changes-from-tag.sh patch # Auto-detect latest tag + patch bump -# Example: ./bump-changes-from-tag.sh minor # Auto-detect latest tag + minor bump -# Example: ./bump-changes-from-tag.sh v0.7.0 major # Use specific tag + major bump - -set -e - -# Colors for output -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -BLUE='\033[0;34m' -NC='\033[0m' # No Color - -# Function to print colored output -print_info() { - echo -e "${BLUE}[INFO]${NC} $1" -} - -print_success() { - echo -e "${GREEN}[SUCCESS]${NC} $1" -} - -print_warning() { - echo -e "${YELLOW}[WARNING]${NC} $1" -} - -print_error() { - echo -e "${RED}[ERROR]${NC} $1" -} - -# Function to get the latest tag matching pattern v*.*.* (e.g., v0.7.x) -get_latest_version_tag() { - local latest_tag - # Get all tags matching v*.*.* pattern, sort them by version, and pick the latest - latest_tag=$(git tag -l 'v*.*.*' | sort -V | tail -n 1) - - if [ -z "$latest_tag" ]; then - print_warning "No version tags found matching v*.*.* pattern" - return 1 - fi - - echo "$latest_tag" -} - -# Check if git revision is provided -if [ -z "$1" ]; then - # No arguments provided - auto-detect tag and use patch - print_info "No git revision provided, attempting to auto-detect latest version tag..." - GIT_REVISION=$(get_latest_version_tag) - - if [ -z "$GIT_REVISION" ]; then - print_error "Could not auto-detect latest version tag" - print_error "" - print_error "Usage: $0 [git-revision] [major|minor|patch]" - print_error "Example: $0 # Auto-detect latest v*.*.* tag, patch bump" - print_error "Example: $0 patch # Auto-detect latest tag + patch bump" - print_error "Example: $0 minor # Auto-detect latest tag + minor bump" - print_error "Example: $0 HEAD~5" - print_error "Example: $0 HEAD~5 minor" - print_error "Example: $0 v0.7.0 major" - exit 1 - fi - - print_success "Auto-detected latest version tag: $GIT_REVISION" - BUMP_TYPE="patch" -elif [ "$1" = "major" ] || [ "$1" = "minor" ] || [ "$1" = "patch" ]; then - # First argument is bump type - auto-detect tag - print_info "Bump type '$1' provided, attempting to auto-detect latest version tag..." - GIT_REVISION=$(get_latest_version_tag) - - if [ -z "$GIT_REVISION" ]; then - print_error "Could not auto-detect latest version tag" - exit 1 - fi - - print_success "Auto-detected latest version tag: $GIT_REVISION" - BUMP_TYPE="$1" -else - # First argument is git revision - GIT_REVISION="$1" - BUMP_TYPE="${2:-patch}" # Default to patch if not specified -fi -REPO_ROOT=$(git rev-parse --show-toplevel) -RUSH_JSON="${REPO_ROOT}/rush.json" - -# Validate bump type -case "$BUMP_TYPE" in - major|minor|patch) - ;; - *) - print_error "Invalid bump type: $BUMP_TYPE" - print_error "Valid options are: major, minor, patch" - exit 1 - ;; -esac - -# Verify we're in a git repository -if [ ! -d ".git" ] && [ ! -f ".git" ]; then - print_error "Not in a git repository" - exit 1 -fi - -# Verify rush.json exists -if [ ! -f "$RUSH_JSON" ]; then - print_error "rush.json not found at $RUSH_JSON" - exit 1 -fi - -print_info "Repository root: $REPO_ROOT" -print_info "Reference tag: $GIT_REVISION" -print_info "Bump type: $BUMP_TYPE" - -# Function to get version from previous tag -get_tag_version() { - local tag="$1" - # Remove 'v' prefix if present - local version="${tag#v}" - echo "$version" -} - -# Function to increment version based on bump type -increment_version() { - local version="$1" - local bump_type="$2" - - # Remove any pre-release suffix first - local base_version="${version%%-*}" - local suffix="" - if [[ "$version" != "$base_version" ]]; then - suffix="-${version#*-}" - fi - - # Extract major.minor.patch - local major=$(echo "$base_version" | cut -d'.' -f1) - local minor=$(echo "$base_version" | cut -d'.' -f2) - local patch=$(echo "$base_version" | cut -d'.' -f3) - - # Validate numeric components - if ! [[ "$major" =~ ^[0-9]+$ ]] || ! [[ "$minor" =~ ^[0-9]+$ ]] || ! [[ "$patch" =~ ^[0-9]+$ ]]; then - print_error "Invalid version format: $version" - return 1 - fi - - # Increment version based on bump type - case "$bump_type" in - major) - major=$((major + 1)) - minor=0 - patch=0 - ;; - minor) - minor=$((minor + 1)) - patch=0 - ;; - patch) - patch=$((patch + 1)) - ;; - esac - - echo "${major}.${minor}.${patch}${suffix}" -} - -# Function to get Rush projects from rush.json -get_rush_projects() { - node -e " - const fs = require('fs'); - try { - // Read and strip comments from JSON - let content = fs.readFileSync('$RUSH_JSON', 'utf8'); - // Remove single line comments that start with // - content = content.replace(/^\s*\/\/.*$/gm, ''); - // Remove multi-line comments /* ... */ - content = content.replace(/\/\*[\s\S]*?\*\//g, ''); - - const rush = JSON.parse(content); - if (rush.projects && Array.isArray(rush.projects)) { - rush.projects.forEach(project => { - console.log(project.packageName + '|' + project.projectFolder + '|' + (project.shouldPublish || false)); - }); - } - } catch (error) { - console.error('Error parsing rush.json:', error.message); - process.exit(1); - } - " -} - -# Function to update package.json version -update_package_version() { - local package_file="$1" - local new_version="$2" - - print_info "Updating version in $package_file to $new_version" - - # Use node to update the version in package.json - node -e " - const fs = require('fs'); - const path = '$package_file'; - try { - const pkg = JSON.parse(fs.readFileSync(path, 'utf8')); - pkg.version = '$new_version'; - fs.writeFileSync(path, JSON.stringify(pkg, null, 2) + '\n'); - } catch (error) { - console.error('Error updating package.json:', error.message); - process.exit(1); - } - " -} - -# Function to update dependencies in package.json -update_dependencies() { - local package_file="$1" - local package_name="$2" - local new_version="$3" - - node -e " - const fs = require('fs'); - const path = '$package_file'; - try { - const pkg = JSON.parse(fs.readFileSync(path, 'utf8')); - let updated = false; - - // Update in dependencies - if (pkg.dependencies && pkg.dependencies['$package_name']) { - const oldDep = pkg.dependencies['$package_name']; - if (oldDep.startsWith('workspace:')) { - pkg.dependencies['$package_name'] = 'workspace:^$new_version'; - } else { - pkg.dependencies['$package_name'] = '^$new_version'; - } - updated = true; - } - - // Update in devDependencies - if (pkg.devDependencies && pkg.devDependencies['$package_name']) { - const oldDep = pkg.devDependencies['$package_name']; - if (oldDep.startsWith('workspace:')) { - pkg.devDependencies['$package_name'] = 'workspace:^$new_version'; - } else { - pkg.devDependencies['$package_name'] = '^$new_version'; - } - updated = true; - } - - // Update in peerDependencies - if (pkg.peerDependencies && pkg.peerDependencies['$package_name']) { - const oldDep = pkg.peerDependencies['$package_name']; - if (oldDep.startsWith('workspace:')) { - pkg.peerDependencies['$package_name'] = 'workspace:^$new_version'; - } else { - pkg.peerDependencies['$package_name'] = '^$new_version'; - } - updated = true; - } - - if (updated) { - fs.writeFileSync(path, JSON.stringify(pkg, null, 2) + '\n'); - console.log('Updated dependencies for $package_name'); - } - } catch (error) { - console.error('Error updating dependencies:', error.message); - } - " -} - -# Get base version from tag -BASE_VERSION=$(get_tag_version "$GIT_REVISION") -NEW_VERSION=$(increment_version "$BASE_VERSION" "$BUMP_TYPE") - -print_info "Base version from tag: $BASE_VERSION" -print_success "New version for all packages: $NEW_VERSION" - -# Temporary files to store package information -TEMP_DIR=$(mktemp -d) -PACKAGE_DATA_FILE="$TEMP_DIR/package_data" -UPDATED_PACKAGES_FILE="$TEMP_DIR/updated_packages" - -# Get all Rush projects -print_info "Getting all Rush projects..." -get_rush_projects > "$PACKAGE_DATA_FILE" - -package_count=$(wc -l < "$PACKAGE_DATA_FILE") -print_info "Found $package_count package(s) to update" - -# Step 1: Update all package versions to the new version -print_info "Updating all package versions to $NEW_VERSION..." -while IFS='|' read -r package_name project_folder publish_flag; do - package_file="${REPO_ROOT}/${project_folder}/package.json" - - if [ -f "$package_file" ]; then - # Get current version - current_version=$(node -e " - try { - const pkg = JSON.parse(require('fs').readFileSync('$package_file', 'utf8')); - console.log(pkg.version); - } catch (error) { - console.error('Error reading version from $package_file'); - process.exit(1); - } - ") - - update_package_version "$package_file" "$NEW_VERSION" - echo "$package_name|$NEW_VERSION|$project_folder|$publish_flag|$current_version" >> "$UPDATED_PACKAGES_FILE" - print_success "Updated $package_name: $current_version -> $NEW_VERSION" - else - print_warning "package.json not found for $package_name at $package_file" - fi -done < "$PACKAGE_DATA_FILE" - -# Step 2: Update all internal dependencies to reference the new version -print_info "Updating internal dependencies to version $NEW_VERSION..." -while IFS='|' read -r package_name project_folder publish_flag; do - package_file="${REPO_ROOT}/${project_folder}/package.json" - - if [ -f "$package_file" ]; then - # Update dependencies for each package in the monorepo - while IFS='|' read -r dep_package_name dep_project_folder dep_publish_flag _old_version; do - node -e " - const fs = require('fs'); - const path = '$package_file'; - try { - const pkg = JSON.parse(fs.readFileSync(path, 'utf8')); - let updated = false; - - // Check and update in dependencies - if (pkg.dependencies && pkg.dependencies['$dep_package_name']) { - const oldDep = pkg.dependencies['$dep_package_name']; - if (oldDep.startsWith('workspace:')) { - pkg.dependencies['$dep_package_name'] = 'workspace:^$NEW_VERSION'; - } else { - pkg.dependencies['$dep_package_name'] = '^$NEW_VERSION'; - } - updated = true; - } - - // Check and update in devDependencies - if (pkg.devDependencies && pkg.devDependencies['$dep_package_name']) { - const oldDep = pkg.devDependencies['$dep_package_name']; - if (oldDep.startsWith('workspace:')) { - pkg.devDependencies['$dep_package_name'] = 'workspace:^$NEW_VERSION'; - } else { - pkg.devDependencies['$dep_package_name'] = '^$NEW_VERSION'; - } - updated = true; - } - - // Check and update in peerDependencies - if (pkg.peerDependencies && pkg.peerDependencies['$dep_package_name']) { - const oldDep = pkg.peerDependencies['$dep_package_name']; - if (oldDep.startsWith('workspace:')) { - pkg.peerDependencies['$dep_package_name'] = 'workspace:^$NEW_VERSION'; - } else { - pkg.peerDependencies['$dep_package_name'] = '^$NEW_VERSION'; - } - updated = true; - } - - if (updated) { - fs.writeFileSync(path, JSON.stringify(pkg, null, 2) + '\n'); - } - } catch (error) { - console.error('Error updating dependencies:', error.message); - } - " 2>/dev/null - done < "$UPDATED_PACKAGES_FILE" - fi -done < "$PACKAGE_DATA_FILE" - -print_success "Updated internal dependencies across all packages" - -print_success "Version bump complete!" - -# Summary -echo -print_info "Summary of changes:" -echo -e " ${BLUE}Base version (from tag ${GIT_REVISION}):${NC} $BASE_VERSION" -echo -e " ${GREEN}New version (${BUMP_TYPE} bump):${NC} $NEW_VERSION" -echo -print_info "Updated packages:" -while IFS='|' read -r package_name new_version project_folder publish_flag old_version; do - if [ "$publish_flag" = "true" ]; then - echo -e " ${GREEN}āœ“${NC} $package_name: $old_version -> $new_version ${YELLOW}(will be published)${NC}" - else - echo -e " ${GREEN}āœ“${NC} $package_name: $old_version -> $new_version ${BLUE}(private package)${NC}" - fi -done < "$UPDATED_PACKAGES_FILE" - -echo -print_info "Next steps:" -echo " 1. Review the changes: git diff" -echo " 2. Update lockfile: rush update" -echo " 3. Run tests: rush test" -echo " 4. Build all packages: rush build" -echo " 5. Commit changes: git add . && git commit -m 'Bump all versions to $NEW_VERSION'" -echo " 6. Tag the release: git tag v$NEW_VERSION && git push origin v$NEW_VERSION" -echo " 7. For publishable packages, run: rush publish" - -# Cleanup -rm -rf "$TEMP_DIR" - -print_info "Running rush update to sync lockfile..." -rush update - -print_success "Done!" diff --git a/packages/measurements-otlp/package.json b/packages/measurements-otlp/package.json index 6026604f83..7ddba9c2db 100644 --- a/packages/measurements-otlp/package.json +++ b/packages/measurements-otlp/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/measurements-otlp", - "version": "0.7.7", + "version": "0.7.8", "main": "lib/index.js", "svelte": "src/index.ts", "types": "types/index.d.ts", @@ -27,7 +27,7 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.7", + "@hcengineering/platform-rig": "workspace:^0.7.8", "@typescript-eslint/eslint-plugin": "^6.11.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-promise": "^6.1.1", @@ -43,7 +43,7 @@ "@types/jest": "^29.5.5" }, "dependencies": { - "@hcengineering/measurements": "workspace:^0.7.7", + "@hcengineering/measurements": "workspace:^0.7.8", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-logs": "^0.203.0", "@opentelemetry/auto-instrumentations-node": "^0.62.0", diff --git a/packages/measurements/package.json b/packages/measurements/package.json index d1ef659d4a..e3b3b5601d 100644 --- a/packages/measurements/package.json +++ b/packages/measurements/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/measurements", - "version": "0.7.7", + "version": "0.7.8", "main": "lib/index.js", "svelte": "src/index.ts", "types": "types/index.d.ts", @@ -27,7 +27,7 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.7", + "@hcengineering/platform-rig": "workspace:^0.7.8", "@typescript-eslint/eslint-plugin": "^6.11.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-promise": "^6.1.1", diff --git a/packages/platform-rig/.npmignore b/packages/platform-rig/.npmignore new file mode 100644 index 0000000000..7226095165 --- /dev/null +++ b/packages/platform-rig/.npmignore @@ -0,0 +1,4 @@ +* +!/bin/** +!/profiles/** +!package.json diff --git a/packages/platform-rig/bin/bump-changes-from-tag.js b/packages/platform-rig/bin/bump-changes-from-tag.js new file mode 100755 index 0000000000..f7369b2cb3 --- /dev/null +++ b/packages/platform-rig/bin/bump-changes-from-tag.js @@ -0,0 +1,392 @@ +#!/usr/bin/env node + +/** + * Script to bump version of ALL Node.js packages by incrementing from previous tag + * and update dependencies accordingly in a Rush.js monorepo + * + * Usage: node bump-changes-from-tag.js [git-revision] [major|minor|patch] + * Example: node bump-changes-from-tag.js # Auto-detect latest v*.*.* tag, patch bump + * Example: node bump-changes-from-tag.js patch # Auto-detect latest tag + patch bump + * Example: node bump-changes-from-tag.js minor # Auto-detect latest tag + minor bump + * Example: node bump-changes-from-tag.js v0.7.0 major # Use specific tag + major bump + */ + +const fs = require('fs') +const path = require('path') +const { execSync } = require('child_process') + +// Colors for output +const colors = { + RED: '\x1b[0;31m', + GREEN: '\x1b[0;32m', + YELLOW: '\x1b[1;33m', + BLUE: '\x1b[0;34m', + NC: '\x1b[0m' // No Color +} + +// Logging functions +function printInfo(message) { + console.log(`${colors.BLUE}[INFO]${colors.NC} ${message}`) +} + +function printSuccess(message) { + console.log(`${colors.GREEN}[SUCCESS]${colors.NC} ${message}`) +} + +function printWarning(message) { + console.log(`${colors.YELLOW}[WARNING]${colors.NC} ${message}`) +} + +function printError(message) { + console.error(`${colors.RED}[ERROR]${colors.NC} ${message}`) +} + +// Function to execute shell commands +function execCommand(command, options = {}) { + try { + return execSync(command, { encoding: 'utf8', ...options }).trim() + } catch (error) { + if (options.throwOnError !== false) { + throw error + } + return null + } +} + +// Function to get the latest tag matching pattern v*.*.* (e.g., v0.7.x) +function getLatestVersionTag() { + try { + // Get all tags matching v*.*.* pattern + const tags = execCommand("git tag -l 'v*.*.*'", { throwOnError: false }) + + if (!tags) { + printWarning('No version tags found matching v*.*.* pattern') + return null + } + + // Split tags, sort them, and pick the latest + const tagList = tags.split('\n').filter((tag) => tag.trim()) + if (tagList.length === 0) { + printWarning('No version tags found matching v*.*.* pattern') + return null + } + + // Sort version tags properly + const sortedTags = tagList.sort((a, b) => { + const versionA = a.replace('v', '').split('.').map(Number) + const versionB = b.replace('v', '').split('.').map(Number) + + for (let i = 0; i < 3; i++) { + if (versionA[i] !== versionB[i]) { + return versionA[i] - versionB[i] + } + } + return 0 + }) + + return sortedTags[sortedTags.length - 1] + } catch (error) { + printWarning('Failed to get latest version tag') + return null + } +} + +// Function to get version from tag (remove 'v' prefix if present) +function getTagVersion(tag) { + return tag.startsWith('v') ? tag.substring(1) : tag +} + +// Function to increment version based on bump type +function incrementVersion(version, bumpType) { + // Remove any pre-release suffix first + let baseVersion = version.split('-')[0] + let suffix = '' + if (version.includes('-')) { + suffix = '-' + version.split('-').slice(1).join('-') + } + + // Extract major.minor.patch + const parts = baseVersion.split('.') + let [major, minor, patch] = parts.map(Number) + + // Validate numeric components + if (isNaN(major) || isNaN(minor) || isNaN(patch)) { + printError(`Invalid version format: ${version}`) + process.exit(1) + } + + // Increment version based on bump type + switch (bumpType) { + case 'major': + major++ + minor = 0 + patch = 0 + break + case 'minor': + minor++ + patch = 0 + break + case 'patch': + patch++ + break + default: + printError(`Invalid bump type: ${bumpType}`) + process.exit(1) + } + + return `${major}.${minor}.${patch}${suffix}` +} + +// Function to get Rush projects from rush.json +function getRushProjects(rushJsonPath) { + try { + // Read and strip comments from JSON + let content = fs.readFileSync(rushJsonPath, 'utf8') + // Remove single line comments that start with // + content = content.replace(/^\s*\/\/.*$/gm, '') + // Remove multi-line comments /* ... */ + content = content.replace(/\/\*[\s\S]*?\*\//g, '') + + const rush = JSON.parse(content) + + if (!rush.projects || !Array.isArray(rush.projects)) { + printError('No projects found in rush.json') + return [] + } + + return rush.projects.map((project) => ({ + packageName: project.packageName, + projectFolder: project.projectFolder, + shouldPublish: project.shouldPublish || false + })) + } catch (error) { + printError(`Error parsing rush.json: ${error.message}`) + process.exit(1) + } +} + +// Function to update package.json version +function updatePackageVersion(packageFile, newVersion) { + printInfo(`Updating version in ${packageFile} to ${newVersion}`) + + try { + const pkg = JSON.parse(fs.readFileSync(packageFile, 'utf8')) + pkg.version = newVersion + fs.writeFileSync(packageFile, JSON.stringify(pkg, null, 2) + '\n') + } catch (error) { + printError(`Error updating package.json: ${error.message}`) + process.exit(1) + } +} + +// Function to update dependencies in package.json +function updateDependencies(packageFile, packageName, newVersion) { + try { + const pkg = JSON.parse(fs.readFileSync(packageFile, 'utf8')) + let updated = false + + // Helper function to update a dependency object + const updateDepObject = (depObj, depType) => { + if (depObj && depObj[packageName]) { + const oldDep = depObj[packageName] + if (oldDep.startsWith('workspace:')) { + depObj[packageName] = `workspace:^${newVersion}` + } else { + depObj[packageName] = `^${newVersion}` + } + updated = true + } + } + + // Update in dependencies, devDependencies, and peerDependencies + updateDepObject(pkg.dependencies, 'dependencies') + updateDepObject(pkg.devDependencies, 'devDependencies') + updateDepObject(pkg.peerDependencies, 'peerDependencies') + + if (updated) { + fs.writeFileSync(packageFile, JSON.stringify(pkg, null, 2) + '\n') + } + + return updated + } catch (error) { + printError(`Error updating dependencies: ${error.message}`) + return false + } +} + +// Main function +function main() { + const args = process.argv.slice(2) + let gitRevision + let bumpType = 'patch' + + // Parse command line arguments + if (args.length === 0) { + // No arguments provided - auto-detect tag and use patch + printInfo('No git revision provided, attempting to auto-detect latest version tag...') + gitRevision = getLatestVersionTag() + + if (!gitRevision) { + printError('Could not auto-detect latest version tag') + printError('') + printError('Usage: node bump-changes-from-tag.js [git-revision] [major|minor|patch]') + printError( + 'Example: node bump-changes-from-tag.js # Auto-detect latest v*.*.* tag, patch bump' + ) + printError('Example: node bump-changes-from-tag.js patch # Auto-detect latest tag + patch bump') + printError('Example: node bump-changes-from-tag.js minor # Auto-detect latest tag + minor bump') + printError('Example: node bump-changes-from-tag.js HEAD~5') + printError('Example: node bump-changes-from-tag.js HEAD~5 minor') + printError('Example: node bump-changes-from-tag.js v0.7.0 major') + process.exit(1) + } + + printSuccess(`Auto-detected latest version tag: ${gitRevision}`) + } else if (args[0] === 'major' || args[0] === 'minor' || args[0] === 'patch') { + // First argument is bump type - auto-detect tag + printInfo(`Bump type '${args[0]}' provided, attempting to auto-detect latest version tag...`) + gitRevision = getLatestVersionTag() + + if (!gitRevision) { + printError('Could not auto-detect latest version tag') + process.exit(1) + } + + printSuccess(`Auto-detected latest version tag: ${gitRevision}`) + bumpType = args[0] + } else { + // First argument is git revision + gitRevision = args[0] + bumpType = args[1] || 'patch' + } + + // Validate bump type + if (!['major', 'minor', 'patch'].includes(bumpType)) { + printError(`Invalid bump type: ${bumpType}`) + printError('Valid options are: major, minor, patch') + process.exit(1) + } + + // Get repository root + const repoRoot = execCommand('git rev-parse --show-toplevel') + const rushJsonPath = path.join(repoRoot, 'rush.json') + + // Verify we're in a git repository + if (!repoRoot) { + printError('Not in a git repository') + process.exit(1) + } + + // Verify rush.json exists + if (!fs.existsSync(rushJsonPath)) { + printError(`rush.json not found at ${rushJsonPath}`) + process.exit(1) + } + + printInfo(`Repository root: ${repoRoot}`) + printInfo(`Reference tag: ${gitRevision}`) + printInfo(`Bump type: ${bumpType}`) + + // Get base version from tag and calculate new version + const baseVersion = getTagVersion(gitRevision) + const newVersion = incrementVersion(baseVersion, bumpType) + + printInfo(`Base version from tag: ${baseVersion}`) + printSuccess(`New version for all packages: ${newVersion}`) + + // Get all Rush projects + printInfo('Getting all Rush projects...') + const projects = getRushProjects(rushJsonPath) + printInfo(`Found ${projects.length} package(s) to update`) + + // Track updated packages + const updatedPackages = [] + + // Step 1: Update all package versions to the new version + printInfo(`Updating all package versions to ${newVersion}...`) + for (const project of projects) { + const packageFile = path.join(repoRoot, project.projectFolder, 'package.json') + + if (fs.existsSync(packageFile)) { + try { + // Get current version + const pkg = JSON.parse(fs.readFileSync(packageFile, 'utf8')) + const currentVersion = pkg.version + + updatePackageVersion(packageFile, newVersion) + updatedPackages.push({ + packageName: project.packageName, + newVersion: newVersion, + projectFolder: project.projectFolder, + shouldPublish: project.shouldPublish, + oldVersion: currentVersion + }) + printSuccess(`Updated ${project.packageName}: ${currentVersion} -> ${newVersion}`) + } catch (error) { + printError(`Error reading version from ${packageFile}`) + process.exit(1) + } + } else { + printWarning(`package.json not found for ${project.packageName} at ${packageFile}`) + } + } + + // Step 2: Update all internal dependencies to reference the new version + printInfo(`Updating internal dependencies to version ${newVersion}...`) + for (const project of projects) { + const packageFile = path.join(repoRoot, project.projectFolder, 'package.json') + + if (fs.existsSync(packageFile)) { + // Update dependencies for each package in the monorepo + for (const depPackage of updatedPackages) { + updateDependencies(packageFile, depPackage.packageName, newVersion) + } + } + } + + printSuccess('Updated internal dependencies across all packages') + printSuccess('Version bump complete!') + + // Summary + console.log() + printInfo('Summary of changes:') + console.log(` ${colors.BLUE}Base version (from tag ${gitRevision}):${colors.NC} ${baseVersion}`) + console.log(` ${colors.GREEN}New version (${bumpType} bump):${colors.NC} ${newVersion}`) + console.log() + printInfo('Updated packages:') + + for (const pkg of updatedPackages) { + if (pkg.shouldPublish) { + console.log( + ` ${colors.GREEN}āœ“${colors.NC} ${pkg.packageName}: ${pkg.oldVersion} -> ${pkg.newVersion} ${colors.YELLOW}(will be published)${colors.NC}` + ) + } else { + console.log( + ` ${colors.GREEN}āœ“${colors.NC} ${pkg.packageName}: ${pkg.oldVersion} -> ${pkg.newVersion} ${colors.BLUE}(private package)${colors.NC}` + ) + } + } + + console.log() + printInfo('Next steps:') + console.log(' 1. Review the changes: git diff') + console.log(' 2. Update lockfile: rush update') + console.log(' 3. Run tests: rush test') + console.log(' 4. Build all packages: rush build') + console.log(` 5. Commit changes: git add . && git commit -m 'Bump all versions to ${newVersion}'`) + console.log(` 6. Tag the release: git tag v${newVersion} && git push origin v${newVersion}`) + console.log(' 7. For publishable packages, run: rush publish') + + // Run rush update to sync lockfile + printInfo('Running rush update to sync lockfile...') + try { + execSync('rush update', { stdio: 'inherit', cwd: repoRoot }) + printSuccess('Done!') + } catch (error) { + printError('Failed to run rush update') + process.exit(1) + } +} + +// Run the script +main() diff --git a/packages/platform-rig/package.json b/packages/platform-rig/package.json index eee1202e21..51b0942b58 100644 --- a/packages/platform-rig/package.json +++ b/packages/platform-rig/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/platform-rig", - "version": "0.7.7", + "version": "0.7.8", "scripts": { "build": "echo 'Not required'", "format": "echo 'Not required'" diff --git a/packages/postgres-base/package.json b/packages/postgres-base/package.json index d2eb0d6dbb..ee42ef9384 100644 --- a/packages/postgres-base/package.json +++ b/packages/postgres-base/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/postgres-base", - "version": "0.7.7", + "version": "0.7.8", "main": "lib/index.js", "svelte": "src/index.ts", "types": "types/index.d.ts", @@ -28,7 +28,7 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.7", + "@hcengineering/platform-rig": "workspace:^0.7.8", "@typescript-eslint/eslint-plugin": "^6.11.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-promise": "^6.1.1", diff --git a/scripts/bump-version.sh b/scripts/bump-version.sh deleted file mode 100755 index cb0ebf9aec..0000000000 --- a/scripts/bump-version.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash - -# Exit immediately if a command exits with a non-zero status -set -e - -# Ensure Rush is installed -if [ ! -f "common/scripts/install-run-rush.js" ]; then - echo "Rush.js is not installed. Please ensure Rush is set up correctly." - exit 1 -fi - -# Bump versions using Rush -node common/scripts/install-run-rush.js version --bump --override-bump minor - -# Commit the changes -git add . -git commit -m "Bump versions using Rush.js" - -echo "Version bump completed successfully." From 9a1c064a9bd0c9a4808705c37e9c072cdffe087b Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Mon, 6 Oct 2025 23:38:29 +0700 Subject: [PATCH 13/40] Fix utils --- packages/platform-rig/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/platform-rig/package.json b/packages/platform-rig/package.json index 51b0942b58..dedb07f79c 100644 --- a/packages/platform-rig/package.json +++ b/packages/platform-rig/package.json @@ -20,7 +20,8 @@ "format": "./bin/format.js", "compile": "./bin/compile.js", "do-svelte-check": "./bin/do-svelte-check.js", - "bump-package-version": "./bin/bump-package-version.js" + "bump-package-version": "./bin/bump-package-version.js", + "bump-changes-from-tag": "./bin/bump-changes-from-tag.js" }, "peerDependencies": { "@typescript-eslint/eslint-plugin": "^6.11.0", From fa6ab2e87a59dd7a5e148edbcfe6d0a04b2ec89b Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Tue, 7 Oct 2025 13:13:49 +0700 Subject: [PATCH 14/40] 0.7.9 --- common/config/rush/command-line.json | 16 ---------------- common/config/rush/pnpm-lock.yaml | 8 ++++---- packages/measurements-otlp/package.json | 6 +++--- packages/measurements/package.json | 4 ++-- packages/platform-rig/package.json | 2 +- packages/postgres-base/package.json | 4 ++-- 6 files changed, 12 insertions(+), 28 deletions(-) diff --git a/common/config/rush/command-line.json b/common/config/rush/command-line.json index 5b39ca5861..030763e930 100644 --- a/common/config/rush/command-line.json +++ b/common/config/rush/command-line.json @@ -331,22 +331,6 @@ "description": "Clean package-deps-*.json files", "safeForSimultaneousRushProcesses": true, "shellCommand": "find .|grep .rush/temp/package-deps_ | xargs rm" - }, - { - "commandKind": "global", - "name": "fast-format", - "summary": "Format changed projects", - "description": "Format and autofix linting issues in changed projects", - "safeForSimultaneousRushProcesses": true, - "shellCommand": "./common/scripts/fast-format.sh" - }, - { - "commandKind": "global", - "name": "desktop", - "summary": "Build desktop build", - "description": "use to build all docker containers required for platform", - "safeForSimultaneousRushProcesses": true, - "shellCommand": "rush package -p 20 --to desktop && cd ./desktop-package && rushx dist" } ], diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index efbc5704d1..783796cd03 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -13,7 +13,7 @@ importers: ../../packages/measurements: devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.8 + specifier: workspace:^0.7.9 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 @@ -58,7 +58,7 @@ importers: ../../packages/measurements-otlp: dependencies: '@hcengineering/measurements': - specifier: workspace:^0.7.8 + specifier: workspace:^0.7.9 version: link:../measurements '@opentelemetry/api': specifier: ^1.9.0 @@ -104,7 +104,7 @@ importers: version: 2.1.0(@opentelemetry/api@1.9.0) devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.8 + specifier: workspace:^0.7.9 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 @@ -166,7 +166,7 @@ importers: version: 3.4.7 devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.8 + specifier: workspace:^0.7.9 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 diff --git a/packages/measurements-otlp/package.json b/packages/measurements-otlp/package.json index 7ddba9c2db..da48ddfb77 100644 --- a/packages/measurements-otlp/package.json +++ b/packages/measurements-otlp/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/measurements-otlp", - "version": "0.7.8", + "version": "0.7.9", "main": "lib/index.js", "svelte": "src/index.ts", "types": "types/index.d.ts", @@ -27,7 +27,7 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.8", + "@hcengineering/platform-rig": "workspace:^0.7.9", "@typescript-eslint/eslint-plugin": "^6.11.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-promise": "^6.1.1", @@ -43,7 +43,7 @@ "@types/jest": "^29.5.5" }, "dependencies": { - "@hcengineering/measurements": "workspace:^0.7.8", + "@hcengineering/measurements": "workspace:^0.7.9", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-logs": "^0.203.0", "@opentelemetry/auto-instrumentations-node": "^0.62.0", diff --git a/packages/measurements/package.json b/packages/measurements/package.json index e3b3b5601d..fa633dbbb9 100644 --- a/packages/measurements/package.json +++ b/packages/measurements/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/measurements", - "version": "0.7.8", + "version": "0.7.9", "main": "lib/index.js", "svelte": "src/index.ts", "types": "types/index.d.ts", @@ -27,7 +27,7 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.8", + "@hcengineering/platform-rig": "workspace:^0.7.9", "@typescript-eslint/eslint-plugin": "^6.11.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-promise": "^6.1.1", diff --git a/packages/platform-rig/package.json b/packages/platform-rig/package.json index dedb07f79c..2127c47ec4 100644 --- a/packages/platform-rig/package.json +++ b/packages/platform-rig/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/platform-rig", - "version": "0.7.8", + "version": "0.7.9", "scripts": { "build": "echo 'Not required'", "format": "echo 'Not required'" diff --git a/packages/postgres-base/package.json b/packages/postgres-base/package.json index ee42ef9384..e65fc2142f 100644 --- a/packages/postgres-base/package.json +++ b/packages/postgres-base/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/postgres-base", - "version": "0.7.8", + "version": "0.7.9", "main": "lib/index.js", "svelte": "src/index.ts", "types": "types/index.d.ts", @@ -28,7 +28,7 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.8", + "@hcengineering/platform-rig": "workspace:^0.7.9", "@typescript-eslint/eslint-plugin": "^6.11.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-promise": "^6.1.1", From 206f306fe684fb393350df09582181548ae4ae99 Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Tue, 7 Oct 2025 15:58:59 +0700 Subject: [PATCH 15/40] rewrite using typescript as a library for compile --- common/config/rush/pnpm-lock.yaml | 24 ----- packages/measurements-otlp/package.json | 2 - packages/measurements/package.json | 2 - packages/platform-rig/bin/compile.js | 126 +++++++++++++++++------- packages/postgres-base/package.json | 1 - 5 files changed, 90 insertions(+), 65 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 783796cd03..7282c0c2aa 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -45,15 +45,9 @@ importers: prettier: specifier: ^3.1.0 version: 3.6.2 - simplytyped: - specifier: ^3.3.0 - version: 3.3.0(typescript@5.9.2) ts-jest: specifier: ^29.1.1 version: 29.4.1(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest-util@29.7.0)(jest@29.7.0(@types/node@22.18.1))(typescript@5.9.2) - typescript: - specifier: ^5.8.3 - version: 5.9.2 ../../packages/measurements-otlp: dependencies: @@ -136,15 +130,9 @@ importers: prettier: specifier: ^3.1.0 version: 3.6.2 - simplytyped: - specifier: ^3.3.0 - version: 3.3.0(typescript@5.9.2) ts-jest: specifier: ^29.1.1 version: 29.4.1(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest-util@29.7.0)(jest@29.7.0(@types/node@22.18.1))(typescript@5.9.2) - typescript: - specifier: ^5.8.3 - version: 5.9.2 ../../packages/platform-rig: dependencies: @@ -204,9 +192,6 @@ importers: ts-jest: specifier: ^29.1.1 version: 29.4.1(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest-util@29.7.0)(jest@29.7.0(@types/node@22.18.1))(typescript@5.9.2) - typescript: - specifier: ^5.8.3 - version: 5.9.2 packages: @@ -2779,11 +2764,6 @@ packages: signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - simplytyped@3.3.0: - resolution: {integrity: sha512-mz4RaNdKTZiaKXgi6P1k/cdsxV3gz+y1Wh2NXHWD40dExktLh4Xx/h6MFakmQWODZHj/2rKe59acacpL74ZhQA==} - peerDependencies: - typescript: '>=2.8.0' - sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -6337,10 +6317,6 @@ snapshots: signal-exit@3.0.7: {} - simplytyped@3.3.0(typescript@5.9.2): - dependencies: - typescript: 5.9.2 - sisteransi@1.0.5: {} slash@3.0.0: {} diff --git a/packages/measurements-otlp/package.json b/packages/measurements-otlp/package.json index da48ddfb77..208490cffd 100644 --- a/packages/measurements-otlp/package.json +++ b/packages/measurements-otlp/package.json @@ -33,11 +33,9 @@ "eslint-plugin-promise": "^6.1.1", "eslint-plugin-n": "^15.4.0", "eslint": "^8.54.0", - "simplytyped": "^3.3.0", "@typescript-eslint/parser": "^6.11.0", "eslint-config-standard-with-typescript": "^40.0.0", "prettier": "^3.1.0", - "typescript": "^5.8.3", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5" diff --git a/packages/measurements/package.json b/packages/measurements/package.json index fa633dbbb9..16d202f753 100644 --- a/packages/measurements/package.json +++ b/packages/measurements/package.json @@ -33,11 +33,9 @@ "eslint-plugin-promise": "^6.1.1", "eslint-plugin-n": "^15.4.0", "eslint": "^8.54.0", - "simplytyped": "^3.3.0", "@typescript-eslint/parser": "^6.11.0", "eslint-config-standard-with-typescript": "^40.0.0", "prettier": "^3.1.0", - "typescript": "^5.8.3", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5" diff --git a/packages/platform-rig/bin/compile.js b/packages/platform-rig/bin/compile.js index 07ebe3e9cd..ae9b97840b 100755 --- a/packages/platform-rig/bin/compile.js +++ b/packages/platform-rig/bin/compile.js @@ -1,15 +1,25 @@ -const { join, dirname, basename } = require("path") -const { readFileSync, existsSync, mkdirSync, createWriteStream, readdirSync, lstatSync, rmSync } = require('fs') +const { join, dirname, basename } = require('path') +const { + readFileSync, + existsSync, + mkdirSync, + createWriteStream, + readdirSync, + lstatSync, + rmSync, + writeFileSync +} = require('fs') const { spawn } = require('child_process') const esbuild = require('esbuild') const { copy } = require('esbuild-plugin-copy') const fs = require('fs') +const ts = require('typescript') -async function execProcess(cmd, logFile, args, buildDir= '.build') { +async function execProcess(cmd, logFile, args, buildDir = '.build') { let compileRoot = dirname(dirname(process.argv[1])) - console.log('Running from',) - console.log("Compiling...\n", process.cwd(), args) + console.log('Running from') + console.log('Compiling...\n', process.cwd(), args) if (!existsSync(join(process.cwd(), buildDir))) { mkdirSync(join(process.cwd(), buildDir)) @@ -20,7 +30,6 @@ async function execProcess(cmd, logFile, args, buildDir= '.build') { const stdoutFilePath = `${buildDir}/${logFile}.log` const stderrFilePath = `${buildDir}/${logFile}-err.log` - const outPromise = new Promise((resolve) => { if (compileOut.stdout != null) { let outPipe = createWriteStream(stdoutFilePath) @@ -48,7 +57,7 @@ async function execProcess(cmd, logFile, args, buildDir= '.build') { }) let editCode = 0 - const closePromise = new Promise(resolve => { + const closePromise = new Promise((resolve) => { compileOut.on('close', (code) => { editCode = code resolve() @@ -90,8 +99,8 @@ function collectFiles(source) { return result } -function collectFileStats(source, result) { - if( !existsSync(source)) { +function collectFileStats(source, result) { + if (!existsSync(source)) { return } const files = readdirSync(source) @@ -111,8 +120,8 @@ function collectFileStats(source, result) { } function cleanNonModified(before, after) { - for( const [k,v] of Object.entries(before)) { - if( after[k] === v) { + for (const [k, v] of Object.entries(before)) { + if (after[k] === v) { // Same modify date, looks like not modified console.log('clean file', k) rmSync(k) @@ -132,9 +141,8 @@ switch (args[0]) { const after = {} collectFileStats('lib', before) - performESBuild(filesToTranspile) - .then(() => { - console.log("Transpile time: ", Math.round((performance.now() - st) * 100) / 100) + performESBuild(filesToTranspile).then(() => { + console.log('Transpile time: ', Math.round((performance.now() - st) * 100) / 100) collectFileStats('lib', after) cleanNonModified(before, after) }) @@ -143,22 +151,16 @@ switch (args[0]) { case 'validate': { let st = performance.now() validateTSC(st).then(() => { - console.log("Validate time: ", Math.round((performance.now() - st) * 100) / 100) + console.log('Validate time: ', Math.round((performance.now() - st) * 100) / 100) }) break } default: { let st = performance.now() const filesToTranspile = collectFiles(join(process.cwd(), 'src')) - Promise.all( - [ - performESBuild(filesToTranspile), - validateTSC() - ] - ) - .then(() => { - console.log("Full build time: ", Math.round((performance.now() - st) * 100) / 100) - }) + Promise.all([performESBuild(filesToTranspile), validateTSC()]).then(() => { + console.log('Full build time: ', Math.round((performance.now() - st) * 100) / 100) + }) break } } @@ -180,7 +182,7 @@ async function performESBuild(filesToTranspile) { resolveFrom: 'cwd', assets: { from: [args[1] + '/**/*.json'], - to: ['./lib'], + to: ['./lib'] }, watch: false }) @@ -189,15 +191,67 @@ async function performESBuild(filesToTranspile) { } async function validateTSC(st) { - await execProcess( - 'tsc', - 'validate', - [ - '-pretty', - "--emitDeclarationOnly", - "--incremental", - "--tsBuildInfoFile", ".validate/tsBuildInfoFile.info", - ...args.splice(1) - ], '.validate') -} + const buildDir = '.validate' + if (!existsSync(buildDir)) { + mkdirSync(buildDir, { recursive: true }) + } + + const stdoutFilePath = `${buildDir}/validate.log` + const stderrFilePath = `${buildDir}/validate-err.log` + + // Read tsconfig.json + const configPath = ts.findConfigFile(process.cwd(), ts.sys.fileExists, 'tsconfig.json') + + if (!configPath) { + console.error('Could not find tsconfig.json') + process.exit(1) + } + + const configFile = ts.readConfigFile(configPath, ts.sys.readFile) + const parsedConfig = ts.parseJsonConfigFileContent(configFile.config, ts.sys, process.cwd(), { + emitDeclarationOnly: true, + incremental: true, + tsBuildInfoFile: join(buildDir, 'tsBuildInfoFile.info') + }) + + // Create the TypeScript program + const program = ts.createProgram({ + rootNames: parsedConfig.fileNames, + options: parsedConfig.options + }) + + // Get diagnostics + const emitResult = program.emit() + const allDiagnostics = ts.getPreEmitDiagnostics(program).concat(emitResult.diagnostics) + + const stdout = [] + const stderr = [] + + // Format diagnostics + allDiagnostics.forEach((diagnostic) => { + if (diagnostic.file) { + const { line, character } = ts.getLineAndCharacterOfPosition(diagnostic.file, diagnostic.start) + const message = ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n') + const output = `${diagnostic.file.fileName}(${line + 1},${character + 1}): error TS${diagnostic.code}: ${message}` + stderr.push(output) + } else { + const message = ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n') + stderr.push(`error TS${diagnostic.code}: ${message}`) + } + }) + + // Write logs + writeFileSync(stdoutFilePath, stdout.join('\n')) + writeFileSync(stderrFilePath, stderr.join('\n')) + + if (allDiagnostics.length > 0) { + console.error('\n' + stderr.join('\n')) + process.exit(1) + } + + const exitCode = emitResult.emitSkipped ? 1 : 0 + if (exitCode !== 0) { + process.exit(exitCode) + } +} diff --git a/packages/postgres-base/package.json b/packages/postgres-base/package.json index e65fc2142f..f9d07634ce 100644 --- a/packages/postgres-base/package.json +++ b/packages/postgres-base/package.json @@ -37,7 +37,6 @@ "@typescript-eslint/parser": "^6.11.0", "eslint-config-standard-with-typescript": "^40.0.0", "prettier": "^3.1.0", - "typescript": "^5.8.3", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5", From 78527e82121df778db98c0367b8b712461080848 Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Tue, 7 Oct 2025 16:05:40 +0700 Subject: [PATCH 16/40] Rewrite eslint/prettier to use libraries --- common/config/rush/pnpm-lock.yaml | 94 +++++---------- packages/measurements-otlp/package.json | 8 -- packages/measurements/package.json | 8 -- packages/platform-rig/bin/format.js | 148 +++++++++++++++--------- packages/platform-rig/package.json | 24 ++-- packages/postgres-base/package.json | 8 -- 6 files changed, 131 insertions(+), 159 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 7282c0c2aa..a68c3f5607 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -18,33 +18,9 @@ importers: '@types/jest': specifier: ^29.5.5 version: 29.5.14 - '@typescript-eslint/eslint-plugin': - specifier: ^6.11.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2) - '@typescript-eslint/parser': - specifier: ^6.11.0 - version: 6.21.0(eslint@8.57.1)(typescript@5.9.2) - eslint: - specifier: ^8.54.0 - version: 8.57.1 - eslint-config-standard-with-typescript: - specifier: ^40.0.0 - version: 40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.2) - eslint-plugin-import: - specifier: ^2.26.0 - version: 2.32.0(eslint@8.57.1) - eslint-plugin-n: - specifier: ^15.4.0 - version: 15.7.0(eslint@8.57.1) - eslint-plugin-promise: - specifier: ^6.1.1 - version: 6.6.0(eslint@8.57.1) jest: specifier: ^29.7.0 version: 29.7.0(@types/node@22.18.1) - prettier: - specifier: ^3.1.0 - version: 3.6.2 ts-jest: specifier: ^29.1.1 version: 29.4.1(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest-util@29.7.0)(jest@29.7.0(@types/node@22.18.1))(typescript@5.9.2) @@ -103,12 +79,27 @@ importers: '@types/jest': specifier: ^29.5.5 version: 29.5.14 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@22.18.1) + ts-jest: + specifier: ^29.1.1 + version: 29.4.1(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest-util@29.7.0)(jest@29.7.0(@types/node@22.18.1))(typescript@5.9.2) + + ../../packages/platform-rig: + dependencies: '@typescript-eslint/eslint-plugin': specifier: ^6.11.0 version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2) '@typescript-eslint/parser': specifier: ^6.11.0 version: 6.21.0(eslint@8.57.1)(typescript@5.9.2) + esbuild: + specifier: ^0.25.9 + version: 0.25.9 + esbuild-plugin-copy: + specifier: ^2.1.1 + version: 2.1.1(esbuild@0.25.9) eslint: specifier: ^8.54.0 version: 8.57.1 @@ -124,25 +115,9 @@ importers: eslint-plugin-promise: specifier: ^6.1.1 version: 6.6.0(eslint@8.57.1) - jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@22.18.1) prettier: specifier: ^3.1.0 version: 3.6.2 - ts-jest: - specifier: ^29.1.1 - version: 29.4.1(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest-util@29.7.0)(jest@29.7.0(@types/node@22.18.1))(typescript@5.9.2) - - ../../packages/platform-rig: - dependencies: - esbuild: - specifier: ^0.25.9 - version: 0.25.9 - esbuild-plugin-copy: - specifier: ^2.1.1 - version: 2.1.1(esbuild@0.25.9) - devDependencies: typescript: specifier: ^5.8.3 version: 5.9.2 @@ -162,33 +137,9 @@ importers: '@types/node': specifier: ^22.15.29 version: 22.18.1 - '@typescript-eslint/eslint-plugin': - specifier: ^6.11.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2) - '@typescript-eslint/parser': - specifier: ^6.11.0 - version: 6.21.0(eslint@8.57.1)(typescript@5.9.2) - eslint: - specifier: ^8.54.0 - version: 8.57.1 - eslint-config-standard-with-typescript: - specifier: ^40.0.0 - version: 40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.2) - eslint-plugin-import: - specifier: ^2.26.0 - version: 2.32.0(eslint@8.57.1) - eslint-plugin-n: - specifier: ^15.4.0 - version: 15.7.0(eslint@8.57.1) - eslint-plugin-promise: - specifier: ^6.1.1 - version: 6.6.0(eslint@8.57.1) jest: specifier: ^29.7.0 version: 29.7.0(@types/node@22.18.1) - prettier: - specifier: ^3.1.0 - version: 3.6.2 ts-jest: specifier: ^29.1.1 version: 29.4.1(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest-util@29.7.0)(jest@29.7.0(@types/node@22.18.1))(typescript@5.9.2) @@ -1897,6 +1848,10 @@ packages: resolution: {integrity: sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==} engines: {node: '>=14'} + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -2092,8 +2047,8 @@ packages: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} engines: {node: '>=6'} - is-generator-function@1.1.0: - resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} engines: {node: '>= 0.4'} is-glob@4.0.3: @@ -5253,6 +5208,8 @@ snapshots: - encoding - supports-color + generator-function@2.0.1: {} + gensync@1.0.0-beta.2: {} get-caller-file@2.0.5: {} @@ -5460,9 +5417,10 @@ snapshots: is-generator-fn@2.1.0: {} - is-generator-function@1.1.0: + is-generator-function@1.1.2: dependencies: call-bound: 1.0.4 + generator-function: 2.0.1 get-proto: 1.0.1 has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 @@ -6548,7 +6506,7 @@ snapshots: is-async-function: 2.1.1 is-date-object: 1.1.0 is-finalizationregistry: 1.1.1 - is-generator-function: 1.1.0 + is-generator-function: 1.1.2 is-regex: 1.2.1 is-weakref: 1.1.1 isarray: 2.0.5 diff --git a/packages/measurements-otlp/package.json b/packages/measurements-otlp/package.json index 208490cffd..0ec6b135c6 100644 --- a/packages/measurements-otlp/package.json +++ b/packages/measurements-otlp/package.json @@ -28,14 +28,6 @@ }, "devDependencies": { "@hcengineering/platform-rig": "workspace:^0.7.9", - "@typescript-eslint/eslint-plugin": "^6.11.0", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-promise": "^6.1.1", - "eslint-plugin-n": "^15.4.0", - "eslint": "^8.54.0", - "@typescript-eslint/parser": "^6.11.0", - "eslint-config-standard-with-typescript": "^40.0.0", - "prettier": "^3.1.0", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5" diff --git a/packages/measurements/package.json b/packages/measurements/package.json index 16d202f753..f62785b1cd 100644 --- a/packages/measurements/package.json +++ b/packages/measurements/package.json @@ -28,14 +28,6 @@ }, "devDependencies": { "@hcengineering/platform-rig": "workspace:^0.7.9", - "@typescript-eslint/eslint-plugin": "^6.11.0", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-promise": "^6.1.1", - "eslint-plugin-n": "^15.4.0", - "eslint": "^8.54.0", - "@typescript-eslint/parser": "^6.11.0", - "eslint-config-standard-with-typescript": "^40.0.0", - "prettier": "^3.1.0", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5" diff --git a/packages/platform-rig/bin/format.js b/packages/platform-rig/bin/format.js index 26f4510b68..e6ae1254e0 100755 --- a/packages/platform-rig/bin/format.js +++ b/packages/platform-rig/bin/format.js @@ -10,8 +10,9 @@ const { rmSync, current } = require('fs') -const { spawnSync, execSync } = require('child_process') const crypto = require('crypto') +const prettier = require('prettier') +const { ESLint } = require('eslint') if (!existsSync('.format')) { mkdirSync('.format', { recursive: true }) @@ -91,61 +92,102 @@ if (process.argv.includes('-f') || process.argv.includes('--force')) { } if (filesToCheck.length > 0) { - console.info(`running prettier ${filesToCheck.length}`) - // Changes detected. - const prettier = spawnSync(join(process.cwd(), 'node_modules/.bin/prettier'), ['--color', '--write', ...filesToCheck]) - if (prettier.stdout != null) { - writeFileSync('.format/prettier.log', prettier.stdout) - if (prettier.status === null || prettier.status === 0) { - console.info(prettier.stdout.toString()) - } else { - console.error(prettier.stdout.toString()) - } - } - if (prettier.stderr != null) { - writeFileSync('.format/prettier.err', prettier.stderr) - const data = prettier.stderr.toString() - if (data.length > 0) { - console.error(data) - } - } + ;(async () => { + try { + console.info(`running prettier ${filesToCheck.length}`) - console.log(`running eslint ${filesToCheck.length}`) - const eslint = spawnSync(join(process.cwd(), 'node_modules/.bin/eslint'), ['--color', '--fix', ...filesToCheck], { - env: { ...process.env, NODE_ENV: '--max-old-space-size=4096' } - }) - if (eslint.stdout != null) { - writeFileSync('.format/eslint.log', eslint.stdout) - if (prettier.status === null || prettier.status === 0) { - console.info(eslint.stdout.toString()) - } else { - console.error(eslint.stdout.toString()) - } - } - if (eslint.stderr != null) { - writeFileSync('.format/eslint.err', eslint.stderr) - const data = eslint.stderr.toString() - if (data.length > 0) { - console.error(data) - } - } - console.log(eslint.error, prettier.error) - if (prettier.status || eslint.status || eslint.error || prettier.error) { - console.info('prettier or eslint failed', prettier.status, eslint.status, prettier.error, eslint.error) - // Make file empty, to prevent false passing if called without -f or --force. - writeFileSync('.format/format.json', JSON.stringify({}, undefined, 2)) - process.exit(1) - } + // Run Prettier + const prettierLog = [] + const prettierErrors = [] - hash = newHash - for (const v of process.argv.slice(2)) { - if (existsSync(v)) { - calcHash(join(process.cwd(), v), 'updated') + for (const file of filesToCheck) { + try { + const options = await prettier.resolveConfig(file) + const fileInfo = await prettier.getFileInfo(file) + + if (!fileInfo.ignored) { + const input = readFileSync(file, 'utf8') + const formatted = await prettier.format(input, { + ...options, + filepath: file + }) + + if (input !== formatted) { + writeFileSync(file, formatted, 'utf8') + prettierLog.push(`Formatted: ${relative(process.cwd(), file)}`) + } + } + } catch (error) { + prettierErrors.push(`Error formatting ${file}: ${error.message}`) + } + } + + const prettierLogData = prettierLog.join('\n') + const prettierErrData = prettierErrors.join('\n') + + if (prettierLogData) { + writeFileSync('.format/prettier.log', prettierLogData) + console.info(prettierLogData) + } + + if (prettierErrData) { + writeFileSync('.format/prettier.err', prettierErrData) + console.error(prettierErrData) + } + + console.log(`running eslint ${filesToCheck.length}`) + + // Run ESLint + const eslint = new ESLint({ fix: true }) + const results = await eslint.lintFiles(filesToCheck) + + // Apply fixes + await ESLint.outputFixes(results) + + const formatter = await eslint.loadFormatter('stylish') + const resultText = formatter.format(results) + + writeFileSync('.format/eslint.log', resultText) + + // Check for errors + const hasErrors = results.some((result) => result.errorCount > 0) + const hasWarnings = results.some((result) => result.warningCount > 0) + + if (resultText) { + if (hasErrors) { + console.error(resultText) + } else { + console.info(resultText) + } + } + + const prettierFailed = prettierErrors.length > 0 + const eslintFailed = hasErrors + + if (prettierFailed || eslintFailed) { + console.info('prettier or eslint failed') + // Make file empty, to prevent false passing if called without -f or --force. + writeFileSync('.format/format.json', JSON.stringify({}, undefined, 2)) + process.exit(1) + } + + hash = newHash + for (const v of process.argv.slice(2)) { + if (existsSync(v)) { + calcHash(join(process.cwd(), v), 'updated') + } + } + writeFileSync('.format/format.json', JSON.stringify(newHash, undefined, 2)) + + console.info('Formatting completed successfully.') + process.exit(0) + } catch (error) { + console.error('Formatting failed:', error) + writeFileSync('.format/format.json', JSON.stringify({}, undefined, 2)) + process.exit(1) } - } - writeFileSync('.format/format.json', JSON.stringify(newHash, undefined, 2)) + })() } else { console.info('No changes detected.') + process.exit(0) } - -process.exit(0) diff --git a/packages/platform-rig/package.json b/packages/platform-rig/package.json index 2127c47ec4..b03245864e 100644 --- a/packages/platform-rig/package.json +++ b/packages/platform-rig/package.json @@ -9,12 +9,18 @@ "./bin/*": "./bin/*", "./profiles/*": "./profiles/*" }, - "devDependencies": { - "typescript": "^5.8.3" - }, "dependencies": { + "typescript": "^5.8.3", "esbuild": "^0.25.9", - "esbuild-plugin-copy": "^2.1.1" + "esbuild-plugin-copy": "^2.1.1", + "@typescript-eslint/eslint-plugin": "^6.11.0", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-n": "^15.4.0", + "eslint": "^8.54.0", + "@typescript-eslint/parser": "^6.11.0", + "eslint-config-standard-with-typescript": "^40.0.0", + "prettier": "^3.1.0" }, "bin": { "format": "./bin/format.js", @@ -23,16 +29,6 @@ "bump-package-version": "./bin/bump-package-version.js", "bump-changes-from-tag": "./bin/bump-changes-from-tag.js" }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^6.11.0", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-promise": "^6.1.1", - "eslint-plugin-n": "^15.4.0", - "eslint": "^8.54.0", - "@typescript-eslint/parser": "^6.11.0", - "eslint-config-standard-with-typescript": "^40.0.0", - "prettier": "^3.0.0" - }, "publishConfig": { "access": "public" } diff --git a/packages/postgres-base/package.json b/packages/postgres-base/package.json index f9d07634ce..98d708eb8d 100644 --- a/packages/postgres-base/package.json +++ b/packages/postgres-base/package.json @@ -29,14 +29,6 @@ }, "devDependencies": { "@hcengineering/platform-rig": "workspace:^0.7.9", - "@typescript-eslint/eslint-plugin": "^6.11.0", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-promise": "^6.1.1", - "eslint-plugin-n": "^15.4.0", - "eslint": "^8.54.0", - "@typescript-eslint/parser": "^6.11.0", - "eslint-config-standard-with-typescript": "^40.0.0", - "prettier": "^3.1.0", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5", From 5f5a6f0189bbce7018d5c3be2ecf7d4e6e57e22c Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Tue, 7 Oct 2025 16:09:49 +0700 Subject: [PATCH 17/40] Add bump-changes --- common/config/rush/command-line.json | 8 ++++++++ common/config/rush/pnpm-lock.yaml | 14 ++++++++++---- common/scripts/package.json | 11 +++++++++++ packages/measurements-otlp/package.json | 6 +++--- packages/measurements/package.json | 4 ++-- packages/platform-rig/package.json | 2 +- packages/postgres-base/package.json | 4 ++-- rush.json | 5 +++++ 8 files changed, 42 insertions(+), 12 deletions(-) create mode 100644 common/scripts/package.json diff --git a/common/config/rush/command-line.json b/common/config/rush/command-line.json index 030763e930..c3824932df 100644 --- a/common/config/rush/command-line.json +++ b/common/config/rush/command-line.json @@ -331,6 +331,14 @@ "description": "Clean package-deps-*.json files", "safeForSimultaneousRushProcesses": true, "shellCommand": "find .|grep .rush/temp/package-deps_ | xargs rm" + }, + { + "commandKind": "global", + "name": "bump-changes", + "summary": "Bump changes from tag", + "description": "Bump changes from previous tag", + "safeForSimultaneousRushProcesses": true, + "shellCommand": "./common/scripts/node_modules/.bin/bump-changes-from-tag" } ], diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index a68c3f5607..f3b0ad1167 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -13,7 +13,7 @@ importers: ../../packages/measurements: devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.9 + specifier: workspace:^0.7.10 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 @@ -28,7 +28,7 @@ importers: ../../packages/measurements-otlp: dependencies: '@hcengineering/measurements': - specifier: workspace:^0.7.9 + specifier: workspace:^0.7.10 version: link:../measurements '@opentelemetry/api': specifier: ^1.9.0 @@ -74,7 +74,7 @@ importers: version: 2.1.0(@opentelemetry/api@1.9.0) devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.9 + specifier: workspace:^0.7.10 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 @@ -129,7 +129,7 @@ importers: version: 3.4.7 devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.9 + specifier: workspace:^0.7.10 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 @@ -144,6 +144,12 @@ importers: specifier: ^29.1.1 version: 29.4.1(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest-util@29.7.0)(jest@29.7.0(@types/node@22.18.1))(typescript@5.9.2) + ../scripts: + devDependencies: + '@hcengineering/platform-rig': + specifier: workspace:^0.7.10 + version: link:../../packages/platform-rig + packages: '@babel/code-frame@7.27.1': diff --git a/common/scripts/package.json b/common/scripts/package.json new file mode 100644 index 0000000000..0fceb28c27 --- /dev/null +++ b/common/scripts/package.json @@ -0,0 +1,11 @@ +{ + "name": "@hcengineering/scripts", + "version": "0.7.10", + "scripts": { + "format": "echo \"No format specified\"" + }, + "devDependencies": { + "@hcengineering/platform-rig": "workspace:^0.7.10" + }, + "private": true +} diff --git a/packages/measurements-otlp/package.json b/packages/measurements-otlp/package.json index 0ec6b135c6..009c6489f6 100644 --- a/packages/measurements-otlp/package.json +++ b/packages/measurements-otlp/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/measurements-otlp", - "version": "0.7.9", + "version": "0.7.10", "main": "lib/index.js", "svelte": "src/index.ts", "types": "types/index.d.ts", @@ -27,13 +27,13 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.9", + "@hcengineering/platform-rig": "workspace:^0.7.10", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5" }, "dependencies": { - "@hcengineering/measurements": "workspace:^0.7.9", + "@hcengineering/measurements": "workspace:^0.7.10", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-logs": "^0.203.0", "@opentelemetry/auto-instrumentations-node": "^0.62.0", diff --git a/packages/measurements/package.json b/packages/measurements/package.json index f62785b1cd..1dcb9b6731 100644 --- a/packages/measurements/package.json +++ b/packages/measurements/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/measurements", - "version": "0.7.9", + "version": "0.7.10", "main": "lib/index.js", "svelte": "src/index.ts", "types": "types/index.d.ts", @@ -27,7 +27,7 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.9", + "@hcengineering/platform-rig": "workspace:^0.7.10", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5" diff --git a/packages/platform-rig/package.json b/packages/platform-rig/package.json index b03245864e..d85f11782a 100644 --- a/packages/platform-rig/package.json +++ b/packages/platform-rig/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/platform-rig", - "version": "0.7.9", + "version": "0.7.10", "scripts": { "build": "echo 'Not required'", "format": "echo 'Not required'" diff --git a/packages/postgres-base/package.json b/packages/postgres-base/package.json index 98d708eb8d..06fcbc7352 100644 --- a/packages/postgres-base/package.json +++ b/packages/postgres-base/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/postgres-base", - "version": "0.7.9", + "version": "0.7.10", "main": "lib/index.js", "svelte": "src/index.ts", "types": "types/index.d.ts", @@ -28,7 +28,7 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.9", + "@hcengineering/platform-rig": "workspace:^0.7.10", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5", diff --git a/rush.json b/rush.json index d5e9570649..113e70aa26 100644 --- a/rush.json +++ b/rush.json @@ -330,6 +330,11 @@ * 3. It's useful to have a centralized inventory of all projects and their important metadata. */ "projects": [ + { + "packageName": "@hcengineering/scripts", + "projectFolder": "common/scripts", + "shouldPublish": false + }, { "packageName": "@hcengineering/platform-rig", "projectFolder": "packages/platform-rig", From fff296a75420b75805486ceeb195e93a4ff6b4b2 Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Tue, 7 Oct 2025 16:52:54 +0700 Subject: [PATCH 18/40] Bump to new version of esbuild and typescript --- common/config/rush/pnpm-lock.yaml | 300 ++++++++++++++--------------- packages/platform-rig/package.json | 4 +- 2 files changed, 152 insertions(+), 152 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index f3b0ad1167..4c71f5ed3c 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -23,7 +23,7 @@ importers: version: 29.7.0(@types/node@22.18.1) ts-jest: specifier: ^29.1.1 - version: 29.4.1(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest-util@29.7.0)(jest@29.7.0(@types/node@22.18.1))(typescript@5.9.2) + version: 29.4.1(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest-util@29.7.0)(jest@29.7.0(@types/node@22.18.1))(typescript@5.9.3) ../../packages/measurements-otlp: dependencies: @@ -84,28 +84,28 @@ importers: version: 29.7.0(@types/node@22.18.1) ts-jest: specifier: ^29.1.1 - version: 29.4.1(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest-util@29.7.0)(jest@29.7.0(@types/node@22.18.1))(typescript@5.9.2) + version: 29.4.1(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest-util@29.7.0)(jest@29.7.0(@types/node@22.18.1))(typescript@5.9.3) ../../packages/platform-rig: dependencies: '@typescript-eslint/eslint-plugin': specifier: ^6.11.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2) + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: ^6.11.0 - version: 6.21.0(eslint@8.57.1)(typescript@5.9.2) + version: 6.21.0(eslint@8.57.1)(typescript@5.9.3) esbuild: - specifier: ^0.25.9 - version: 0.25.9 + specifier: ^0.25.10 + version: 0.25.10 esbuild-plugin-copy: specifier: ^2.1.1 - version: 2.1.1(esbuild@0.25.9) + version: 2.1.1(esbuild@0.25.10) eslint: specifier: ^8.54.0 version: 8.57.1 eslint-config-standard-with-typescript: specifier: ^40.0.0 - version: 40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.2) + version: 40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.3) eslint-plugin-import: specifier: ^2.26.0 version: 2.32.0(eslint@8.57.1) @@ -119,8 +119,8 @@ importers: specifier: ^3.1.0 version: 3.6.2 typescript: - specifier: ^5.8.3 - version: 5.9.2 + specifier: ^5.9.3 + version: 5.9.3 ../../packages/postgres-base: dependencies: @@ -142,7 +142,7 @@ importers: version: 29.7.0(@types/node@22.18.1) ts-jest: specifier: ^29.1.1 - version: 29.4.1(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest-util@29.7.0)(jest@29.7.0(@types/node@22.18.1))(typescript@5.9.2) + version: 29.4.1(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest-util@29.7.0)(jest@29.7.0(@types/node@22.18.1))(typescript@5.9.3) ../scripts: devDependencies: @@ -317,158 +317,158 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@esbuild/aix-ppc64@0.25.9': - resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==} + '@esbuild/aix-ppc64@0.25.10': + resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.9': - resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==} + '@esbuild/android-arm64@0.25.10': + resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.9': - resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==} + '@esbuild/android-arm@0.25.10': + resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.9': - resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==} + '@esbuild/android-x64@0.25.10': + resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.9': - resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==} + '@esbuild/darwin-arm64@0.25.10': + resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.9': - resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} + '@esbuild/darwin-x64@0.25.10': + resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.9': - resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} + '@esbuild/freebsd-arm64@0.25.10': + resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.9': - resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} + '@esbuild/freebsd-x64@0.25.10': + resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.9': - resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} + '@esbuild/linux-arm64@0.25.10': + resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.9': - resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} + '@esbuild/linux-arm@0.25.10': + resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.9': - resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} + '@esbuild/linux-ia32@0.25.10': + resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.9': - resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} + '@esbuild/linux-loong64@0.25.10': + resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.9': - resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} + '@esbuild/linux-mips64el@0.25.10': + resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.9': - resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} + '@esbuild/linux-ppc64@0.25.10': + resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.9': - resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} + '@esbuild/linux-riscv64@0.25.10': + resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.9': - resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} + '@esbuild/linux-s390x@0.25.10': + resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.9': - resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} + '@esbuild/linux-x64@0.25.10': + resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.9': - resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} + '@esbuild/netbsd-arm64@0.25.10': + resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.9': - resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} + '@esbuild/netbsd-x64@0.25.10': + resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.9': - resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} + '@esbuild/openbsd-arm64@0.25.10': + resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.9': - resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} + '@esbuild/openbsd-x64@0.25.10': + resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.9': - resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} + '@esbuild/openharmony-arm64@0.25.10': + resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.25.9': - resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} + '@esbuild/sunos-x64@0.25.10': + resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.9': - resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} + '@esbuild/win32-arm64@0.25.10': + resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.9': - resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} + '@esbuild/win32-ia32@0.25.10': + resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.9': - resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} + '@esbuild/win32-x64@0.25.10': + resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -1630,8 +1630,8 @@ packages: peerDependencies: esbuild: '>= 0.14.0' - esbuild@0.25.9: - resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} + esbuild@0.25.10: + resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} engines: {node: '>=18'} hasBin: true @@ -2891,8 +2891,8 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typescript@5.9.2: - resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} hasBin: true @@ -3191,82 +3191,82 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} - '@esbuild/aix-ppc64@0.25.9': + '@esbuild/aix-ppc64@0.25.10': optional: true - '@esbuild/android-arm64@0.25.9': + '@esbuild/android-arm64@0.25.10': optional: true - '@esbuild/android-arm@0.25.9': + '@esbuild/android-arm@0.25.10': optional: true - '@esbuild/android-x64@0.25.9': + '@esbuild/android-x64@0.25.10': optional: true - '@esbuild/darwin-arm64@0.25.9': + '@esbuild/darwin-arm64@0.25.10': optional: true - '@esbuild/darwin-x64@0.25.9': + '@esbuild/darwin-x64@0.25.10': optional: true - '@esbuild/freebsd-arm64@0.25.9': + '@esbuild/freebsd-arm64@0.25.10': optional: true - '@esbuild/freebsd-x64@0.25.9': + '@esbuild/freebsd-x64@0.25.10': optional: true - '@esbuild/linux-arm64@0.25.9': + '@esbuild/linux-arm64@0.25.10': optional: true - '@esbuild/linux-arm@0.25.9': + '@esbuild/linux-arm@0.25.10': optional: true - '@esbuild/linux-ia32@0.25.9': + '@esbuild/linux-ia32@0.25.10': optional: true - '@esbuild/linux-loong64@0.25.9': + '@esbuild/linux-loong64@0.25.10': optional: true - '@esbuild/linux-mips64el@0.25.9': + '@esbuild/linux-mips64el@0.25.10': optional: true - '@esbuild/linux-ppc64@0.25.9': + '@esbuild/linux-ppc64@0.25.10': optional: true - '@esbuild/linux-riscv64@0.25.9': + '@esbuild/linux-riscv64@0.25.10': optional: true - '@esbuild/linux-s390x@0.25.9': + '@esbuild/linux-s390x@0.25.10': optional: true - '@esbuild/linux-x64@0.25.9': + '@esbuild/linux-x64@0.25.10': optional: true - '@esbuild/netbsd-arm64@0.25.9': + '@esbuild/netbsd-arm64@0.25.10': optional: true - '@esbuild/netbsd-x64@0.25.9': + '@esbuild/netbsd-x64@0.25.10': optional: true - '@esbuild/openbsd-arm64@0.25.9': + '@esbuild/openbsd-arm64@0.25.10': optional: true - '@esbuild/openbsd-x64@0.25.9': + '@esbuild/openbsd-x64@0.25.10': optional: true - '@esbuild/openharmony-arm64@0.25.9': + '@esbuild/openharmony-arm64@0.25.10': optional: true - '@esbuild/sunos-x64@0.25.9': + '@esbuild/sunos-x64@0.25.10': optional: true - '@esbuild/win32-arm64@0.25.9': + '@esbuild/win32-arm64@0.25.10': optional: true - '@esbuild/win32-ia32@0.25.9': + '@esbuild/win32-ia32@0.25.10': optional: true - '@esbuild/win32-x64@0.25.9': + '@esbuild/win32-x64@0.25.10': optional: true '@eslint-community/eslint-utils@4.9.0(eslint@8.57.1)': @@ -4359,13 +4359,13 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2)': + '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.9.2) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1)(typescript@5.9.2) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.9.2) + '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.4.1 eslint: 8.57.1 @@ -4373,22 +4373,22 @@ snapshots: ignore: 5.3.2 natural-compare: 1.4.0 semver: 7.7.2 - ts-api-utils: 1.4.3(typescript@5.9.2) + ts-api-utils: 1.4.3(typescript@5.9.3) optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.2)': + '@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.3) '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.4.1 eslint: 8.57.1 optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -4397,21 +4397,21 @@ snapshots: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - '@typescript-eslint/type-utils@6.21.0(eslint@8.57.1)(typescript@5.9.2)': + '@typescript-eslint/type-utils@6.21.0(eslint@8.57.1)(typescript@5.9.3)': dependencies: - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.2) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.3) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.9.3) debug: 4.4.1 eslint: 8.57.1 - ts-api-utils: 1.4.3(typescript@5.9.2) + ts-api-utils: 1.4.3(typescript@5.9.3) optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color '@typescript-eslint/types@6.21.0': {} - '@typescript-eslint/typescript-estree@6.21.0(typescript@5.9.2)': + '@typescript-eslint/typescript-estree@6.21.0(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 @@ -4420,20 +4420,20 @@ snapshots: is-glob: 4.0.3 minimatch: 9.0.3 semver: 7.7.2 - ts-api-utils: 1.4.3(typescript@5.9.2) + ts-api-utils: 1.4.3(typescript@5.9.3) optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@5.9.2)': + '@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) '@types/json-schema': 7.0.15 '@types/semver': 7.7.1 '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.3) eslint: 8.57.1 semver: 7.7.2 transitivePeerDependencies: @@ -4889,42 +4889,42 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - esbuild-plugin-copy@2.1.1(esbuild@0.25.9): + esbuild-plugin-copy@2.1.1(esbuild@0.25.10): dependencies: chalk: 4.1.2 chokidar: 3.6.0 - esbuild: 0.25.9 + esbuild: 0.25.10 fs-extra: 10.1.0 globby: 11.1.0 - esbuild@0.25.9: + esbuild@0.25.10: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.9 - '@esbuild/android-arm': 0.25.9 - '@esbuild/android-arm64': 0.25.9 - '@esbuild/android-x64': 0.25.9 - '@esbuild/darwin-arm64': 0.25.9 - '@esbuild/darwin-x64': 0.25.9 - '@esbuild/freebsd-arm64': 0.25.9 - '@esbuild/freebsd-x64': 0.25.9 - '@esbuild/linux-arm': 0.25.9 - '@esbuild/linux-arm64': 0.25.9 - '@esbuild/linux-ia32': 0.25.9 - '@esbuild/linux-loong64': 0.25.9 - '@esbuild/linux-mips64el': 0.25.9 - '@esbuild/linux-ppc64': 0.25.9 - '@esbuild/linux-riscv64': 0.25.9 - '@esbuild/linux-s390x': 0.25.9 - '@esbuild/linux-x64': 0.25.9 - '@esbuild/netbsd-arm64': 0.25.9 - '@esbuild/netbsd-x64': 0.25.9 - '@esbuild/openbsd-arm64': 0.25.9 - '@esbuild/openbsd-x64': 0.25.9 - '@esbuild/openharmony-arm64': 0.25.9 - '@esbuild/sunos-x64': 0.25.9 - '@esbuild/win32-arm64': 0.25.9 - '@esbuild/win32-ia32': 0.25.9 - '@esbuild/win32-x64': 0.25.9 + '@esbuild/aix-ppc64': 0.25.10 + '@esbuild/android-arm': 0.25.10 + '@esbuild/android-arm64': 0.25.10 + '@esbuild/android-x64': 0.25.10 + '@esbuild/darwin-arm64': 0.25.10 + '@esbuild/darwin-x64': 0.25.10 + '@esbuild/freebsd-arm64': 0.25.10 + '@esbuild/freebsd-x64': 0.25.10 + '@esbuild/linux-arm': 0.25.10 + '@esbuild/linux-arm64': 0.25.10 + '@esbuild/linux-ia32': 0.25.10 + '@esbuild/linux-loong64': 0.25.10 + '@esbuild/linux-mips64el': 0.25.10 + '@esbuild/linux-ppc64': 0.25.10 + '@esbuild/linux-riscv64': 0.25.10 + '@esbuild/linux-s390x': 0.25.10 + '@esbuild/linux-x64': 0.25.10 + '@esbuild/netbsd-arm64': 0.25.10 + '@esbuild/netbsd-x64': 0.25.10 + '@esbuild/openbsd-arm64': 0.25.10 + '@esbuild/openbsd-x64': 0.25.10 + '@esbuild/openharmony-arm64': 0.25.10 + '@esbuild/sunos-x64': 0.25.10 + '@esbuild/win32-arm64': 0.25.10 + '@esbuild/win32-ia32': 0.25.10 + '@esbuild/win32-x64': 0.25.10 escalade@3.2.0: {} @@ -4932,16 +4932,16 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-standard-with-typescript@40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.2): + eslint-config-standard-with-typescript@40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2) - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.9.2) + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.9.3) eslint: 8.57.1 eslint-config-standard: 17.1.0(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1) eslint-plugin-import: 2.32.0(eslint@8.57.1) eslint-plugin-n: 15.7.0(eslint@8.57.1) eslint-plugin-promise: 6.6.0(eslint@8.57.1) - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -6375,11 +6375,11 @@ snapshots: tr46@0.0.3: {} - ts-api-utils@1.4.3(typescript@5.9.2): + ts-api-utils@1.4.3(typescript@5.9.3): dependencies: - typescript: 5.9.2 + typescript: 5.9.3 - ts-jest@29.4.1(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest-util@29.7.0)(jest@29.7.0(@types/node@22.18.1))(typescript@5.9.2): + ts-jest@29.4.1(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest-util@29.7.0)(jest@29.7.0(@types/node@22.18.1))(typescript@5.9.3): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 @@ -6390,7 +6390,7 @@ snapshots: make-error: 1.3.6 semver: 7.7.2 type-fest: 4.41.0 - typescript: 5.9.2 + typescript: 5.9.3 yargs-parser: 21.1.1 optionalDependencies: '@babel/core': 7.28.4 @@ -6451,7 +6451,7 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript@5.9.2: {} + typescript@5.9.3: {} uglify-js@3.19.3: optional: true diff --git a/packages/platform-rig/package.json b/packages/platform-rig/package.json index d85f11782a..1a30c5bfbf 100644 --- a/packages/platform-rig/package.json +++ b/packages/platform-rig/package.json @@ -10,8 +10,8 @@ "./profiles/*": "./profiles/*" }, "dependencies": { - "typescript": "^5.8.3", - "esbuild": "^0.25.9", + "typescript": "^5.9.3", + "esbuild": "^0.25.10", "esbuild-plugin-copy": "^2.1.1", "@typescript-eslint/eslint-plugin": "^6.11.0", "eslint-plugin-import": "^2.26.0", From 21422e0db4935bca7b80b8fd733de5dec324a9aa Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Fri, 10 Oct 2025 19:31:41 +0700 Subject: [PATCH 19/40] Update prettier and new update-deps script Prettier + svelte support --- common/config/rush/pnpm-lock.yaml | 132 ++++++++- common/config/rush/version-policies.json | 82 +++--- common/scripts/package.json | 2 +- packages/measurements-otlp/CHANGELOG.json | 17 ++ packages/measurements-otlp/CHANGELOG.md | 9 + packages/measurements-otlp/package.json | 2 +- packages/measurements/CHANGELOG.json | 17 ++ packages/measurements/CHANGELOG.md | 9 + packages/measurements/package.json | 2 +- packages/platform-rig/CHANGELOG.json | 17 ++ packages/platform-rig/CHANGELOG.md | 11 + packages/platform-rig/bin/update-deps.js | 335 ++++++++++++++++++++++ packages/platform-rig/package.json | 9 +- packages/postgres-base/CHANGELOG.json | 17 ++ packages/postgres-base/CHANGELOG.md | 9 + packages/postgres-base/package.json | 2 +- 16 files changed, 623 insertions(+), 49 deletions(-) create mode 100644 packages/measurements-otlp/CHANGELOG.json create mode 100644 packages/measurements-otlp/CHANGELOG.md create mode 100644 packages/measurements/CHANGELOG.json create mode 100644 packages/measurements/CHANGELOG.md create mode 100644 packages/platform-rig/CHANGELOG.json create mode 100644 packages/platform-rig/CHANGELOG.md create mode 100755 packages/platform-rig/bin/update-deps.js create mode 100644 packages/postgres-base/CHANGELOG.json create mode 100644 packages/postgres-base/CHANGELOG.md diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 4c71f5ed3c..a66d711c27 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -116,8 +116,14 @@ importers: specifier: ^6.1.1 version: 6.6.0(eslint@8.57.1) prettier: - specifier: ^3.1.0 + specifier: ^3.6.2 version: 3.6.2 + prettier-plugin-svelte: + specifier: ^3.4.0 + version: 3.4.0(prettier@3.6.2)(svelte@4.2.20) + svelte: + specifier: ^4.2.20 + version: 4.2.20 typescript: specifier: ^5.9.3 version: 5.9.3 @@ -152,6 +158,10 @@ importers: packages: + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + '@babel/code-frame@7.27.1': resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} @@ -1172,6 +1182,9 @@ packages: '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/graceful-fs@4.1.9': resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} @@ -1335,6 +1348,10 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + array-buffer-byte-length@1.0.2: resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} @@ -1371,6 +1388,10 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + babel-jest@29.7.0: resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -1488,6 +1509,9 @@ packages: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + code-red@1.0.4: + resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} + collect-v8-coverage@1.0.2: resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} @@ -1513,6 +1537,10 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + data-view-buffer@1.0.2: resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} @@ -1756,6 +1784,9 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -2081,6 +2112,9 @@ packages: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} + is-reference@3.0.3: + resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} + is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} @@ -2341,6 +2375,9 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + locate-character@3.0.0: + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -2364,6 +2401,9 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + magic-string@0.30.19: + resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} + make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} @@ -2378,6 +2418,9 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -2524,6 +2567,9 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + periscopic@3.1.0: + resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + pg-int8@1.0.1: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} engines: {node: '>=4.0.0'} @@ -2578,6 +2624,12 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} + prettier-plugin-svelte@3.4.0: + resolution: {integrity: sha512-pn1ra/0mPObzqoIQn/vUTR3ZZI6UuZ0sHqMK5x2jMLGrs53h0sXhkVuDcrlssHwIMk7FYrMjHBPoUSyyEEDlBQ==} + peerDependencies: + prettier: ^3.0.0 + svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 + prettier@3.6.2: resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} engines: {node: '>=14'} @@ -2732,6 +2784,10 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + source-map-support@0.5.13: resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} @@ -2802,6 +2858,10 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + svelte@4.2.20: + resolution: {integrity: sha512-eeEgGc2DtiUil5ANdtd8vPwt9AgaMdnuUFnPft9F5oMvU/FHu5IHFic+p1dR/UOB7XU2mX2yHW+NcTch4DCh5Q==} + engines: {node: '>=16'} + test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} @@ -3002,6 +3062,11 @@ packages: snapshots: + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.30 + '@babel/code-frame@7.27.1': dependencies: '@babel/helper-validator-identifier': 7.27.1 @@ -4296,6 +4361,8 @@ snapshots: dependencies: '@types/node': 22.18.1 + '@types/estree@1.0.8': {} + '@types/graceful-fs@4.1.9': dependencies: '@types/node': 22.18.1 @@ -4489,6 +4556,8 @@ snapshots: argparse@2.0.1: {} + aria-query@5.3.2: {} + array-buffer-byte-length@1.0.2: dependencies: call-bound: 1.0.4 @@ -4547,6 +4616,8 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 + axobject-query@4.1.0: {} + babel-jest@29.7.0(@babel/core@7.28.4): dependencies: '@babel/core': 7.28.4 @@ -4698,6 +4769,14 @@ snapshots: co@4.6.0: {} + code-red@1.0.4: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@types/estree': 1.0.8 + acorn: 8.15.0 + estree-walker: 3.0.3 + periscopic: 3.1.0 + collect-v8-coverage@1.0.2: {} color-convert@2.0.1: @@ -4731,6 +4810,11 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + css-tree@2.3.1: + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.2.1 + data-view-buffer@1.0.2: dependencies: call-bound: 1.0.4 @@ -5090,6 +5174,10 @@ snapshots: estraverse@5.3.0: {} + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + esutils@2.0.3: {} execa@5.1.1: @@ -5448,6 +5536,10 @@ snapshots: is-path-inside@3.0.3: {} + is-reference@3.0.3: + dependencies: + '@types/estree': 1.0.8 + is-regex@1.2.1: dependencies: call-bound: 1.0.4 @@ -5894,6 +5986,8 @@ snapshots: lines-and-columns@1.2.4: {} + locate-character@3.0.0: {} + locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -5914,6 +6008,10 @@ snapshots: dependencies: yallist: 3.1.1 + magic-string@0.30.19: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + make-dir@4.0.0: dependencies: semver: 7.7.2 @@ -5926,6 +6024,8 @@ snapshots: math-intrinsics@1.1.0: {} + mdn-data@2.0.30: {} + merge-stream@2.0.0: {} merge2@1.4.1: {} @@ -6064,6 +6164,12 @@ snapshots: path-type@4.0.0: {} + periscopic@3.1.0: + dependencies: + '@types/estree': 1.0.8 + estree-walker: 3.0.3 + is-reference: 3.0.3 + pg-int8@1.0.1: {} pg-protocol@1.10.3: {} @@ -6102,6 +6208,11 @@ snapshots: prelude-ls@1.2.1: {} + prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@4.2.20): + dependencies: + prettier: 3.6.2 + svelte: 4.2.20 + prettier@3.6.2: {} pretty-format@29.7.0: @@ -6285,6 +6396,8 @@ snapshots: slash@3.0.0: {} + source-map-js@1.2.1: {} + source-map-support@0.5.13: dependencies: buffer-from: 1.1.2 @@ -6359,6 +6472,23 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + svelte@4.2.20: + dependencies: + '@ampproject/remapping': 2.3.0 + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.30 + '@types/estree': 1.0.8 + acorn: 8.15.0 + aria-query: 5.3.2 + axobject-query: 4.1.0 + code-red: 1.0.4 + css-tree: 2.3.1 + estree-walker: 3.0.3 + is-reference: 3.0.3 + locate-character: 3.0.0 + magic-string: 0.30.19 + periscopic: 3.1.0 + test-exclude@6.0.0: dependencies: '@istanbuljs/schema': 0.1.3 diff --git a/common/config/rush/version-policies.json b/common/config/rush/version-policies.json index d03b73a3b6..4520f52c5f 100644 --- a/common/config/rush/version-policies.json +++ b/common/config/rush/version-policies.json @@ -20,21 +20,21 @@ // * SemVer range is usually restricted to a single version. // */ // "definitionName": "lockStepVersion", - // + // // /** // * (Required) The name that will be used for the "versionPolicyName" field in rush.json. // * This name is also used command-line parameters such as "--version-policy" // * and "--to-version-policy". // */ // "policyName": "MyBigFramework", - // + // // /** // * (Required) The current version. All packages belonging to the set should have this version // * in the current branch. When bumping versions, Rush uses this to determine the next version. // * (The "version" field in package.json is NOT considered.) // */ // "version": "1.0.0", - // + // // /** // * (Required) The type of bump that will be performed when publishing the next release. // * When creating a release branch in Git, this field should be updated according to the @@ -43,7 +43,7 @@ // * Valid values are: "prerelease", "preminor", "minor", "patch", "major" // */ // "nextBump": "prerelease", - // + // // /** // * (Optional) If specified, all packages in the set share a common CHANGELOG.md file. // * This file is stored with the specified "main" project, which must be a member of the set. @@ -52,7 +52,7 @@ // * package in the set. // */ // "mainProject": "my-app", - // + // // /** // * (Optional) If enabled, the "rush change" command will prompt the user for their email address // * and include it in the JSON change files. If an organization maintains multiple repos, tracking @@ -63,40 +63,40 @@ // */ // // "includeEmailInChangeFile": true // }, - // - // { - // /** - // * (Required) Indicates the kind of version policy being defined ("lockStepVersion" or "individualVersion"). - // * - // * The "individualVersion" mode specifies that the projects will use "individual versioning". - // * This is the typical NPM model where each package has an independent version number - // * and CHANGELOG.md file. Although a single CI definition is responsible for publishing the - // * packages, they otherwise don't have any special relationship. The version bumping will - // * depend on how developers answer the "rush change" questions for each package that - // * is changed. - // */ - // "definitionName": "individualVersion", - // - // "policyName": "MyRandomLibraries", - // - // /** - // * (Optional) This can be used to enforce that all packages in the set must share a common - // * major version number, e.g. because they are from the same major release branch. - // * It can also be used to discourage people from accidentally making "MAJOR" SemVer changes - // * inappropriately. The minor/patch version parts will be bumped independently according - // * to the types of changes made to each project, according to the "rush change" command. - // */ - // "lockedMajor": 3, - // - // /** - // * (Optional) When publishing is managed by Rush, by default the "rush change" command will - // * request changes for any projects that are modified by a pull request. These change entries - // * will produce a CHANGELOG.md file. If you author your CHANGELOG.md manually or announce updates - // * in some other way, set "exemptFromRushChange" to true to tell "rush change" to ignore the projects - // * belonging to this version policy. - // */ - // "exemptFromRushChange": false, - // - // // "includeEmailInChangeFile": true - // } + // + { + /** + * (Required) Indicates the kind of version policy being defined ("lockStepVersion" or "individualVersion"). + * + * The "individualVersion" mode specifies that the projects will use "individual versioning". + * This is the typical NPM model where each package has an independent version number + * and CHANGELOG.md file. Although a single CI definition is responsible for publishing the + * packages, they otherwise don't have any special relationship. The version bumping will + * depend on how developers answer the "rush change" questions for each package that + * is changed. + */ + "definitionName": "individualVersion", + + "policyName": "huly.utils", + + /** + * (Optional) This can be used to enforce that all packages in the set must share a common + * major version number, e.g. because they are from the same major release branch. + * It can also be used to discourage people from accidentally making "MAJOR" SemVer changes + * inappropriately. The minor/patch version parts will be bumped independently according + * to the types of changes made to each project, according to the "rush change" command. + */ + "lockedMajor": 0, + + /** + * (Optional) When publishing is managed by Rush, by default the "rush change" command will + * request changes for any projects that are modified by a pull request. These change entries + * will produce a CHANGELOG.md file. If you author your CHANGELOG.md manually or announce updates + * in some other way, set "exemptFromRushChange" to true to tell "rush change" to ignore the projects + * belonging to this version policy. + */ + "exemptFromRushChange": false + + // "includeEmailInChangeFile": true + } ] diff --git a/common/scripts/package.json b/common/scripts/package.json index 0fceb28c27..c9e8c21511 100644 --- a/common/scripts/package.json +++ b/common/scripts/package.json @@ -5,7 +5,7 @@ "format": "echo \"No format specified\"" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.10" + "@hcengineering/platform-rig": "workspace:^0.7.11" }, "private": true } diff --git a/packages/measurements-otlp/CHANGELOG.json b/packages/measurements-otlp/CHANGELOG.json new file mode 100644 index 0000000000..07533eb4ef --- /dev/null +++ b/packages/measurements-otlp/CHANGELOG.json @@ -0,0 +1,17 @@ +{ + "name": "@hcengineering/measurements-otlp", + "entries": [ + { + "version": "0.7.10", + "tag": "@hcengineering/measurements-otlp_v0.7.10", + "date": "Fri, 10 Oct 2025 12:32:59 GMT", + "comments": { + "dependency": [ + { + "comment": "Updating dependency \"@hcengineering/platform-rig\" from `^0.7.10` to `0.7.11`" + } + ] + } + } + ] +} diff --git a/packages/measurements-otlp/CHANGELOG.md b/packages/measurements-otlp/CHANGELOG.md new file mode 100644 index 0000000000..69185c1289 --- /dev/null +++ b/packages/measurements-otlp/CHANGELOG.md @@ -0,0 +1,9 @@ +# Change Log - @hcengineering/measurements-otlp + +This log was last generated on Fri, 10 Oct 2025 12:32:59 GMT and should not be manually modified. + +## 0.7.10 +Fri, 10 Oct 2025 12:32:59 GMT + +_Initial release_ + diff --git a/packages/measurements-otlp/package.json b/packages/measurements-otlp/package.json index 009c6489f6..6629bff49e 100644 --- a/packages/measurements-otlp/package.json +++ b/packages/measurements-otlp/package.json @@ -27,7 +27,7 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.10", + "@hcengineering/platform-rig": "workspace:^0.7.11", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5" diff --git a/packages/measurements/CHANGELOG.json b/packages/measurements/CHANGELOG.json new file mode 100644 index 0000000000..ff042fd1e9 --- /dev/null +++ b/packages/measurements/CHANGELOG.json @@ -0,0 +1,17 @@ +{ + "name": "@hcengineering/measurements", + "entries": [ + { + "version": "0.7.10", + "tag": "@hcengineering/measurements_v0.7.10", + "date": "Fri, 10 Oct 2025 12:32:59 GMT", + "comments": { + "dependency": [ + { + "comment": "Updating dependency \"@hcengineering/platform-rig\" from `^0.7.10` to `0.7.11`" + } + ] + } + } + ] +} diff --git a/packages/measurements/CHANGELOG.md b/packages/measurements/CHANGELOG.md new file mode 100644 index 0000000000..fa46e9c0ea --- /dev/null +++ b/packages/measurements/CHANGELOG.md @@ -0,0 +1,9 @@ +# Change Log - @hcengineering/measurements + +This log was last generated on Fri, 10 Oct 2025 12:32:59 GMT and should not be manually modified. + +## 0.7.10 +Fri, 10 Oct 2025 12:32:59 GMT + +_Initial release_ + diff --git a/packages/measurements/package.json b/packages/measurements/package.json index 1dcb9b6731..beed045d3e 100644 --- a/packages/measurements/package.json +++ b/packages/measurements/package.json @@ -27,7 +27,7 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.10", + "@hcengineering/platform-rig": "workspace:^0.7.11", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5" diff --git a/packages/platform-rig/CHANGELOG.json b/packages/platform-rig/CHANGELOG.json new file mode 100644 index 0000000000..e3a49bfc16 --- /dev/null +++ b/packages/platform-rig/CHANGELOG.json @@ -0,0 +1,17 @@ +{ + "name": "@hcengineering/platform-rig", + "entries": [ + { + "version": "0.7.11", + "tag": "@hcengineering/platform-rig_v0.7.11", + "date": "Fri, 10 Oct 2025 12:32:59 GMT", + "comments": { + "patch": [ + { + "comment": "Bump prettier and enable svelte" + } + ] + } + } + ] +} diff --git a/packages/platform-rig/CHANGELOG.md b/packages/platform-rig/CHANGELOG.md new file mode 100644 index 0000000000..d492d68eee --- /dev/null +++ b/packages/platform-rig/CHANGELOG.md @@ -0,0 +1,11 @@ +# Change Log - @hcengineering/platform-rig + +This log was last generated on Fri, 10 Oct 2025 12:32:59 GMT and should not be manually modified. + +## 0.7.11 +Fri, 10 Oct 2025 12:32:59 GMT + +### Patches + +- Bump prettier and enable svelte + diff --git a/packages/platform-rig/bin/update-deps.js b/packages/platform-rig/bin/update-deps.js new file mode 100755 index 0000000000..1db163629b --- /dev/null +++ b/packages/platform-rig/bin/update-deps.js @@ -0,0 +1,335 @@ +#!/usr/bin/env node +// +// Copyright Ā© 2025 Hardcore Engineering Inc. +// +// Script to check and update @hcengineering/* dependencies across all Rush packages +// + +const fs = require('fs') +const path = require('path') +const https = require('https') +const { execSync } = require('child_process') + +const SCOPE = '@hcengineering/' + +/** + * Get list of Rush projects using 'rush list --json' + */ +function getRushProjects() { + try { + const output = execSync('rush list --json', { + encoding: 'utf-8', + stdio: ['pipe', 'pipe', 'pipe'] + }) + + const data = JSON.parse(output) + + // rush list --json returns { projects: [...] } + const projects = data.projects || data + + if (!Array.isArray(projects)) { + throw new Error('Expected rush list --json to return an array of projects') + } + + return projects + } catch (err) { + if (err.message.includes('rush') || err.code === 'ENOENT') { + throw new Error('Failed to run "rush list --json". Make sure you are in a Rush workspace and Rush is installed.') + } + throw new Error(`Failed to get Rush projects: ${err.message}`) + } +} + +/** + * Get the workspace root from rush list output + */ +function getWorkspaceRoot(projects) { + if (projects.length === 0) { + return process.cwd() + } + + // Use fullPath from rush list output + const firstProject = projects[0] + if (firstProject.fullPath && firstProject.path) { + // Remove the relative path part from the full path to get workspace root + return firstProject.fullPath.replace(new RegExp(firstProject.path + '$'), '') + } + + // Fallback: find rush.json + let currentDir = process.cwd() + while (currentDir !== '/') { + const rushJsonPath = path.join(currentDir, 'rush.json') + if (fs.existsSync(rushJsonPath)) { + return currentDir + } + currentDir = path.dirname(currentDir) + } + + throw new Error('Could not determine workspace root') +} + +/** + * Get the latest version of a package from npm registry + */ +function getLatestVersion(packageName) { + return new Promise((resolve, reject) => { + const url = `https://registry.npmjs.org/${packageName}/latest` + + https + .get(url, (res) => { + let data = '' + + res.on('data', (chunk) => { + data += chunk + }) + + res.on('end', () => { + if (res.statusCode === 200) { + try { + const parsed = JSON.parse(data) + resolve(parsed.version) + } catch (err) { + reject(new Error(`Failed to parse response for ${packageName}: ${err.message}`)) + } + } else if (res.statusCode === 404) { + resolve(null) // Package not found in registry + } else { + reject(new Error(`HTTP ${res.statusCode} for ${packageName}`)) + } + }) + }) + .on('error', (err) => { + reject(err) + }) + }) +} + +/** + * Compare versions (simple semver comparison) + */ +function isNewerVersion(current, latest) { + // Remove workspace: prefix and version operators + current = current.replace(/^workspace:|[\^~><=]/g, '') + + const currentParts = current.split('.').map(Number) + const latestParts = latest.split('.').map(Number) + + for (let i = 0; i < 3; i++) { + if (latestParts[i] > currentParts[i]) return true + if (latestParts[i] < currentParts[i]) return false + } + + return false +} + +/** + * Check and update @hcengineering dependencies in a package.json + */ +async function updatePackageDependencies(project, latestVersions, dryRun = false) { + // Use fullPath from rush list output + const packageJsonPath = project.fullPath ? path.join(project.fullPath, 'package.json') : null + + if (!packageJsonPath || !fs.existsSync(packageJsonPath)) { + return 0 + } + + const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8')) + const packageName = packageJson.name + let hasChanges = false + const changes = [] + + const dependencyTypes = ['dependencies', 'devDependencies', 'peerDependencies', 'optionalDependencies'] + + for (const depType of dependencyTypes) { + const deps = packageJson[depType] + if (!deps) continue + + for (const [depName, currentVersion] of Object.entries(deps)) { + if (!depName.startsWith(SCOPE)) continue + + // Skip workspace dependencies + if (currentVersion.startsWith('workspace:')) { + continue + } + + const latestVersion = latestVersions[depName] + + if (!latestVersion) { + console.log(` āš ļø ${depName}: not found in npm registry (current: ${currentVersion})`) + continue + } + + if (isNewerVersion(currentVersion, latestVersion)) { + const prefix = currentVersion.match(/^[\^~]/)?.[0] || '^' + const newVersion = `${prefix}${latestVersion}` + + changes.push({ + depType, + depName, + oldVersion: currentVersion, + newVersion + }) + + if (!dryRun) { + deps[depName] = newVersion + hasChanges = true + } + } + } + } + + if (changes.length > 0) { + console.log(`\nšŸ“¦ ${packageName}`) + for (const change of changes) { + console.log(` āœ“ ${change.depName}: ${change.oldVersion} → ${change.newVersion} (${change.depType})`) + } + + if (!dryRun && hasChanges) { + fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\n', 'utf-8') + } + } + + return changes.length +} + +/** + * Get all @hcengineering packages and their latest versions + */ +async function fetchLatestVersions(projects) { + const packageNames = new Set() + + // Collect all @hcengineering package names from all projects + for (const project of projects) { + const packageJsonPath = project.fullPath ? path.join(project.fullPath, 'package.json') : null + if (!packageJsonPath || !fs.existsSync(packageJsonPath)) continue + + const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8')) + const dependencyTypes = ['dependencies', 'devDependencies', 'peerDependencies', 'optionalDependencies'] + + for (const depType of dependencyTypes) { + const deps = packageJson[depType] + if (!deps) continue + + for (const depName of Object.keys(deps)) { + if (depName.startsWith(SCOPE)) { + packageNames.add(depName) + } + } + } + } + + console.log(`\nšŸ” Checking latest versions for ${packageNames.size} @hcengineering packages...\n`) + + const latestVersions = {} + const promises = Array.from(packageNames).map(async (packageName) => { + try { + const version = await getLatestVersion(packageName) + if (version) { + latestVersions[packageName] = version + console.log(` āœ“ ${packageName}@${version}`) + } else { + console.log(` āš ļø ${packageName}: not found in registry`) + } + } catch (err) { + console.error(` āœ— ${packageName}: ${err.message}`) + } + }) + + await Promise.all(promises) + + return latestVersions +} + +/** + * Main function + */ +async function main() { + const args = process.argv.slice(2) + + // Show help + if (args.includes('--help') || args.includes('-h')) { + console.log(` +Rush @hcengineering Dependencies Updater + +Usage: + update-hcengineering-deps [options] + +Options: + --dry-run, -n Check for updates without modifying files + --help, -h Show this help message + +Description: + This script checks all Rush packages for @hcengineering/* dependencies + and updates them to the latest versions available in npm registry. + + Workspace dependencies (using 'workspace:' protocol) are never modified. + +Examples: + # Check for updates (dry run) + update-hcengineering-deps --dry-run + + # Apply updates + update-hcengineering-deps + +After updating: + 1. Run 'rush update' to update lockfiles + 2. Run 'rush build' to verify builds + 3. Test your changes +`) + return + } + + const dryRun = args.includes('--dry-run') || args.includes('-n') + + console.log('šŸš€ Rush @hcengineering Dependencies Updater\n') + + // Get Rush projects using 'rush list --json' + const projects = getRushProjects() + const workspaceRoot = getWorkspaceRoot(projects) + + console.log(`Workspace: ${workspaceRoot}`) + console.log(`Mode: ${dryRun ? 'DRY RUN (no changes will be made)' : 'UPDATE'}`) + console.log(`Found ${projects.length} projects`) + + // Fetch latest versions from npm + const latestVersions = await fetchLatestVersions(projects) + + if (Object.keys(latestVersions).length === 0) { + console.log('\nāš ļø No @hcengineering packages found in npm registry') + return + } + + console.log('\n' + '='.repeat(80)) + console.log('Checking for updates...') + console.log('='.repeat(80)) + + // Update each project's dependencies + let totalUpdates = 0 + for (const project of projects) { + const updates = await updatePackageDependencies(project, latestVersions, dryRun) + totalUpdates += updates + } + + console.log('\n' + '='.repeat(80)) + + if (totalUpdates === 0) { + console.log('āœ… All @hcengineering dependencies are up to date!') + } else { + if (dryRun) { + console.log(`\nšŸ“Š Found ${totalUpdates} potential update(s)`) + console.log('\nRun without --dry-run flag to apply changes') + } else { + console.log(`\nāœ… Updated ${totalUpdates} dependency version(s)`) + console.log('\nšŸ’” Next steps:') + console.log(' 1. Run: rush update') + console.log(' 2. Run: rush build') + console.log(' 3. Test your changes') + } + } +} + +// Run the script +main().catch((err) => { + console.error('\nāŒ Error:', err.message) + process.exit(1) +}) diff --git a/packages/platform-rig/package.json b/packages/platform-rig/package.json index 1a30c5bfbf..ede8259ed6 100644 --- a/packages/platform-rig/package.json +++ b/packages/platform-rig/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/platform-rig", - "version": "0.7.10", + "version": "0.7.11", "scripts": { "build": "echo 'Not required'", "format": "echo 'Not required'" @@ -20,14 +20,17 @@ "eslint": "^8.54.0", "@typescript-eslint/parser": "^6.11.0", "eslint-config-standard-with-typescript": "^40.0.0", - "prettier": "^3.1.0" + "prettier": "^3.6.2", + "prettier-plugin-svelte": "^3.4.0", + "svelte": "^4.2.20" }, "bin": { "format": "./bin/format.js", "compile": "./bin/compile.js", "do-svelte-check": "./bin/do-svelte-check.js", "bump-package-version": "./bin/bump-package-version.js", - "bump-changes-from-tag": "./bin/bump-changes-from-tag.js" + "bump-changes-from-tag": "./bin/bump-changes-from-tag.js", + "update-deps": "./bin/update-hcengineering-deps.js" }, "publishConfig": { "access": "public" diff --git a/packages/postgres-base/CHANGELOG.json b/packages/postgres-base/CHANGELOG.json new file mode 100644 index 0000000000..ff2eeec02d --- /dev/null +++ b/packages/postgres-base/CHANGELOG.json @@ -0,0 +1,17 @@ +{ + "name": "@hcengineering/postgres-base", + "entries": [ + { + "version": "0.7.10", + "tag": "@hcengineering/postgres-base_v0.7.10", + "date": "Fri, 10 Oct 2025 12:32:59 GMT", + "comments": { + "dependency": [ + { + "comment": "Updating dependency \"@hcengineering/platform-rig\" from `^0.7.10` to `0.7.11`" + } + ] + } + } + ] +} diff --git a/packages/postgres-base/CHANGELOG.md b/packages/postgres-base/CHANGELOG.md new file mode 100644 index 0000000000..dd559eb1e2 --- /dev/null +++ b/packages/postgres-base/CHANGELOG.md @@ -0,0 +1,9 @@ +# Change Log - @hcengineering/postgres-base + +This log was last generated on Fri, 10 Oct 2025 12:32:59 GMT and should not be manually modified. + +## 0.7.10 +Fri, 10 Oct 2025 12:32:59 GMT + +_Initial release_ + diff --git a/packages/postgres-base/package.json b/packages/postgres-base/package.json index 06fcbc7352..97ad02ce83 100644 --- a/packages/postgres-base/package.json +++ b/packages/postgres-base/package.json @@ -28,7 +28,7 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.10", + "@hcengineering/platform-rig": "workspace:^0.7.11", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5", From d9a6dba6190e34215219336ba4e4e60bc9e7c800 Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Fri, 10 Oct 2025 21:13:30 +0700 Subject: [PATCH 20/40] Add tests for measurement and understand overhead --- .github/workflows/ci.yml | 2 + .../main_2025-10-10-14-14.json | 10 + .../measurements/main_2025-10-10-14-14.json | 10 + .../platform-rig/main_2025-10-10-14-14.json | 10 + .../postgres-base/main_2025-10-10-14-14.json | 10 + .../src/__tests__/telemetry.test.ts | 465 ++++++++++++++++++ .../src/__tests__/context.test.ts | 451 +++++++++++++++++ .../measurements/src/__tests__/index.test.ts | 47 ++ .../src/__tests__/metrics.test.ts | 297 +++++++++++ .../src/__tests__/performance.test.ts | 259 ++++++++++ 10 files changed, 1561 insertions(+) create mode 100644 common/changes/@hcengineering/measurements-otlp/main_2025-10-10-14-14.json create mode 100644 common/changes/@hcengineering/measurements/main_2025-10-10-14-14.json create mode 100644 common/changes/@hcengineering/platform-rig/main_2025-10-10-14-14.json create mode 100644 common/changes/@hcengineering/postgres-base/main_2025-10-10-14-14.json create mode 100644 packages/measurements-otlp/src/__tests__/telemetry.test.ts create mode 100644 packages/measurements/src/__tests__/context.test.ts create mode 100644 packages/measurements/src/__tests__/index.test.ts create mode 100644 packages/measurements/src/__tests__/metrics.test.ts create mode 100644 packages/measurements/src/__tests__/performance.test.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 106a1b21c2..14a261a995 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,6 +24,8 @@ jobs: run: node common/scripts/install-run-rush.js install - name: Rush validate run: node common/scripts/install-run-rush.js validate --verbose + - name: Rush test + run: node common/scripts/install-run-rush.js test --verbose - name: Publish packages if: startsWith(github.ref, 'refs/tags/v0.7.') env: diff --git a/common/changes/@hcengineering/measurements-otlp/main_2025-10-10-14-14.json b/common/changes/@hcengineering/measurements-otlp/main_2025-10-10-14-14.json new file mode 100644 index 0000000000..2f15c7c742 --- /dev/null +++ b/common/changes/@hcengineering/measurements-otlp/main_2025-10-10-14-14.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@hcengineering/measurements-otlp", + "comment": "Add tests", + "type": "none" + } + ], + "packageName": "@hcengineering/measurements-otlp" +} \ No newline at end of file diff --git a/common/changes/@hcengineering/measurements/main_2025-10-10-14-14.json b/common/changes/@hcengineering/measurements/main_2025-10-10-14-14.json new file mode 100644 index 0000000000..e0b4688e14 --- /dev/null +++ b/common/changes/@hcengineering/measurements/main_2025-10-10-14-14.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@hcengineering/measurements", + "comment": "Add tests", + "type": "none" + } + ], + "packageName": "@hcengineering/measurements" +} \ No newline at end of file diff --git a/common/changes/@hcengineering/platform-rig/main_2025-10-10-14-14.json b/common/changes/@hcengineering/platform-rig/main_2025-10-10-14-14.json new file mode 100644 index 0000000000..910ac32792 --- /dev/null +++ b/common/changes/@hcengineering/platform-rig/main_2025-10-10-14-14.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@hcengineering/platform-rig", + "comment": "", + "type": "none" + } + ], + "packageName": "@hcengineering/platform-rig" +} \ No newline at end of file diff --git a/common/changes/@hcengineering/postgres-base/main_2025-10-10-14-14.json b/common/changes/@hcengineering/postgres-base/main_2025-10-10-14-14.json new file mode 100644 index 0000000000..471a48b322 --- /dev/null +++ b/common/changes/@hcengineering/postgres-base/main_2025-10-10-14-14.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@hcengineering/postgres-base", + "comment": "", + "type": "none" + } + ], + "packageName": "@hcengineering/postgres-base" +} \ No newline at end of file diff --git a/packages/measurements-otlp/src/__tests__/telemetry.test.ts b/packages/measurements-otlp/src/__tests__/telemetry.test.ts new file mode 100644 index 0000000000..bd6aafa63a --- /dev/null +++ b/packages/measurements-otlp/src/__tests__/telemetry.test.ts @@ -0,0 +1,465 @@ +import { OpenTelemetryMetricsContext } from '../telemetry' +import { newMetrics, type MeasureLogger } from '@hcengineering/measurements' +import { trace, context, SpanStatusCode } from '@opentelemetry/api' +import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node' + +describe('telemetry', () => { + let tracer: any + let provider: NodeTracerProvider + + beforeAll(() => { + provider = new NodeTracerProvider() + provider.register() + tracer = trace.getTracer('test-tracer') + }) + + afterAll(() => { + provider.shutdown() + }) + + describe('OpenTelemetryMetricsContext', () => { + const mockLogger: MeasureLogger = { + info: jest.fn(), + error: jest.fn(), + warn: jest.fn(), + close: jest.fn(async () => {}), + logOperation: jest.fn() + } + + beforeEach(() => { + jest.clearAllMocks() + }) + + it('should create a new context with tracer', () => { + const metrics = newMetrics() + const ctx = new OpenTelemetryMetricsContext( + 'test', + tracer, + undefined, + undefined, + { op: 'create' }, + {}, + metrics, + mockLogger + ) + + expect(ctx).toBeDefined() + expect(ctx.metrics).toBe(metrics) + expect(ctx.logger).toBe(mockLogger) + }) + + it('should create child context with span', () => { + const metrics = newMetrics() + const ctx = new OpenTelemetryMetricsContext( + 'parent', + tracer, + context.active(), + undefined, + {}, + {}, + metrics, + mockLogger + ) + + const child = ctx.newChild('child', { op: 'child' }, { span: true }) + + expect(child).toBeDefined() + expect(child.parent).toBe(ctx) + }) + + it('should create child context without span when span is false', () => { + const metrics = newMetrics() + const ctx = new OpenTelemetryMetricsContext( + 'parent', + tracer, + context.active(), + undefined, + {}, + {}, + metrics, + mockLogger + ) + + const child = ctx.newChild('child', { op: 'child' }, { span: false }) + + expect(child).toBeDefined() + }) + + it('should execute async operation with context', async () => { + const metrics = newMetrics() + const ctx = new OpenTelemetryMetricsContext( + 'test', + tracer, + context.active(), + undefined, + {}, + {}, + metrics, + mockLogger + ) + + let executed = false + await ctx.with('operation', { op: 'test' }, async () => { + executed = true + await new Promise(resolve => setTimeout(resolve, 10)) + }) + + expect(executed).toBe(true) + expect(metrics.measurements.operation).toBeDefined() + }) + + it('should execute sync operation with context', () => { + const metrics = newMetrics() + const ctx = new OpenTelemetryMetricsContext( + 'test', + tracer, + context.active(), + undefined, + {}, + {}, + metrics, + mockLogger + ) + + const result = ctx.withSync('operation', { op: 'test' }, () => { + return 42 + }) + + expect(result).toBe(42) + expect(metrics.measurements.operation).toBeDefined() + }) + + it('should handle errors in async operations', async () => { + const metrics = newMetrics() + const span = tracer.startSpan('test-span') + const ctx = new OpenTelemetryMetricsContext( + 'test', + tracer, + context.active(), + span, + {}, + {}, + metrics, + mockLogger + ) + + await expect( + ctx.with('operation', { op: 'test' }, async () => { + throw new Error('Test error') + }) + ).rejects.toThrow('Test error') + + expect(metrics.measurements.operation).toBeDefined() + }) + + it('should measure custom value with meter', () => { + const metrics = newMetrics() + const mockMeter = { + getCounter: jest.fn(() => ({ + counter: { record: jest.fn() }, + value: 0 + })) + } + + const ctx = new OpenTelemetryMetricsContext( + 'test', + tracer, + undefined, + undefined, + { op: 'test' }, + {}, + metrics, + mockLogger, + undefined, + undefined, + undefined, + mockMeter as any + ) + + ctx.measure('custom', 100) + + expect(mockMeter.getCounter).toHaveBeenCalledWith('custom') + }) + + it('should log info with OTLP logger', () => { + const metrics = newMetrics() + const mockOtlpLogger = { + emit: jest.fn() + } + + const ctx = new OpenTelemetryMetricsContext( + 'test', + tracer, + context.active(), + undefined, + { op: 'test' }, + {}, + metrics, + mockLogger, + undefined, + undefined, + mockOtlpLogger as any + ) + + ctx.info('Test message', { key: 'value' }) + + expect(mockOtlpLogger.emit).toHaveBeenCalled() + expect(mockLogger.info).toHaveBeenCalled() + }) + + it('should log error with OTLP logger', () => { + const metrics = newMetrics() + const mockOtlpLogger = { + emit: jest.fn() + } + + const ctx = new OpenTelemetryMetricsContext( + 'test', + tracer, + context.active(), + undefined, + { op: 'test' }, + {}, + metrics, + mockLogger, + undefined, + undefined, + mockOtlpLogger as any + ) + + ctx.error('Error message', { error: 'details' }) + + expect(mockOtlpLogger.emit).toHaveBeenCalled() + expect(mockLogger.error).toHaveBeenCalled() + }) + + it('should log warn with OTLP logger', () => { + const metrics = newMetrics() + const mockOtlpLogger = { + emit: jest.fn() + } + + const ctx = new OpenTelemetryMetricsContext( + 'test', + tracer, + context.active(), + undefined, + { op: 'test' }, + {}, + metrics, + mockLogger, + undefined, + undefined, + mockOtlpLogger as any + ) + + ctx.warn('Warning message', { warning: 'info' }) + + expect(mockOtlpLogger.emit).toHaveBeenCalled() + expect(mockLogger.warn).toHaveBeenCalled() + }) + + it('should extract metadata from context', () => { + const metrics = newMetrics() + const ctx = new OpenTelemetryMetricsContext( + 'test', + tracer, + context.active(), + undefined, + {}, + {}, + metrics, + mockLogger + ) + + const meta = ctx.extractMeta() + + expect(meta).toBeDefined() + expect(typeof meta).toBe('object') + }) + + it('should get params', () => { + const metrics = newMetrics() + const ctx = new OpenTelemetryMetricsContext( + 'test', + tracer, + undefined, + undefined, + { op: 'test', method: 'GET' }, + {}, + metrics, + mockLogger + ) + + const params = ctx.getParams() + + expect(params).toEqual({ op: 'test', method: 'GET' }) + }) + + it('should share contextData with children', () => { + const metrics = newMetrics() + const ctx = new OpenTelemetryMetricsContext( + 'parent', + tracer, + context.active(), + undefined, + {}, + {}, + metrics, + mockLogger + ) + ctx.contextData = { userId: '123' } + + const child = ctx.newChild('child', {}) + + expect(child.contextData).toBe(ctx.contextData) + }) + + it('should inherit params when inheritParams is true', async () => { + const metrics = newMetrics() + const ctx = new OpenTelemetryMetricsContext( + 'parent', + tracer, + context.active(), + undefined, + { parentKey: 'parentValue' }, + {}, + metrics, + mockLogger + ) + + await ctx.with( + 'child', + { childKey: 'childValue' }, + async (childCtx) => { + expect(childCtx.getParams()).toEqual({ childKey: 'childValue' }) + }, + {}, + { inheritParams: false } + ) + + await ctx.with( + 'child', + { childKey: 'childValue' }, + async (childCtx) => { + expect(childCtx.getParams()).toEqual({ + parentKey: 'parentValue', + childKey: 'childValue' + }) + }, + {}, + { inheritParams: true } + ) + }) + + it('should not call end() twice', () => { + const metrics = newMetrics() + const span = tracer.startSpan('test-span') + const spanEndSpy = jest.spyOn(span, 'end') + + const ctx = new OpenTelemetryMetricsContext( + 'test', + tracer, + context.active(), + span, + {}, + {}, + metrics, + mockLogger + ) + + ctx.end() + ctx.end() // Second call should be no-op + + expect(spanEndSpy).toHaveBeenCalledTimes(1) + }) + + it('should handle null return value', async () => { + const metrics = newMetrics() + const ctx = new OpenTelemetryMetricsContext( + 'test', + tracer, + context.active(), + undefined, + {}, + {}, + metrics, + mockLogger + ) + + const result = await ctx.with('operation', {}, () => null) + + expect(result).toBeUndefined() + }) + + it('should log operation when log option is true', async () => { + const metrics = newMetrics() + const ctx = new OpenTelemetryMetricsContext( + 'test', + tracer, + context.active(), + undefined, + {}, + {}, + metrics, + mockLogger + ) + + await ctx.with( + 'operation', + { op: 'test' }, + async () => { + await new Promise(resolve => setTimeout(resolve, 10)) + }, + {}, + { log: true } + ) + + expect(mockLogger.logOperation).toHaveBeenCalledWith( + 'operation', + expect.any(Number), + expect.objectContaining({ op: 'test' }) + ) + }) + + it('should suppress tracing when span is disable', () => { + const metrics = newMetrics() + const ctx = new OpenTelemetryMetricsContext( + 'parent', + tracer, + context.active(), + undefined, + {}, + {}, + metrics, + mockLogger + ) + + const child = ctx.newChild('child', {}, { span: 'disable' }) + + expect(child).toBeDefined() + }) + + it('should set span attributes from params', () => { + const metrics = newMetrics() + + const ctx = new OpenTelemetryMetricsContext( + 'parent', + tracer, + context.active(), + undefined, + {}, + {}, + metrics, + mockLogger + ) + + // When creating a child with span: true, attributes are set on the child's span + const child = ctx.newChild('child', { key1: 'value1', key2: 'value2' }, { span: true }) as OpenTelemetryMetricsContext + + // The child should have been created successfully + expect(child).toBeDefined() + expect(child.parent).toBe(ctx) + }) + }) +}) diff --git a/packages/measurements/src/__tests__/context.test.ts b/packages/measurements/src/__tests__/context.test.ts new file mode 100644 index 0000000000..7a56de9579 --- /dev/null +++ b/packages/measurements/src/__tests__/context.test.ts @@ -0,0 +1,451 @@ +import { + MeasureMetricsContext, + NoMetricsContext, + consoleLogger, + noParamsLogger, + withContext, + setOperationLogProfiling, + registerOperationLog, + updateOperationLog, + addOperation +} from '../context' +import { newMetrics } from '../metrics' +import type { MeasureLogger, MeasureContext } from '../types' + +describe('context', () => { + describe('consoleLogger', () => { + it('should create a logger with params', () => { + const logger = consoleLogger({ service: 'test' }) + + expect(logger).toBeDefined() + expect(typeof logger.info).toBe('function') + expect(typeof logger.error).toBe('function') + expect(typeof logger.warn).toBe('function') + expect(typeof logger.close).toBe('function') + }) + + it('should log info messages', () => { + const consoleSpy = jest.spyOn(console, 'info').mockImplementation() + const logger = consoleLogger({ service: 'test' }) + + logger.info('Test message', { key: 'value' }) + + expect(consoleSpy).toHaveBeenCalled() + consoleSpy.mockRestore() + }) + + it('should log error messages', () => { + const consoleSpy = jest.spyOn(console, 'error').mockImplementation() + const logger = consoleLogger({ service: 'test' }) + + logger.error('Error message', { error: 'details' }) + + expect(consoleSpy).toHaveBeenCalled() + consoleSpy.mockRestore() + }) + + it('should log warn messages', () => { + const consoleSpy = jest.spyOn(console, 'warn').mockImplementation() + const logger = consoleLogger({ service: 'test' }) + + logger.warn('Warning message', { warning: 'info' }) + + expect(consoleSpy).toHaveBeenCalled() + consoleSpy.mockRestore() + }) + + it('should handle errors in params', () => { + const consoleSpy = jest.spyOn(console, 'error').mockImplementation() + const logger = consoleLogger({}) + const error = new Error('Test error') + + logger.error('Error occurred', { error }) + + expect(consoleSpy).toHaveBeenCalled() + const call = consoleSpy.mock.calls[0] + expect(call[0]).toBe('Error occurred') + consoleSpy.mockRestore() + }) + }) + + describe('MeasureMetricsContext', () => { + let logger: MeasureLogger + + beforeEach(() => { + logger = noParamsLogger + }) + + it('should create a new context', () => { + const metrics = newMetrics() + const ctx = new MeasureMetricsContext('test', { op: 'create' }, {}, metrics, logger) + + expect(ctx).toBeDefined() + expect(ctx.metrics).toBe(metrics) + expect(ctx.logger).toBe(logger) + }) + + it('should measure operation duration', async () => { + const metrics = newMetrics() + const ctx = new MeasureMetricsContext('test', { op: 'create' }, {}, metrics, logger) + + await new Promise(resolve => setTimeout(resolve, 50)) + ctx.end() + + expect(metrics.operations).toBe(1) + expect(metrics.value).toBeGreaterThan(40) + }) + + it('should create child context', () => { + const metrics = newMetrics() + const ctx = new MeasureMetricsContext('parent', { op: 'parent' }, {}, metrics, logger) + const child = ctx.newChild('child', { op: 'child' }) + + expect(child).toBeDefined() + expect(child.parent).toBe(ctx) + }) + + it('should execute async operation with context', async () => { + const metrics = newMetrics() + const ctx = new MeasureMetricsContext('test', {}, {}, metrics, logger) + + let executed = false + await ctx.with('operation', { op: 'test' }, async () => { + executed = true + await new Promise(resolve => setTimeout(resolve, 10)) + }) + + expect(executed).toBe(true) + expect(metrics.measurements.operation).toBeDefined() + }) + + it('should execute sync operation with context', () => { + const metrics = newMetrics() + const ctx = new MeasureMetricsContext('test', {}, {}, metrics, logger) + + const result = ctx.withSync('operation', { op: 'test' }, () => { + return 42 + }) + + expect(result).toBe(42) + expect(metrics.measurements.operation).toBeDefined() + }) + + it('should measure custom value', () => { + const metrics = newMetrics() + const ctx = new MeasureMetricsContext('test', {}, {}, metrics, logger) + + ctx.measure('custom', 100) + + expect(metrics.measurements['#custom']).toBeDefined() + expect(metrics.measurements['#custom'].value).toBe(100) + }) + + it('should log info messages', () => { + const mockLogger: MeasureLogger = { + info: jest.fn(), + error: jest.fn(), + warn: jest.fn(), + close: jest.fn(async () => {}), + logOperation: jest.fn() + } + + const ctx = new MeasureMetricsContext('test', { op: 'test' }, {}, newMetrics(), mockLogger) + ctx.info('Test message', { key: 'value' }) + + expect(mockLogger.info).toHaveBeenCalledWith('Test message', expect.objectContaining({ key: 'value', op: 'test' })) + }) + + it('should log error messages', () => { + const mockLogger: MeasureLogger = { + info: jest.fn(), + error: jest.fn(), + warn: jest.fn(), + close: jest.fn(async () => {}), + logOperation: jest.fn() + } + + const ctx = new MeasureMetricsContext('test', { op: 'test' }, {}, newMetrics(), mockLogger) + ctx.error('Error message', { error: 'details' }) + + expect(mockLogger.error).toHaveBeenCalledWith('Error message', expect.objectContaining({ error: 'details', op: 'test' })) + }) + + it('should log warn messages', () => { + const mockLogger: MeasureLogger = { + info: jest.fn(), + error: jest.fn(), + warn: jest.fn(), + close: jest.fn(async () => {}), + logOperation: jest.fn() + } + + const ctx = new MeasureMetricsContext('test', { op: 'test' }, {}, newMetrics(), mockLogger) + ctx.warn('Warning message', { warning: 'info' }) + + expect(mockLogger.warn).toHaveBeenCalledWith('Warning message', expect.objectContaining({ warning: 'info', op: 'test' })) + }) + + it('should get params', () => { + const ctx = new MeasureMetricsContext('test', { op: 'test', method: 'GET' }, {}, newMetrics(), logger) + const params = ctx.getParams() + + expect(params).toEqual({ op: 'test', method: 'GET' }) + }) + + it('should share contextData with children', () => { + const metrics = newMetrics() + const ctx = new MeasureMetricsContext('parent', {}, {}, metrics, logger) + ctx.contextData = { userId: '123' } + + const child = ctx.newChild('child', {}) + + expect(child.contextData).toBe(ctx.contextData) + }) + + it('should handle named parameters', () => { + const metrics = newMetrics() + new MeasureMetricsContext('test', { method: 'GET' }, {}, metrics, logger) + + expect(metrics.namedParams.method).toBe('GET') + }) + + it('should update named parameters on multiple contexts', () => { + const metrics = newMetrics() + const ctx1 = new MeasureMetricsContext('test1', { method: 'GET' }, {}, metrics, logger) + + expect(metrics.namedParams.method).toBe('GET') + + // Create another context with different value for same param + const ctx2 = new MeasureMetricsContext('test2', { method: 'POST' }, {}, metrics, logger) + + // The second context will see existing value is different, so it will update to '*' + // But this happens within the constructor logic + expect(metrics.namedParams.method).toBe('POST') + }) + }) + + describe('NoMetricsContext', () => { + it('should create a no-op context', () => { + const ctx = new NoMetricsContext() + + expect(ctx).toBeDefined() + expect(ctx.logger).toBeDefined() + }) + + it('should execute operations without measuring', async () => { + const ctx = new NoMetricsContext() + + let executed = false + await ctx.with('operation', {}, async () => { + executed = true + }) + + expect(executed).toBe(true) + }) + + it('should create child contexts', () => { + const ctx = new NoMetricsContext() + const child = ctx.newChild('child', {}) + + expect(child).toBeDefined() + expect(child).toBeInstanceOf(NoMetricsContext) + }) + + it('should handle measure calls without error', () => { + const ctx = new NoMetricsContext() + + expect(() => { + ctx.measure('test', 100) + }).not.toThrow() + }) + + it('should handle end calls without error', () => { + const ctx = new NoMetricsContext() + + expect(() => { + ctx.end() + }).not.toThrow() + }) + + it('should return empty params', () => { + const ctx = new NoMetricsContext() + const params = ctx.getParams() + + expect(params).toEqual({}) + }) + }) + + describe('withContext decorator', () => { + it('should wrap method with context', async () => { + class TestClass { + @withContext('testOperation', { service: 'test' }) + async testMethod(ctx: MeasureContext, value: number): Promise { + return value * 2 + } + } + + const instance = new TestClass() + const metrics = newMetrics() + const ctx = new MeasureMetricsContext('root', {}, {}, metrics, noParamsLogger) + + const result = await instance.testMethod(ctx, 21) + + expect(result).toBe(42) + expect(metrics.measurements.testOperation).toBeDefined() + }) + }) + + describe('operation log profiling', () => { + beforeEach(() => { + setOperationLogProfiling(false) + }) + + afterEach(() => { + setOperationLogProfiling(false) + }) + + it('should register operation log when profiling enabled', () => { + setOperationLogProfiling(true) + const metrics = newMetrics() + const ctx = new MeasureMetricsContext('test', {}, {}, metrics, noParamsLogger) + + const { opLogMetrics, op } = registerOperationLog(ctx) + + expect(opLogMetrics).toBe(metrics) + expect(op).toBeDefined() + expect(ctx.id).toBeDefined() + }) + + it('should not register operation log when profiling disabled', () => { + setOperationLogProfiling(false) + const metrics = newMetrics() + const ctx = new MeasureMetricsContext('test', {}, {}, metrics, noParamsLogger) + + const { opLogMetrics, op } = registerOperationLog(ctx) + + expect(opLogMetrics).toBeUndefined() + expect(op).toBeUndefined() + }) + + it('should update operation log', () => { + setOperationLogProfiling(true) + const metrics = newMetrics() + const ctx = new MeasureMetricsContext('test', {}, {}, metrics, noParamsLogger) + + const { opLogMetrics, op } = registerOperationLog(ctx) + updateOperationLog(opLogMetrics, op) + + expect(op?.end).toBeGreaterThan(0) + }) + + it('should add operation to log', async () => { + setOperationLogProfiling(true) + const metrics = newMetrics() + const ctx = new MeasureMetricsContext('test', {}, {}, metrics, noParamsLogger) + + registerOperationLog(ctx) + + let executed = false + await addOperation(ctx, 'asyncOp', { op: 'test' }, async () => { + executed = true + }) + + expect(executed).toBe(true) + expect(metrics.opLog).toBeDefined() + }) + + it('should limit operation log entries', () => { + setOperationLogProfiling(true) + const metrics = newMetrics() + const ctx = new MeasureMetricsContext('test', {}, {}, metrics, noParamsLogger) + + registerOperationLog(ctx) + + // Create many operation log entries + if (metrics.opLog && ctx.id) { + for (let i = 0; i < 50; i++) { + metrics.opLog[ctx.id].ops.push({ + op: `test${i}`, + start: i, + end: i + 1, + params: {} + }) + } + + const op = metrics.opLog[ctx.id] + updateOperationLog(metrics, op) + + expect(Object.keys(metrics.opLog).length).toBeLessThanOrEqual(31) + } + }) + }) + + describe('extractMeta', () => { + it('should return empty metadata', () => { + const ctx = new MeasureMetricsContext('test', {}, {}, newMetrics(), noParamsLogger) + const meta = ctx.extractMeta() + + expect(meta).toEqual({}) + }) + }) + + describe('async operations', () => { + it('should handle promise rejection', async () => { + const metrics = newMetrics() + const ctx = new MeasureMetricsContext('test', {}, {}, metrics, noParamsLogger) + + await expect( + ctx.with('operation', { op: 'test' }, async () => { + throw new Error('Test error') + }) + ).rejects.toThrow('Test error') + + expect(metrics.measurements.operation).toBeDefined() + }) + + it('should return null promise for null sync result', async () => { + const metrics = newMetrics() + const ctx = new MeasureMetricsContext('test', {}, {}, metrics, noParamsLogger) + + const result = await ctx.with('operation', { op: 'test' }, () => { + return null + }) + + expect(result).toBeUndefined() + }) + + it('should handle sync return value', async () => { + const metrics = newMetrics() + const ctx = new MeasureMetricsContext('test', {}, {}, metrics, noParamsLogger) + + const result = await ctx.with('operation', { op: 'test' }, () => { + return 42 + }) + + expect(result).toBe(42) + }) + + it('should log operation when log option is true', async () => { + const mockLogger: MeasureLogger = { + info: jest.fn(), + error: jest.fn(), + warn: jest.fn(), + close: jest.fn(async () => {}), + logOperation: jest.fn() + } + + const metrics = newMetrics() + const ctx = new MeasureMetricsContext('test', {}, {}, metrics, mockLogger) + + await ctx.with('operation', { op: 'test' }, async () => { + await new Promise(resolve => setTimeout(resolve, 10)) + }, {}, { log: true }) + + expect(mockLogger.logOperation).toHaveBeenCalledWith( + 'operation', + expect.any(Number), + expect.objectContaining({ op: 'test' }) + ) + }) + }) +}) diff --git a/packages/measurements/src/__tests__/index.test.ts b/packages/measurements/src/__tests__/index.test.ts new file mode 100644 index 0000000000..1bd75aff15 --- /dev/null +++ b/packages/measurements/src/__tests__/index.test.ts @@ -0,0 +1,47 @@ +import { platformNow, platformNowDiff } from '../index' + +describe('index', () => { + describe('platformNow', () => { + it('should return a positive number', () => { + const now = platformNow() + expect(typeof now).toBe('number') + expect(now).toBeGreaterThan(0) + }) + + it('should return increasing values over time', async () => { + const first = platformNow() + await new Promise(resolve => setTimeout(resolve, 10)) + const second = platformNow() + expect(second).toBeGreaterThan(first) + }) + }) + + describe('platformNowDiff', () => { + it('should calculate the difference between timestamps', async () => { + const start = platformNow() + await new Promise(resolve => setTimeout(resolve, 50)) + const diff = platformNowDiff(start) + + expect(diff).toBeGreaterThan(40) + expect(diff).toBeLessThan(100) + }) + + it('should round to 2 decimal places', async () => { + const start = platformNow() + await new Promise(resolve => setTimeout(resolve, 10)) + const diff = platformNowDiff(start) + + // Check that it has at most 2 decimal places + const decimalPlaces = (diff.toString().split('.')[1] || '').length + expect(decimalPlaces).toBeLessThanOrEqual(2) + }) + + it('should handle very small differences', () => { + const start = platformNow() + const diff = platformNowDiff(start) + + expect(diff).toBeGreaterThanOrEqual(0) + expect(typeof diff).toBe('number') + }) + }) +}) diff --git a/packages/measurements/src/__tests__/metrics.test.ts b/packages/measurements/src/__tests__/metrics.test.ts new file mode 100644 index 0000000000..108a614e44 --- /dev/null +++ b/packages/measurements/src/__tests__/metrics.test.ts @@ -0,0 +1,297 @@ +import { + newMetrics, + measure, + childMetrics, + metricsAggregate, + metricsToString, + metricsToJson, + metricsToRows, + updateMeasure +} from '../metrics' +import { platformNow } from '../index' + +describe('metrics', () => { + describe('newMetrics', () => { + it('should create a new metrics object with default values', () => { + const metrics = newMetrics() + + expect(metrics.operations).toBe(0) + expect(metrics.value).toBe(0) + expect(metrics.measurements).toEqual({}) + expect(metrics.params).toEqual({}) + expect(metrics.namedParams).toEqual({}) + }) + }) + + describe('measure', () => { + it('should measure operation duration', async () => { + const metrics = newMetrics() + const done = measure(metrics, { operation: 'test' }) + + await new Promise(resolve => setTimeout(resolve, 50)) + done() + + expect(metrics.operations).toBe(1) + expect(metrics.value).toBeGreaterThan(40) + }) + + it('should call endOp callback with duration', async () => { + const metrics = newMetrics() + let capturedSpend = 0 + const done = measure(metrics, { operation: 'test' }, {}, (spend) => { + capturedSpend = spend + }) + + await new Promise(resolve => setTimeout(resolve, 50)) + done() + + expect(capturedSpend).toBeGreaterThan(40) + }) + + it('should handle multiple operations', async () => { + const metrics = newMetrics() + + const done1 = measure(metrics, { operation: 'test' }) + await new Promise(resolve => setTimeout(resolve, 20)) + done1() + + const done2 = measure(metrics, { operation: 'test' }) + await new Promise(resolve => setTimeout(resolve, 20)) + done2() + + expect(metrics.operations).toBe(2) + expect(metrics.value).toBeGreaterThan(30) + }) + }) + + describe('updateMeasure', () => { + it('should update metrics with custom value', () => { + const metrics = newMetrics() + const st = platformNow() + + updateMeasure(metrics, st, { op: 'test' }, {}, undefined, 100) + + expect(metrics.operations).toBe(1) + expect(metrics.value).toBe(100) + }) + + it('should override operations when override is true', () => { + const metrics = newMetrics() + const st = platformNow() + + // First call without override - accumulates value and increments operations + updateMeasure(metrics, st, { op: 'test' }, {}, undefined, 50, false) + expect(metrics.value).toBe(50) + expect(metrics.operations).toBe(1) + + // Second call with override - sets operations, doesn't add to value + updateMeasure(metrics, st, { op: 'test' }, {}, undefined, 100, true) + + expect(metrics.operations).toBe(100) // overridden + expect(metrics.value).toBe(50) // not changed when override=true + }) + + it('should track parameters', () => { + const metrics = newMetrics() + const st = platformNow() + + updateMeasure(metrics, st, { method: 'GET' }, {}, undefined, 100) + updateMeasure(metrics, st, { method: 'POST' }, {}, undefined, 200) + + expect(metrics.params.method).toBeDefined() + expect(metrics.params.method.GET).toBeDefined() + expect(metrics.params.method.POST).toBeDefined() + expect(metrics.params.method.GET.value).toBe(100) + expect(metrics.params.method.POST.value).toBe(200) + }) + + it('should handle multiple parameters as counters', () => { + const metrics = newMetrics() + const st = platformNow() + + updateMeasure(metrics, st, { method: 'GET', status: '200' }, {}, undefined, 100) + updateMeasure(metrics, st, { method: 'GET', status: '404' }, {}, undefined, 50) + + expect(metrics.params.method.GET).toBeDefined() + expect(metrics.params.method.GET.topResult).toBeDefined() + expect(metrics.params.method.GET.topResult?.length).toBeGreaterThan(0) + }) + + it('should update top results', () => { + const metrics = newMetrics() + const st = platformNow() + + updateMeasure(metrics, st, {}, { request: 'slow' }, undefined, 100) + updateMeasure(metrics, st, {}, { request: 'fast' }, undefined, 10) + + expect(metrics.topResult).toBeDefined() + expect(metrics.topResult?.length).toBeGreaterThan(0) + }) + }) + + describe('childMetrics', () => { + it('should create child metrics in hierarchy', () => { + const root = newMetrics() + const child = childMetrics(root, ['level1', 'level2']) + + expect(root.measurements.level1).toBeDefined() + expect(root.measurements.level1.measurements.level2).toBeDefined() + expect(child).toBe(root.measurements.level1.measurements.level2) + }) + + it('should reuse existing child metrics', () => { + const root = newMetrics() + const child1 = childMetrics(root, ['level1']) + const child2 = childMetrics(root, ['level1']) + + expect(child1).toBe(child2) + }) + + it('should create nested paths', () => { + const root = newMetrics() + childMetrics(root, ['api', 'users', 'create']) + + expect(root.measurements.api).toBeDefined() + expect(root.measurements.api.measurements.users).toBeDefined() + expect(root.measurements.api.measurements.users.measurements.create).toBeDefined() + }) + }) + + describe('metricsAggregate', () => { + it('should aggregate metrics', () => { + const metrics = newMetrics() + metrics.value = 100 + metrics.operations = 10 + + const child1 = childMetrics(metrics, ['child1']) + child1.value = 50 + child1.operations = 5 + + const child2 = childMetrics(metrics, ['child2']) + child2.value = 30 + child2.operations = 3 + + const aggregated = metricsAggregate(metrics) + + expect(aggregated.value).toBe(80) // child1 + child2 + expect(aggregated.operations).toBe(10) + }) + + it('should limit number of child metrics', () => { + const metrics = newMetrics() + + for (let i = 0; i < 10; i++) { + const child = childMetrics(metrics, [`child${i}`]) + child.value = i * 10 + } + + const aggregated = metricsAggregate(metrics, 3) + + expect(Object.keys(aggregated.measurements).length).toBe(3) + }) + + it('should filter out metrics starting with #', () => { + const metrics = newMetrics() + + const child1 = childMetrics(metrics, ['normal']) + child1.value = 50 + + const child2 = childMetrics(metrics, ['#internal']) + child2.value = 30 + + const aggregated = metricsAggregate(metrics) + + expect(aggregated.value).toBe(50) // only 'normal' counted + }) + }) + + describe('metricsToString', () => { + it('should convert metrics to string', () => { + const metrics = newMetrics() + metrics.value = 100 + metrics.operations = 10 + + const str = metricsToString(metrics, 'TestMetrics', 50) + + expect(str).toContain('TestMetrics') + expect(str).toContain('100') + expect(str).toContain('10') + }) + + it('should include child metrics in string', () => { + const metrics = newMetrics() + const child = childMetrics(metrics, ['operation']) + child.value = 50 + child.operations = 5 + + const str = metricsToString(metrics, 'TestMetrics', 50) + + expect(str).toContain('operation') + }) + }) + + describe('metricsToJson', () => { + it('should convert metrics to JSON', () => { + const metrics = newMetrics() + metrics.value = 100 + metrics.operations = 10 + + const json = metricsToJson(metrics) + + // aggregated value is the total value when no children + expect(json.$total).toBe(100) + expect(json.$ops).toBe(10) + }) + + it('should include child metrics in JSON', () => { + const metrics = newMetrics() + const child = childMetrics(metrics, ['operation']) + child.value = 50 + child.operations = 5 + + const json = metricsToJson(metrics) + + expect(json).toBeDefined() + const keys = Object.keys(json) + expect(keys.some(k => k.includes('operation'))).toBe(true) + }) + }) + + describe('metricsToRows', () => { + it('should convert metrics to rows', () => { + const metrics = newMetrics() + metrics.value = 100 + metrics.operations = 10 + + const rows = metricsToRows(metrics, 'TestMetrics') + + expect(Array.isArray(rows)).toBe(true) + expect(rows.length).toBeGreaterThan(0) + expect(rows[0]).toContain('TestMetrics') + }) + + it('should include child metrics in rows', () => { + const metrics = newMetrics() + const child = childMetrics(metrics, ['operation']) + child.value = 50 + child.operations = 5 + + const rows = metricsToRows(metrics, 'TestMetrics') + + expect(rows.length).toBeGreaterThan(1) + expect(rows.some(row => row.includes('operation'))).toBe(true) + }) + + it('should properly format row values', () => { + const metrics = newMetrics() + metrics.value = 100 + metrics.operations = 10 + + const rows = metricsToRows(metrics, 'TestMetrics') + + expect(rows[0]).toHaveLength(5) // offset, name, avg, total, ops + expect(typeof rows[0][0]).toBe('number') // offset + expect(typeof rows[0][1]).toBe('string') // name + }) + }) +}) diff --git a/packages/measurements/src/__tests__/performance.test.ts b/packages/measurements/src/__tests__/performance.test.ts new file mode 100644 index 0000000000..315690fd9e --- /dev/null +++ b/packages/measurements/src/__tests__/performance.test.ts @@ -0,0 +1,259 @@ +import { MeasureMetricsContext, NoMetricsContext } from '../context' +import { newMetrics, metricsAggregate } from '../metrics' +import { noParamsLogger } from '../context' +import type { MeasureContext } from '../types' + +describe('performance', () => { + describe('overhead measurement', () => { + // Reduced iterations to fit within 10 seconds total test time + const iterations = 100 + const depth = 5 + + it('should measure overhead of with() vs raw execution', async () => { + // Baseline: raw execution without measurement + const baselineStart = performance.now() + for (let i = 0; i < iterations; i++) { + await simulateWork(1) + } + const baselineTime = performance.now() - baselineStart + + // With measurement context + const metrics = newMetrics() + const ctx = new MeasureMetricsContext('root', {}, {}, metrics, noParamsLogger) + + const measuredStart = performance.now() + for (let i = 0; i < iterations; i++) { + await ctx.with('operation', { iteration: i }, async () => { + await simulateWork(1) + }) + } + const measuredTime = performance.now() - measuredStart + + const overhead = measuredTime - baselineTime + const overheadPercentage = (overhead / baselineTime) * 100 + + console.log(`\nšŸ“Š Overhead Analysis (${iterations} iterations):`) + console.log(` Baseline time: ${baselineTime.toFixed(2)}ms`) + console.log(` Measured time: ${measuredTime.toFixed(2)}ms`) + console.log(` Overhead: ${overhead.toFixed(2)}ms (${overheadPercentage.toFixed(2)}%)`) + console.log(` Per operation: ${(overhead / iterations).toFixed(4)}ms`) + + expect(metrics.measurements.operation).toBeDefined() + expect(metrics.measurements.operation.operations).toBe(iterations) + + // Overhead should be reasonable (typically < 50% for simple operations) + // This is informational rather than a strict assertion + expect(overheadPercentage).toBeLessThan(200) + }) + + it('should measure overhead with deep nested contexts', async () => { + const metrics = newMetrics() + const ctx = new MeasureMetricsContext('root', {}, {}, metrics, noParamsLogger) + + // Baseline: single level + const singleLevelStart = performance.now() + for (let i = 0; i < iterations; i++) { + await ctx.with('shallow', {}, async () => { + await simulateWork(1) + }) + } + const singleLevelTime = performance.now() - singleLevelStart + + // Deep nesting + const deepStart = performance.now() + for (let i = 0; i < iterations; i++) { + await deepNestedExecution(ctx, depth, 1) + } + const deepTime = performance.now() - deepStart + + const nestingOverhead = deepTime - singleLevelTime + const overheadPerLevel = nestingOverhead / (iterations * depth) + + console.log(`\nšŸ“Š Deep Nesting Overhead (${iterations} iterations, depth=${depth}):`) + console.log(` Single level: ${singleLevelTime.toFixed(2)}ms`) + console.log(` Deep nested: ${deepTime.toFixed(2)}ms`) + console.log(` Nesting overhead: ${nestingOverhead.toFixed(2)}ms`) + console.log(` Per level: ${overheadPerLevel.toFixed(4)}ms`) + + expect(metrics.measurements.shallow).toBeDefined() + expect(metrics.measurements.level0).toBeDefined() + }) + + it('should measure overhead with complex parameter tracking', async () => { + const metrics = newMetrics() + const ctx = new MeasureMetricsContext('root', {}, {}, metrics, noParamsLogger) + + // Simple params + const simpleStart = performance.now() + for (let i = 0; i < iterations; i++) { + await ctx.with('simple', { id: i }, async () => { + await simulateWork(1) + }) + } + const simpleTime = performance.now() - simpleStart + + // Complex params with multiple tracked values + const complexStart = performance.now() + for (let i = 0; i < iterations; i++) { + await ctx.with('complex', + { + method: i % 3 === 0 ? 'GET' : i % 3 === 1 ? 'POST' : 'PUT', + status: i % 2 === 0 ? 200 : 404, + cached: i % 4 === 0 + }, + async () => { + await simulateWork(1) + }, + { + userId: `user_${i % 10}`, + endpoint: `/api/v1/resource/${i % 5}`, + timestamp: Date.now() + } + ) + } + const complexTime = performance.now() - complexStart + + const paramOverhead = complexTime - simpleTime + + console.log(`\nšŸ“Š Parameter Tracking Overhead (${iterations} iterations):`) + console.log(` Simple params: ${simpleTime.toFixed(2)}ms`) + console.log(` Complex params: ${complexTime.toFixed(2)}ms`) + console.log(` Param overhead: ${paramOverhead.toFixed(2)}ms`) + console.log(` Per operation: ${(paramOverhead / iterations).toFixed(4)}ms`) + + expect(metrics.measurements.simple).toBeDefined() + expect(metrics.measurements.complex).toBeDefined() + expect(Object.keys(metrics.measurements.complex.params).length).toBeGreaterThan(0) + }) + + it('should measure overhead with NoMetricsContext', async () => { + // NoMetricsContext should have minimal overhead + const noMetricsCtx = new NoMetricsContext(noParamsLogger) + + const start = performance.now() + for (let i = 0; i < iterations; i++) { + await noMetricsCtx.with('operation', { iteration: i }, async () => { + await simulateWork(1) + }) + } + const noMetricsTime = performance.now() - start + + // Compare with raw execution + const rawStart = performance.now() + for (let i = 0; i < iterations; i++) { + await simulateWork(1) + } + const rawTime = performance.now() - rawStart + + const overhead = noMetricsTime - rawTime + const overheadPercentage = (overhead / rawTime) * 100 + + console.log(`\nšŸ“Š NoMetricsContext Overhead (${iterations} iterations):`) + console.log(` Raw time: ${rawTime.toFixed(2)}ms`) + console.log(` NoMetrics time: ${noMetricsTime.toFixed(2)}ms`) + console.log(` Overhead: ${overhead.toFixed(2)}ms (${overheadPercentage.toFixed(2)}%)`) + + // NoMetricsContext should have very low overhead + expect(overheadPercentage).toBeLessThan(50) + }) + }) + + describe('realistic workload simulation', () => { + it('should measure overhead in complex realistic scenario', async () => { + const metrics = newMetrics() + const ctx = new MeasureMetricsContext('app', { service: 'api' }, {}, metrics, noParamsLogger) + + const requests = 50 + const baselineStart = performance.now() + + // Simulate without metrics + for (let i = 0; i < requests; i++) { + await simulateAPIRequest(null, i) + } + const baselineTime = performance.now() - baselineStart + + // Reset for measured run + const measuredStart = performance.now() + + // Simulate with metrics + for (let i = 0; i < requests; i++) { + await simulateAPIRequest(ctx, i) + } + const measuredTime = performance.now() - measuredStart + + const overhead = measuredTime - baselineTime + const overheadPercentage = (overhead / baselineTime) * 100 + + console.log(`\nšŸ“Š Realistic Workload Analysis (${requests} API requests):`) + console.log(` Baseline: ${baselineTime.toFixed(2)}ms`) + console.log(` With metrics: ${measuredTime.toFixed(2)}ms`) + console.log(` Overhead: ${overhead.toFixed(2)}ms (${overheadPercentage.toFixed(2)}%)`) + console.log(` Per request: ${(overhead / requests).toFixed(4)}ms`) + + // Check metrics structure + const aggregated = metricsAggregate(metrics, 10) + console.log(` Collected operations: ${aggregated.measurements.request?.operations || 0}`) + + expect(aggregated.measurements.request).toBeDefined() + expect(overheadPercentage).toBeLessThan(100) // Should be less than 100% overhead + }) + }) +}) + +// Helper functions + +async function simulateWork(durationMs: number): Promise { + const end = performance.now() + durationMs + while (performance.now() < end) { + // Busy wait to simulate work + Math.random() * Math.random() + } +} + +async function deepNestedExecution( + ctx: MeasureContext, + depth: number, + workMs: number, + currentLevel: number = 0 +): Promise { + if (currentLevel >= depth) { + await simulateWork(workMs) + return + } + + await ctx.with(`level${currentLevel}`, { level: currentLevel }, async (childCtx) => { + await deepNestedExecution(childCtx, depth, workMs, currentLevel + 1) + }) +} + +async function simulateAPIRequest(ctx: MeasureContext | null, requestId: number): Promise { + const method = ['GET', 'POST', 'PUT'][requestId % 3] + const endpoint = `/api/resource/${requestId % 10}` + + if (ctx === null) { + // No metrics version + await simulateWork(1) + // Simulate DB query + await simulateWork(2) + // Simulate processing + await simulateWork(1) + return + } + + // With metrics version + await ctx.with('request', { method, endpoint }, async (reqCtx) => { + await reqCtx.with('auth', { userId: `user_${requestId % 50}` }, async () => { + await simulateWork(1) + }) + + await reqCtx.with('database', { query: 'SELECT' }, async (dbCtx) => { + await dbCtx.with('query_execution', {}, async () => { + await simulateWork(2) + }) + }) + + await reqCtx.with('processing', { items: requestId % 20 }, async () => { + await simulateWork(1) + }) + }) +} \ No newline at end of file From 4ff95fba9efeb91ba9ddd9aab330ddaad52da697 Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Fri, 10 Oct 2025 21:16:06 +0700 Subject: [PATCH 21/40] Fix not updated lock file --- common/config/rush/pnpm-lock.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index a66d711c27..f58213e9a8 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -13,7 +13,7 @@ importers: ../../packages/measurements: devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.10 + specifier: workspace:^0.7.11 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 @@ -74,7 +74,7 @@ importers: version: 2.1.0(@opentelemetry/api@1.9.0) devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.10 + specifier: workspace:^0.7.11 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 @@ -135,7 +135,7 @@ importers: version: 3.4.7 devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.10 + specifier: workspace:^0.7.11 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 @@ -153,7 +153,7 @@ importers: ../scripts: devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.10 + specifier: workspace:^0.7.11 version: link:../../packages/platform-rig packages: From 16ba6a9fce6f238c44a38e08588dbf8f50d4d2e0 Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Fri, 10 Oct 2025 21:19:44 +0700 Subject: [PATCH 22/40] Fix update-deps --- packages/platform-rig/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/platform-rig/package.json b/packages/platform-rig/package.json index ede8259ed6..9caef2a7db 100644 --- a/packages/platform-rig/package.json +++ b/packages/platform-rig/package.json @@ -30,7 +30,7 @@ "do-svelte-check": "./bin/do-svelte-check.js", "bump-package-version": "./bin/bump-package-version.js", "bump-changes-from-tag": "./bin/bump-changes-from-tag.js", - "update-deps": "./bin/update-hcengineering-deps.js" + "update-deps": "./bin/update-deps.js" }, "publishConfig": { "access": "public" From 42d767d4ed5e0843a465a83b3c74a66f4e8de26f Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Fri, 10 Oct 2025 21:20:19 +0700 Subject: [PATCH 23/40] Fix update-deps --- .../platform-rig/main_2025-10-10-14-14.json | 10 ---------- common/config/rush/pnpm-lock.yaml | 8 ++++---- common/scripts/package.json | 2 +- packages/measurements-otlp/package.json | 2 +- packages/measurements/package.json | 2 +- packages/platform-rig/CHANGELOG.json | 12 ++++++++++++ packages/platform-rig/CHANGELOG.md | 9 ++++++++- packages/platform-rig/package.json | 2 +- packages/postgres-base/package.json | 2 +- 9 files changed, 29 insertions(+), 20 deletions(-) delete mode 100644 common/changes/@hcengineering/platform-rig/main_2025-10-10-14-14.json diff --git a/common/changes/@hcengineering/platform-rig/main_2025-10-10-14-14.json b/common/changes/@hcengineering/platform-rig/main_2025-10-10-14-14.json deleted file mode 100644 index 910ac32792..0000000000 --- a/common/changes/@hcengineering/platform-rig/main_2025-10-10-14-14.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "changes": [ - { - "packageName": "@hcengineering/platform-rig", - "comment": "", - "type": "none" - } - ], - "packageName": "@hcengineering/platform-rig" -} \ No newline at end of file diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index f58213e9a8..b124de599c 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -13,7 +13,7 @@ importers: ../../packages/measurements: devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.11 + specifier: workspace:^0.7.12 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 @@ -74,7 +74,7 @@ importers: version: 2.1.0(@opentelemetry/api@1.9.0) devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.11 + specifier: workspace:^0.7.12 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 @@ -135,7 +135,7 @@ importers: version: 3.4.7 devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.11 + specifier: workspace:^0.7.12 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 @@ -153,7 +153,7 @@ importers: ../scripts: devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.11 + specifier: workspace:^0.7.12 version: link:../../packages/platform-rig packages: diff --git a/common/scripts/package.json b/common/scripts/package.json index c9e8c21511..058d929774 100644 --- a/common/scripts/package.json +++ b/common/scripts/package.json @@ -5,7 +5,7 @@ "format": "echo \"No format specified\"" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.11" + "@hcengineering/platform-rig": "workspace:^0.7.12" }, "private": true } diff --git a/packages/measurements-otlp/package.json b/packages/measurements-otlp/package.json index 6629bff49e..26abe9d052 100644 --- a/packages/measurements-otlp/package.json +++ b/packages/measurements-otlp/package.json @@ -27,7 +27,7 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.11", + "@hcengineering/platform-rig": "workspace:^0.7.12", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5" diff --git a/packages/measurements/package.json b/packages/measurements/package.json index beed045d3e..08e79ff7b2 100644 --- a/packages/measurements/package.json +++ b/packages/measurements/package.json @@ -27,7 +27,7 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.11", + "@hcengineering/platform-rig": "workspace:^0.7.12", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5" diff --git a/packages/platform-rig/CHANGELOG.json b/packages/platform-rig/CHANGELOG.json index e3a49bfc16..08e76f1a6e 100644 --- a/packages/platform-rig/CHANGELOG.json +++ b/packages/platform-rig/CHANGELOG.json @@ -1,6 +1,18 @@ { "name": "@hcengineering/platform-rig", "entries": [ + { + "version": "0.7.12", + "tag": "@hcengineering/platform-rig_v0.7.12", + "date": "Fri, 10 Oct 2025 14:20:06 GMT", + "comments": { + "patch": [ + { + "comment": "Fix update-deps script" + } + ] + } + }, { "version": "0.7.11", "tag": "@hcengineering/platform-rig_v0.7.11", diff --git a/packages/platform-rig/CHANGELOG.md b/packages/platform-rig/CHANGELOG.md index d492d68eee..873c611dd9 100644 --- a/packages/platform-rig/CHANGELOG.md +++ b/packages/platform-rig/CHANGELOG.md @@ -1,6 +1,13 @@ # Change Log - @hcengineering/platform-rig -This log was last generated on Fri, 10 Oct 2025 12:32:59 GMT and should not be manually modified. +This log was last generated on Fri, 10 Oct 2025 14:20:06 GMT and should not be manually modified. + +## 0.7.12 +Fri, 10 Oct 2025 14:20:06 GMT + +### Patches + +- Fix update-deps script ## 0.7.11 Fri, 10 Oct 2025 12:32:59 GMT diff --git a/packages/platform-rig/package.json b/packages/platform-rig/package.json index 9caef2a7db..8b94219f19 100644 --- a/packages/platform-rig/package.json +++ b/packages/platform-rig/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/platform-rig", - "version": "0.7.11", + "version": "0.7.12", "scripts": { "build": "echo 'Not required'", "format": "echo 'Not required'" diff --git a/packages/postgres-base/package.json b/packages/postgres-base/package.json index 97ad02ce83..331682a242 100644 --- a/packages/postgres-base/package.json +++ b/packages/postgres-base/package.json @@ -28,7 +28,7 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.11", + "@hcengineering/platform-rig": "workspace:^0.7.12", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5", From b1358b30e2c4cb8ed7d0ecfa3f4ae64229265e69 Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Sun, 12 Oct 2025 00:58:23 +0700 Subject: [PATCH 24/40] Script to sync eslint deps --- .../main_2025-10-10-14-14.json | 10 - .../measurements/main_2025-10-10-14-14.json | 10 - .../postgres-base/main_2025-10-10-14-14.json | 10 - common/config/rush/pnpm-lock.yaml | 346 ++++++++++++++---- common/scripts/package.json | 9 +- packages/measurements-otlp/CHANGELOG.json | 25 ++ packages/measurements-otlp/CHANGELOG.md | 9 +- packages/measurements-otlp/package.json | 16 +- .../src/__tests__/telemetry.test.ts | 40 +- packages/measurements/CHANGELOG.json | 22 ++ packages/measurements/CHANGELOG.md | 9 +- packages/measurements/package.json | 14 +- .../src/__tests__/context.test.ts | 168 +++++---- .../measurements/src/__tests__/index.test.ts | 14 +- .../src/__tests__/metrics.test.ts | 106 +++--- .../src/__tests__/performance.test.ts | 35 +- packages/measurements/src/index.ts | 2 +- packages/platform-rig/CHANGELOG.json | 12 + packages/platform-rig/CHANGELOG.md | 9 +- packages/platform-rig/bin/sync-eslint-deps.js | 187 ++++++++++ packages/platform-rig/package.json | 14 +- packages/postgres-base/CHANGELOG.json | 17 + packages/postgres-base/CHANGELOG.md | 9 +- packages/postgres-base/package.json | 14 +- 24 files changed, 814 insertions(+), 293 deletions(-) delete mode 100644 common/changes/@hcengineering/measurements-otlp/main_2025-10-10-14-14.json delete mode 100644 common/changes/@hcengineering/measurements/main_2025-10-10-14-14.json delete mode 100644 common/changes/@hcengineering/postgres-base/main_2025-10-10-14-14.json create mode 100755 packages/platform-rig/bin/sync-eslint-deps.js diff --git a/common/changes/@hcengineering/measurements-otlp/main_2025-10-10-14-14.json b/common/changes/@hcengineering/measurements-otlp/main_2025-10-10-14-14.json deleted file mode 100644 index 2f15c7c742..0000000000 --- a/common/changes/@hcengineering/measurements-otlp/main_2025-10-10-14-14.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "changes": [ - { - "packageName": "@hcengineering/measurements-otlp", - "comment": "Add tests", - "type": "none" - } - ], - "packageName": "@hcengineering/measurements-otlp" -} \ No newline at end of file diff --git a/common/changes/@hcengineering/measurements/main_2025-10-10-14-14.json b/common/changes/@hcengineering/measurements/main_2025-10-10-14-14.json deleted file mode 100644 index e0b4688e14..0000000000 --- a/common/changes/@hcengineering/measurements/main_2025-10-10-14-14.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "changes": [ - { - "packageName": "@hcengineering/measurements", - "comment": "Add tests", - "type": "none" - } - ], - "packageName": "@hcengineering/measurements" -} \ No newline at end of file diff --git a/common/changes/@hcengineering/postgres-base/main_2025-10-10-14-14.json b/common/changes/@hcengineering/postgres-base/main_2025-10-10-14-14.json deleted file mode 100644 index 471a48b322..0000000000 --- a/common/changes/@hcengineering/postgres-base/main_2025-10-10-14-14.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "changes": [ - { - "packageName": "@hcengineering/postgres-base", - "comment": "", - "type": "none" - } - ], - "packageName": "@hcengineering/postgres-base" -} \ No newline at end of file diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index b124de599c..480300df36 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -18,6 +18,30 @@ importers: '@types/jest': specifier: ^29.5.5 version: 29.5.14 + '@typescript-eslint/eslint-plugin': + specifier: ^8.46.0 + version: 8.46.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/parser': + specifier: ^8.46.0 + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) + eslint: + specifier: ^8.54.0 + version: 8.57.1 + eslint-config-standard-with-typescript: + specifier: ^40.0.0 + version: 40.0.0(@typescript-eslint/eslint-plugin@8.46.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.3) + eslint-plugin-import: + specifier: ^2.26.0 + version: 2.32.0(eslint@8.57.1) + eslint-plugin-n: + specifier: ^15.4.0 + version: 15.7.0(eslint@8.57.1) + eslint-plugin-node: + specifier: ^11.1.0 + version: 11.1.0(eslint@8.57.1) + eslint-plugin-promise: + specifier: ^6.1.1 + version: 6.6.0(eslint@8.57.1) jest: specifier: ^29.7.0 version: 29.7.0(@types/node@22.18.1) @@ -79,6 +103,30 @@ importers: '@types/jest': specifier: ^29.5.5 version: 29.5.14 + '@typescript-eslint/eslint-plugin': + specifier: ^8.46.0 + version: 8.46.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/parser': + specifier: ^8.46.0 + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) + eslint: + specifier: ^8.54.0 + version: 8.57.1 + eslint-config-standard-with-typescript: + specifier: ^40.0.0 + version: 40.0.0(@typescript-eslint/eslint-plugin@8.46.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.3) + eslint-plugin-import: + specifier: ^2.26.0 + version: 2.32.0(eslint@8.57.1) + eslint-plugin-n: + specifier: ^15.4.0 + version: 15.7.0(eslint@8.57.1) + eslint-plugin-node: + specifier: ^11.1.0 + version: 11.1.0(eslint@8.57.1) + eslint-plugin-promise: + specifier: ^6.1.1 + version: 6.6.0(eslint@8.57.1) jest: specifier: ^29.7.0 version: 29.7.0(@types/node@22.18.1) @@ -89,11 +137,11 @@ importers: ../../packages/platform-rig: dependencies: '@typescript-eslint/eslint-plugin': - specifier: ^6.11.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + specifier: ^8.46.0 + version: 8.46.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': - specifier: ^6.11.0 - version: 6.21.0(eslint@8.57.1)(typescript@5.9.3) + specifier: ^8.46.0 + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) esbuild: specifier: ^0.25.10 version: 0.25.10 @@ -105,7 +153,7 @@ importers: version: 8.57.1 eslint-config-standard-with-typescript: specifier: ^40.0.0 - version: 40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.3) + version: 40.0.0(@typescript-eslint/eslint-plugin@8.46.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.3) eslint-plugin-import: specifier: ^2.26.0 version: 2.32.0(eslint@8.57.1) @@ -143,6 +191,30 @@ importers: '@types/node': specifier: ^22.15.29 version: 22.18.1 + '@typescript-eslint/eslint-plugin': + specifier: ^8.46.0 + version: 8.46.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/parser': + specifier: ^8.46.0 + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) + eslint: + specifier: ^8.54.0 + version: 8.57.1 + eslint-config-standard-with-typescript: + specifier: ^40.0.0 + version: 40.0.0(@typescript-eslint/eslint-plugin@8.46.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.3) + eslint-plugin-import: + specifier: ^2.26.0 + version: 2.32.0(eslint@8.57.1) + eslint-plugin-n: + specifier: ^15.4.0 + version: 15.7.0(eslint@8.57.1) + eslint-plugin-node: + specifier: ^11.1.0 + version: 11.1.0(eslint@8.57.1) + eslint-plugin-promise: + specifier: ^6.1.1 + version: 6.6.0(eslint@8.57.1) jest: specifier: ^29.7.0 version: 29.7.0(@types/node@22.18.1) @@ -155,6 +227,27 @@ importers: '@hcengineering/platform-rig': specifier: workspace:^0.7.12 version: link:../../packages/platform-rig + '@typescript-eslint/eslint-plugin': + specifier: ^8.46.0 + version: 8.46.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/parser': + specifier: ^8.46.0 + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) + eslint: + specifier: ^8.54.0 + version: 8.57.1 + eslint-config-standard-with-typescript: + specifier: ^40.0.0 + version: 40.0.0(@typescript-eslint/eslint-plugin@8.46.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.3) + eslint-plugin-import: + specifier: ^2.26.0 + version: 2.32.0(eslint@8.57.1) + eslint-plugin-n: + specifier: ^15.4.0 + version: 15.7.0(eslint@8.57.1) + eslint-plugin-promise: + specifier: ^6.1.1 + version: 6.6.0(eslint@8.57.1) packages: @@ -1200,9 +1293,6 @@ packages: '@types/jest@29.5.14': resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==} - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} @@ -1224,9 +1314,6 @@ packages: '@types/pg@8.15.5': resolution: {integrity: sha512-LF7lF6zWEKxuT3/OR8wAZGzkg4ENGXFNyiV/JeOt9z5B+0ZVwbql9McqX5c/WStFq1GaGso7H1AzP/qSzmlCKQ==} - '@types/semver@7.7.1': - resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} - '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} @@ -1239,16 +1326,13 @@ packages: '@types/yargs@17.0.33': resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} - '@typescript-eslint/eslint-plugin@6.21.0': - resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/eslint-plugin@8.46.0': + resolution: {integrity: sha512-hA8gxBq4ukonVXPy0OKhiaUh/68D0E88GSmtC1iAEnGaieuDi38LhS7jdCHRLi6ErJBNDGCzvh5EnzdPwUc0DA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/parser': ^8.46.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/parser@6.21.0': resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} @@ -1260,24 +1344,48 @@ packages: typescript: optional: true + '@typescript-eslint/parser@8.46.0': + resolution: {integrity: sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/project-service@8.46.0': + resolution: {integrity: sha512-OEhec0mH+U5Je2NZOeK1AbVCdm0ChyapAyTeXVIYTPXDJ3F07+cu87PPXcGoYqZ7M9YJVvFnfpGg1UmCIqM+QQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/scope-manager@6.21.0': resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} engines: {node: ^16.0.0 || >=18.0.0} - '@typescript-eslint/type-utils@6.21.0': - resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/scope-manager@8.46.0': + resolution: {integrity: sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.46.0': + resolution: {integrity: sha512-WrYXKGAHY836/N7zoK/kzi6p8tXFhasHh8ocFL9VZSAkvH956gfeRfcnhs3xzRy8qQ/dq3q44v1jvQieMFg2cw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/type-utils@8.46.0': + resolution: {integrity: sha512-hy+lvYV1lZpVs2jRaEYvgCblZxUoJiPyCemwbQZ+NGulWkQRy0HRPYAoef/CNSzaLt+MLvMptZsHXHlkEilaeg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/types@6.21.0': resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/types@8.46.0': + resolution: {integrity: sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@6.21.0': resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} engines: {node: ^16.0.0 || >=18.0.0} @@ -1287,16 +1395,27 @@ packages: typescript: optional: true - '@typescript-eslint/utils@6.21.0': - resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/typescript-estree@8.46.0': + resolution: {integrity: sha512-ekDCUfVpAKWJbRfm8T1YRrCot1KFxZn21oV76v5Fj4tr7ELyk84OS+ouvYdcDAwZL89WpEkEj2DKQ+qg//+ucg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/utils@8.46.0': + resolution: {integrity: sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/visitor-keys@6.21.0': resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/visitor-keys@8.46.0': + resolution: {integrity: sha512-FrvMpAK+hTbFy7vH5j1+tMYHMSKLE6RzluFJlkFNKD0p9YsUT75JlBSmr5so3QRzvMwU5/bIEdeNrxm8du8l3Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} @@ -1707,6 +1826,12 @@ packages: eslint: optional: true + eslint-plugin-es@3.0.1: + resolution: {integrity: sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==} + engines: {node: '>=8.10.0'} + peerDependencies: + eslint: '>=4.19.1' + eslint-plugin-es@4.1.0: resolution: {integrity: sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==} engines: {node: '>=8.10.0'} @@ -1725,6 +1850,12 @@ packages: peerDependencies: eslint: '>=7.0.0' + eslint-plugin-node@11.1.0: + resolution: {integrity: sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==} + engines: {node: '>=8.10.0'} + peerDependencies: + eslint: '>=5.16.0' + eslint-plugin-promise@6.6.0: resolution: {integrity: sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1757,6 +1888,10 @@ packages: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint@8.57.1: resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2002,6 +2137,10 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} @@ -2443,6 +2582,10 @@ packages: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -2885,6 +3028,12 @@ packages: peerDependencies: typescript: '>=4.2.0' + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + ts-jest@29.4.1: resolution: {integrity: sha512-SaeUtjfpg9Uqu8IbeDKtdaS0g8lS6FT6OzM3ezrDfErPJPHNDo/Ey+VFGP1bQIDfagYDLyRpd7O15XpG1Es2Uw==} engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} @@ -4382,8 +4531,6 @@ snapshots: expect: 29.7.0 pretty-format: 29.7.0 - '@types/json-schema@7.0.15': {} - '@types/json5@0.0.29': {} '@types/memcached@2.2.10': @@ -4412,8 +4559,6 @@ snapshots: pg-protocol: 1.10.3 pg-types: 2.2.0 - '@types/semver@7.7.1': {} - '@types/stack-utils@2.0.3': {} '@types/tedious@4.0.14': @@ -4426,22 +4571,19 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.46.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.1 + '@typescript-eslint/parser': 8.46.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.46.0 + '@typescript-eslint/type-utils': 8.46.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.46.0 eslint: 8.57.1 graphemer: 1.4.0 - ignore: 5.3.2 + ignore: 7.0.5 natural-compare: 1.4.0 - semver: 7.7.2 - ts-api-utils: 1.4.3(typescript@5.9.3) - optionalDependencies: + ts-api-utils: 2.1.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -4459,25 +4601,57 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.46.0 + '@typescript-eslint/types': 8.46.0 + '@typescript-eslint/typescript-estree': 8.46.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.46.0 + debug: 4.4.1 + eslint: 8.57.1 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.46.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.46.0(typescript@5.9.3) + '@typescript-eslint/types': 8.46.0 + debug: 4.4.1 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/scope-manager@6.21.0': dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - '@typescript-eslint/type-utils@6.21.0(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/scope-manager@8.46.0': dependencies: - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.3) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/types': 8.46.0 + '@typescript-eslint/visitor-keys': 8.46.0 + + '@typescript-eslint/tsconfig-utils@8.46.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@typescript-eslint/type-utils@8.46.0(eslint@8.57.1)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.46.0 + '@typescript-eslint/typescript-estree': 8.46.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.0(eslint@8.57.1)(typescript@5.9.3) debug: 4.4.1 eslint: 8.57.1 - ts-api-utils: 1.4.3(typescript@5.9.3) - optionalDependencies: + ts-api-utils: 2.1.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color '@typescript-eslint/types@6.21.0': {} + '@typescript-eslint/types@8.46.0': {} + '@typescript-eslint/typescript-estree@6.21.0(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 6.21.0 @@ -4493,25 +4667,43 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.46.0(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) - '@types/json-schema': 7.0.15 - '@types/semver': 7.7.1 - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.3) - eslint: 8.57.1 + '@typescript-eslint/project-service': 8.46.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.46.0(typescript@5.9.3) + '@typescript-eslint/types': 8.46.0 + '@typescript-eslint/visitor-keys': 8.46.0 + debug: 4.4.1 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 semver: 7.7.2 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.46.0(eslint@8.57.1)(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) + '@typescript-eslint/scope-manager': 8.46.0 + '@typescript-eslint/types': 8.46.0 + '@typescript-eslint/typescript-estree': 8.46.0(typescript@5.9.3) + eslint: 8.57.1 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - - typescript '@typescript-eslint/visitor-keys@6.21.0': dependencies: '@typescript-eslint/types': 6.21.0 eslint-visitor-keys: 3.4.3 + '@typescript-eslint/visitor-keys@8.46.0': + dependencies: + '@typescript-eslint/types': 8.46.0 + eslint-visitor-keys: 4.2.1 + '@ungap/structured-clone@1.3.0': {} acorn-import-attributes@1.9.5(acorn@8.15.0): @@ -5016,9 +5208,9 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-standard-with-typescript@40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.3): + eslint-config-standard-with-typescript@40.0.0(@typescript-eslint/eslint-plugin@8.46.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.46.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.9.3) eslint: 8.57.1 eslint-config-standard: 17.1.0(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1) @@ -5048,6 +5240,12 @@ snapshots: optionalDependencies: eslint: 8.57.1 + eslint-plugin-es@3.0.1(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + eslint-utils: 2.1.0 + regexpp: 3.2.0 + eslint-plugin-es@4.1.0(eslint@8.57.1): dependencies: eslint: 8.57.1 @@ -5089,6 +5287,16 @@ snapshots: resolve: 1.22.10 semver: 7.7.2 + eslint-plugin-node@11.1.0(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + eslint-plugin-es: 3.0.1(eslint@8.57.1) + eslint-utils: 2.1.0 + ignore: 5.3.2 + minimatch: 3.1.2 + resolve: 1.22.10 + semver: 6.3.1 + eslint-plugin-promise@6.6.0(eslint@8.57.1): dependencies: eslint: 8.57.1 @@ -5113,6 +5321,8 @@ snapshots: eslint-visitor-keys@3.4.3: {} + eslint-visitor-keys@4.2.1: {} + eslint@8.57.1: dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) @@ -5423,6 +5633,8 @@ snapshots: ignore@5.3.2: {} + ignore@7.0.5: {} + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 @@ -6045,6 +6257,10 @@ snapshots: dependencies: brace-expansion: 2.0.2 + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + minimist@1.2.8: {} module-details-from-path@1.0.4: {} @@ -6509,6 +6725,10 @@ snapshots: dependencies: typescript: 5.9.3 + ts-api-utils@2.1.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + ts-jest@29.4.1(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest-util@29.7.0)(jest@29.7.0(@types/node@22.18.1))(typescript@5.9.3): dependencies: bs-logger: 0.2.6 diff --git a/common/scripts/package.json b/common/scripts/package.json index 058d929774..d394890641 100644 --- a/common/scripts/package.json +++ b/common/scripts/package.json @@ -5,7 +5,14 @@ "format": "echo \"No format specified\"" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.12" + "@hcengineering/platform-rig": "workspace:^0.7.13", + "@typescript-eslint/eslint-plugin": "^8.46.0", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-n": "^15.4.0", + "eslint": "^8.54.0", + "@typescript-eslint/parser": "^8.46.0", + "eslint-config-standard-with-typescript": "^40.0.0" }, "private": true } diff --git a/packages/measurements-otlp/CHANGELOG.json b/packages/measurements-otlp/CHANGELOG.json index 07533eb4ef..29981d5732 100644 --- a/packages/measurements-otlp/CHANGELOG.json +++ b/packages/measurements-otlp/CHANGELOG.json @@ -1,6 +1,31 @@ { "name": "@hcengineering/measurements-otlp", "entries": [ + { + "version": "0.7.11", + "tag": "@hcengineering/measurements-otlp_v0.7.11", + "date": "Sat, 11 Oct 2025 17:58:53 GMT", + "comments": { + "none": [ + { + "comment": "Add tests" + } + ], + "patch": [ + { + "comment": "Fix eslint deps" + } + ], + "dependency": [ + { + "comment": "Updating dependency \"@hcengineering/measurements\" from `^0.7.10` to `0.7.11`" + }, + { + "comment": "Updating dependency \"@hcengineering/platform-rig\" from `^0.7.12` to `0.7.13`" + } + ] + } + }, { "version": "0.7.10", "tag": "@hcengineering/measurements-otlp_v0.7.10", diff --git a/packages/measurements-otlp/CHANGELOG.md b/packages/measurements-otlp/CHANGELOG.md index 69185c1289..2b61689590 100644 --- a/packages/measurements-otlp/CHANGELOG.md +++ b/packages/measurements-otlp/CHANGELOG.md @@ -1,6 +1,13 @@ # Change Log - @hcengineering/measurements-otlp -This log was last generated on Fri, 10 Oct 2025 12:32:59 GMT and should not be manually modified. +This log was last generated on Sat, 11 Oct 2025 17:58:53 GMT and should not be manually modified. + +## 0.7.11 +Sat, 11 Oct 2025 17:58:53 GMT + +### Patches + +- Fix eslint deps ## 0.7.10 Fri, 10 Oct 2025 12:32:59 GMT diff --git a/packages/measurements-otlp/package.json b/packages/measurements-otlp/package.json index 26abe9d052..ef09da693e 100644 --- a/packages/measurements-otlp/package.json +++ b/packages/measurements-otlp/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/measurements-otlp", - "version": "0.7.10", + "version": "0.7.11", "main": "lib/index.js", "svelte": "src/index.ts", "types": "types/index.d.ts", @@ -27,13 +27,21 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.12", + "@hcengineering/platform-rig": "workspace:^0.7.13", "jest": "^29.7.0", "ts-jest": "^29.1.1", - "@types/jest": "^29.5.5" + "@types/jest": "^29.5.5", + "@typescript-eslint/eslint-plugin": "^8.46.0", + "@typescript-eslint/parser": "^8.46.0", + "eslint": "^8.54.0", + "eslint-config-standard-with-typescript": "^40.0.0", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-n": "^15.4.0" }, "dependencies": { - "@hcengineering/measurements": "workspace:^0.7.10", + "@hcengineering/measurements": "workspace:^0.7.11", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-logs": "^0.203.0", "@opentelemetry/auto-instrumentations-node": "^0.62.0", diff --git a/packages/measurements-otlp/src/__tests__/telemetry.test.ts b/packages/measurements-otlp/src/__tests__/telemetry.test.ts index bd6aafa63a..660147942f 100644 --- a/packages/measurements-otlp/src/__tests__/telemetry.test.ts +++ b/packages/measurements-otlp/src/__tests__/telemetry.test.ts @@ -1,7 +1,7 @@ -import { OpenTelemetryMetricsContext } from '../telemetry' import { newMetrics, type MeasureLogger } from '@hcengineering/measurements' -import { trace, context, SpanStatusCode } from '@opentelemetry/api' +import { context, trace } from '@opentelemetry/api' import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node' +import { OpenTelemetryMetricsContext } from '../telemetry' describe('telemetry', () => { let tracer: any @@ -14,7 +14,7 @@ describe('telemetry', () => { }) afterAll(() => { - provider.shutdown() + void provider.shutdown() }) describe('OpenTelemetryMetricsContext', () => { @@ -101,7 +101,7 @@ describe('telemetry', () => { let executed = false await ctx.with('operation', { op: 'test' }, async () => { executed = true - await new Promise(resolve => setTimeout(resolve, 10)) + await new Promise((resolve) => setTimeout(resolve, 10)) }) expect(executed).toBe(true) @@ -132,16 +132,7 @@ describe('telemetry', () => { it('should handle errors in async operations', async () => { const metrics = newMetrics() const span = tracer.startSpan('test-span') - const ctx = new OpenTelemetryMetricsContext( - 'test', - tracer, - context.active(), - span, - {}, - {}, - metrics, - mockLogger - ) + const ctx = new OpenTelemetryMetricsContext('test', tracer, context.active(), span, {}, {}, metrics, mockLogger) await expect( ctx.with('operation', { op: 'test' }, async () => { @@ -357,16 +348,7 @@ describe('telemetry', () => { const span = tracer.startSpan('test-span') const spanEndSpy = jest.spyOn(span, 'end') - const ctx = new OpenTelemetryMetricsContext( - 'test', - tracer, - context.active(), - span, - {}, - {}, - metrics, - mockLogger - ) + const ctx = new OpenTelemetryMetricsContext('test', tracer, context.active(), span, {}, {}, metrics, mockLogger) ctx.end() ctx.end() // Second call should be no-op @@ -409,7 +391,7 @@ describe('telemetry', () => { 'operation', { op: 'test' }, async () => { - await new Promise(resolve => setTimeout(resolve, 10)) + await new Promise((resolve) => setTimeout(resolve, 10)) }, {}, { log: true } @@ -442,7 +424,7 @@ describe('telemetry', () => { it('should set span attributes from params', () => { const metrics = newMetrics() - + const ctx = new OpenTelemetryMetricsContext( 'parent', tracer, @@ -455,7 +437,11 @@ describe('telemetry', () => { ) // When creating a child with span: true, attributes are set on the child's span - const child = ctx.newChild('child', { key1: 'value1', key2: 'value2' }, { span: true }) as OpenTelemetryMetricsContext + const child = ctx.newChild( + 'child', + { key1: 'value1', key2: 'value2' }, + { span: true } + ) as OpenTelemetryMetricsContext // The child should have been created successfully expect(child).toBeDefined() diff --git a/packages/measurements/CHANGELOG.json b/packages/measurements/CHANGELOG.json index ff042fd1e9..177ce67e4c 100644 --- a/packages/measurements/CHANGELOG.json +++ b/packages/measurements/CHANGELOG.json @@ -1,6 +1,28 @@ { "name": "@hcengineering/measurements", "entries": [ + { + "version": "0.7.11", + "tag": "@hcengineering/measurements_v0.7.11", + "date": "Sat, 11 Oct 2025 17:58:53 GMT", + "comments": { + "none": [ + { + "comment": "Add tests" + } + ], + "patch": [ + { + "comment": "Fix eslint deps" + } + ], + "dependency": [ + { + "comment": "Updating dependency \"@hcengineering/platform-rig\" from `^0.7.12` to `0.7.13`" + } + ] + } + }, { "version": "0.7.10", "tag": "@hcengineering/measurements_v0.7.10", diff --git a/packages/measurements/CHANGELOG.md b/packages/measurements/CHANGELOG.md index fa46e9c0ea..d532018d7d 100644 --- a/packages/measurements/CHANGELOG.md +++ b/packages/measurements/CHANGELOG.md @@ -1,6 +1,13 @@ # Change Log - @hcengineering/measurements -This log was last generated on Fri, 10 Oct 2025 12:32:59 GMT and should not be manually modified. +This log was last generated on Sat, 11 Oct 2025 17:58:53 GMT and should not be manually modified. + +## 0.7.11 +Sat, 11 Oct 2025 17:58:53 GMT + +### Patches + +- Fix eslint deps ## 0.7.10 Fri, 10 Oct 2025 12:32:59 GMT diff --git a/packages/measurements/package.json b/packages/measurements/package.json index 08e79ff7b2..58b92c3489 100644 --- a/packages/measurements/package.json +++ b/packages/measurements/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/measurements", - "version": "0.7.10", + "version": "0.7.11", "main": "lib/index.js", "svelte": "src/index.ts", "types": "types/index.d.ts", @@ -27,10 +27,18 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.12", + "@hcengineering/platform-rig": "workspace:^0.7.13", "jest": "^29.7.0", "ts-jest": "^29.1.1", - "@types/jest": "^29.5.5" + "@types/jest": "^29.5.5", + "@typescript-eslint/eslint-plugin": "^8.46.0", + "@typescript-eslint/parser": "^8.46.0", + "eslint": "^8.54.0", + "eslint-config-standard-with-typescript": "^40.0.0", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-n": "^15.4.0" }, "repository": "https://github.com/hcengineering/platform", "exports": { diff --git a/packages/measurements/src/__tests__/context.test.ts b/packages/measurements/src/__tests__/context.test.ts index 7a56de9579..ef9a65a662 100644 --- a/packages/measurements/src/__tests__/context.test.ts +++ b/packages/measurements/src/__tests__/context.test.ts @@ -16,7 +16,7 @@ describe('context', () => { describe('consoleLogger', () => { it('should create a logger with params', () => { const logger = consoleLogger({ service: 'test' }) - + expect(logger).toBeDefined() expect(typeof logger.info).toBe('function') expect(typeof logger.error).toBe('function') @@ -27,9 +27,9 @@ describe('context', () => { it('should log info messages', () => { const consoleSpy = jest.spyOn(console, 'info').mockImplementation() const logger = consoleLogger({ service: 'test' }) - + logger.info('Test message', { key: 'value' }) - + expect(consoleSpy).toHaveBeenCalled() consoleSpy.mockRestore() }) @@ -37,9 +37,9 @@ describe('context', () => { it('should log error messages', () => { const consoleSpy = jest.spyOn(console, 'error').mockImplementation() const logger = consoleLogger({ service: 'test' }) - + logger.error('Error message', { error: 'details' }) - + expect(consoleSpy).toHaveBeenCalled() consoleSpy.mockRestore() }) @@ -47,9 +47,9 @@ describe('context', () => { it('should log warn messages', () => { const consoleSpy = jest.spyOn(console, 'warn').mockImplementation() const logger = consoleLogger({ service: 'test' }) - + logger.warn('Warning message', { warning: 'info' }) - + expect(consoleSpy).toHaveBeenCalled() consoleSpy.mockRestore() }) @@ -58,9 +58,9 @@ describe('context', () => { const consoleSpy = jest.spyOn(console, 'error').mockImplementation() const logger = consoleLogger({}) const error = new Error('Test error') - + logger.error('Error occurred', { error }) - + expect(consoleSpy).toHaveBeenCalled() const call = consoleSpy.mock.calls[0] expect(call[0]).toBe('Error occurred') @@ -78,7 +78,7 @@ describe('context', () => { it('should create a new context', () => { const metrics = newMetrics() const ctx = new MeasureMetricsContext('test', { op: 'create' }, {}, metrics, logger) - + expect(ctx).toBeDefined() expect(ctx.metrics).toBe(metrics) expect(ctx.logger).toBe(logger) @@ -87,10 +87,10 @@ describe('context', () => { it('should measure operation duration', async () => { const metrics = newMetrics() const ctx = new MeasureMetricsContext('test', { op: 'create' }, {}, metrics, logger) - - await new Promise(resolve => setTimeout(resolve, 50)) + + await new Promise((resolve) => setTimeout(resolve, 50)) ctx.end() - + expect(metrics.operations).toBe(1) expect(metrics.value).toBeGreaterThan(40) }) @@ -99,7 +99,7 @@ describe('context', () => { const metrics = newMetrics() const ctx = new MeasureMetricsContext('parent', { op: 'parent' }, {}, metrics, logger) const child = ctx.newChild('child', { op: 'child' }) - + expect(child).toBeDefined() expect(child.parent).toBe(ctx) }) @@ -107,13 +107,13 @@ describe('context', () => { it('should execute async operation with context', async () => { const metrics = newMetrics() const ctx = new MeasureMetricsContext('test', {}, {}, metrics, logger) - + let executed = false await ctx.with('operation', { op: 'test' }, async () => { executed = true - await new Promise(resolve => setTimeout(resolve, 10)) + await new Promise((resolve) => setTimeout(resolve, 10)) }) - + expect(executed).toBe(true) expect(metrics.measurements.operation).toBeDefined() }) @@ -121,11 +121,11 @@ describe('context', () => { it('should execute sync operation with context', () => { const metrics = newMetrics() const ctx = new MeasureMetricsContext('test', {}, {}, metrics, logger) - + const result = ctx.withSync('operation', { op: 'test' }, () => { return 42 }) - + expect(result).toBe(42) expect(metrics.measurements.operation).toBeDefined() }) @@ -133,9 +133,9 @@ describe('context', () => { it('should measure custom value', () => { const metrics = newMetrics() const ctx = new MeasureMetricsContext('test', {}, {}, metrics, logger) - + ctx.measure('custom', 100) - + expect(metrics.measurements['#custom']).toBeDefined() expect(metrics.measurements['#custom'].value).toBe(100) }) @@ -148,11 +148,14 @@ describe('context', () => { close: jest.fn(async () => {}), logOperation: jest.fn() } - + const ctx = new MeasureMetricsContext('test', { op: 'test' }, {}, newMetrics(), mockLogger) ctx.info('Test message', { key: 'value' }) - - expect(mockLogger.info).toHaveBeenCalledWith('Test message', expect.objectContaining({ key: 'value', op: 'test' })) + + expect(mockLogger.info).toHaveBeenCalledWith( + 'Test message', + expect.objectContaining({ key: 'value', op: 'test' }) + ) }) it('should log error messages', () => { @@ -163,11 +166,14 @@ describe('context', () => { close: jest.fn(async () => {}), logOperation: jest.fn() } - + const ctx = new MeasureMetricsContext('test', { op: 'test' }, {}, newMetrics(), mockLogger) ctx.error('Error message', { error: 'details' }) - - expect(mockLogger.error).toHaveBeenCalledWith('Error message', expect.objectContaining({ error: 'details', op: 'test' })) + + expect(mockLogger.error).toHaveBeenCalledWith( + 'Error message', + expect.objectContaining({ error: 'details', op: 'test' }) + ) }) it('should log warn messages', () => { @@ -178,17 +184,20 @@ describe('context', () => { close: jest.fn(async () => {}), logOperation: jest.fn() } - + const ctx = new MeasureMetricsContext('test', { op: 'test' }, {}, newMetrics(), mockLogger) ctx.warn('Warning message', { warning: 'info' }) - - expect(mockLogger.warn).toHaveBeenCalledWith('Warning message', expect.objectContaining({ warning: 'info', op: 'test' })) + + expect(mockLogger.warn).toHaveBeenCalledWith( + 'Warning message', + expect.objectContaining({ warning: 'info', op: 'test' }) + ) }) it('should get params', () => { const ctx = new MeasureMetricsContext('test', { op: 'test', method: 'GET' }, {}, newMetrics(), logger) const params = ctx.getParams() - + expect(params).toEqual({ op: 'test', method: 'GET' }) }) @@ -196,28 +205,29 @@ describe('context', () => { const metrics = newMetrics() const ctx = new MeasureMetricsContext('parent', {}, {}, metrics, logger) ctx.contextData = { userId: '123' } - + const child = ctx.newChild('child', {}) - + expect(child.contextData).toBe(ctx.contextData) }) it('should handle named parameters', () => { const metrics = newMetrics() - new MeasureMetricsContext('test', { method: 'GET' }, {}, metrics, logger) - + const r = new MeasureMetricsContext('test', { method: 'GET' }, {}, metrics, logger) + expect(r).toBeNull() expect(metrics.namedParams.method).toBe('GET') }) it('should update named parameters on multiple contexts', () => { const metrics = newMetrics() const ctx1 = new MeasureMetricsContext('test1', { method: 'GET' }, {}, metrics, logger) - + expect(ctx1).toBeNull() expect(metrics.namedParams.method).toBe('GET') - + // Create another context with different value for same param const ctx2 = new MeasureMetricsContext('test2', { method: 'POST' }, {}, metrics, logger) - + expect(ctx2).toBeNull() + // The second context will see existing value is different, so it will update to '*' // But this happens within the constructor logic expect(metrics.namedParams.method).toBe('POST') @@ -227,33 +237,33 @@ describe('context', () => { describe('NoMetricsContext', () => { it('should create a no-op context', () => { const ctx = new NoMetricsContext() - + expect(ctx).toBeDefined() expect(ctx.logger).toBeDefined() }) it('should execute operations without measuring', async () => { const ctx = new NoMetricsContext() - + let executed = false await ctx.with('operation', {}, async () => { executed = true }) - + expect(executed).toBe(true) }) it('should create child contexts', () => { const ctx = new NoMetricsContext() const child = ctx.newChild('child', {}) - + expect(child).toBeDefined() expect(child).toBeInstanceOf(NoMetricsContext) }) it('should handle measure calls without error', () => { const ctx = new NoMetricsContext() - + expect(() => { ctx.measure('test', 100) }).not.toThrow() @@ -261,7 +271,7 @@ describe('context', () => { it('should handle end calls without error', () => { const ctx = new NoMetricsContext() - + expect(() => { ctx.end() }).not.toThrow() @@ -270,7 +280,7 @@ describe('context', () => { it('should return empty params', () => { const ctx = new NoMetricsContext() const params = ctx.getParams() - + expect(params).toEqual({}) }) }) @@ -279,17 +289,17 @@ describe('context', () => { it('should wrap method with context', async () => { class TestClass { @withContext('testOperation', { service: 'test' }) - async testMethod(ctx: MeasureContext, value: number): Promise { + async testMethod (ctx: MeasureContext, value: number): Promise { return value * 2 } } - + const instance = new TestClass() const metrics = newMetrics() const ctx = new MeasureMetricsContext('root', {}, {}, metrics, noParamsLogger) - + const result = await instance.testMethod(ctx, 21) - + expect(result).toBe(42) expect(metrics.measurements.testOperation).toBeDefined() }) @@ -308,9 +318,9 @@ describe('context', () => { setOperationLogProfiling(true) const metrics = newMetrics() const ctx = new MeasureMetricsContext('test', {}, {}, metrics, noParamsLogger) - + const { opLogMetrics, op } = registerOperationLog(ctx) - + expect(opLogMetrics).toBe(metrics) expect(op).toBeDefined() expect(ctx.id).toBeDefined() @@ -320,9 +330,9 @@ describe('context', () => { setOperationLogProfiling(false) const metrics = newMetrics() const ctx = new MeasureMetricsContext('test', {}, {}, metrics, noParamsLogger) - + const { opLogMetrics, op } = registerOperationLog(ctx) - + expect(opLogMetrics).toBeUndefined() expect(op).toBeUndefined() }) @@ -331,10 +341,10 @@ describe('context', () => { setOperationLogProfiling(true) const metrics = newMetrics() const ctx = new MeasureMetricsContext('test', {}, {}, metrics, noParamsLogger) - + const { opLogMetrics, op } = registerOperationLog(ctx) updateOperationLog(opLogMetrics, op) - + expect(op?.end).toBeGreaterThan(0) }) @@ -342,14 +352,14 @@ describe('context', () => { setOperationLogProfiling(true) const metrics = newMetrics() const ctx = new MeasureMetricsContext('test', {}, {}, metrics, noParamsLogger) - + registerOperationLog(ctx) - + let executed = false await addOperation(ctx, 'asyncOp', { op: 'test' }, async () => { executed = true }) - + expect(executed).toBe(true) expect(metrics.opLog).toBeDefined() }) @@ -358,11 +368,11 @@ describe('context', () => { setOperationLogProfiling(true) const metrics = newMetrics() const ctx = new MeasureMetricsContext('test', {}, {}, metrics, noParamsLogger) - + registerOperationLog(ctx) - + // Create many operation log entries - if (metrics.opLog && ctx.id) { + if (metrics.opLog != null && ctx.id != null) { for (let i = 0; i < 50; i++) { metrics.opLog[ctx.id].ops.push({ op: `test${i}`, @@ -371,10 +381,10 @@ describe('context', () => { params: {} }) } - + const op = metrics.opLog[ctx.id] updateOperationLog(metrics, op) - + expect(Object.keys(metrics.opLog).length).toBeLessThanOrEqual(31) } }) @@ -384,7 +394,7 @@ describe('context', () => { it('should return empty metadata', () => { const ctx = new MeasureMetricsContext('test', {}, {}, newMetrics(), noParamsLogger) const meta = ctx.extractMeta() - + expect(meta).toEqual({}) }) }) @@ -393,35 +403,35 @@ describe('context', () => { it('should handle promise rejection', async () => { const metrics = newMetrics() const ctx = new MeasureMetricsContext('test', {}, {}, metrics, noParamsLogger) - + await expect( ctx.with('operation', { op: 'test' }, async () => { throw new Error('Test error') }) ).rejects.toThrow('Test error') - + expect(metrics.measurements.operation).toBeDefined() }) it('should return null promise for null sync result', async () => { const metrics = newMetrics() const ctx = new MeasureMetricsContext('test', {}, {}, metrics, noParamsLogger) - + const result = await ctx.with('operation', { op: 'test' }, () => { return null }) - + expect(result).toBeUndefined() }) it('should handle sync return value', async () => { const metrics = newMetrics() const ctx = new MeasureMetricsContext('test', {}, {}, metrics, noParamsLogger) - + const result = await ctx.with('operation', { op: 'test' }, () => { return 42 }) - + expect(result).toBe(42) }) @@ -433,14 +443,20 @@ describe('context', () => { close: jest.fn(async () => {}), logOperation: jest.fn() } - + const metrics = newMetrics() const ctx = new MeasureMetricsContext('test', {}, {}, metrics, mockLogger) - - await ctx.with('operation', { op: 'test' }, async () => { - await new Promise(resolve => setTimeout(resolve, 10)) - }, {}, { log: true }) - + + await ctx.with( + 'operation', + { op: 'test' }, + async () => { + await new Promise((resolve) => setTimeout(resolve, 10)) + }, + {}, + { log: true } + ) + expect(mockLogger.logOperation).toHaveBeenCalledWith( 'operation', expect.any(Number), diff --git a/packages/measurements/src/__tests__/index.test.ts b/packages/measurements/src/__tests__/index.test.ts index 1bd75aff15..d701edd4e2 100644 --- a/packages/measurements/src/__tests__/index.test.ts +++ b/packages/measurements/src/__tests__/index.test.ts @@ -10,7 +10,7 @@ describe('index', () => { it('should return increasing values over time', async () => { const first = platformNow() - await new Promise(resolve => setTimeout(resolve, 10)) + await new Promise((resolve) => setTimeout(resolve, 10)) const second = platformNow() expect(second).toBeGreaterThan(first) }) @@ -19,27 +19,27 @@ describe('index', () => { describe('platformNowDiff', () => { it('should calculate the difference between timestamps', async () => { const start = platformNow() - await new Promise(resolve => setTimeout(resolve, 50)) + await new Promise((resolve) => setTimeout(resolve, 50)) const diff = platformNowDiff(start) - + expect(diff).toBeGreaterThan(40) expect(diff).toBeLessThan(100) }) it('should round to 2 decimal places', async () => { const start = platformNow() - await new Promise(resolve => setTimeout(resolve, 10)) + await new Promise((resolve) => setTimeout(resolve, 10)) const diff = platformNowDiff(start) - + // Check that it has at most 2 decimal places - const decimalPlaces = (diff.toString().split('.')[1] || '').length + const decimalPlaces = (diff.toString().split('.')[1] ?? '').length expect(decimalPlaces).toBeLessThanOrEqual(2) }) it('should handle very small differences', () => { const start = platformNow() const diff = platformNowDiff(start) - + expect(diff).toBeGreaterThanOrEqual(0) expect(typeof diff).toBe('number') }) diff --git a/packages/measurements/src/__tests__/metrics.test.ts b/packages/measurements/src/__tests__/metrics.test.ts index 108a614e44..e10136fa72 100644 --- a/packages/measurements/src/__tests__/metrics.test.ts +++ b/packages/measurements/src/__tests__/metrics.test.ts @@ -14,7 +14,7 @@ describe('metrics', () => { describe('newMetrics', () => { it('should create a new metrics object with default values', () => { const metrics = newMetrics() - + expect(metrics.operations).toBe(0) expect(metrics.value).toBe(0) expect(metrics.measurements).toEqual({}) @@ -27,10 +27,10 @@ describe('metrics', () => { it('should measure operation duration', async () => { const metrics = newMetrics() const done = measure(metrics, { operation: 'test' }) - - await new Promise(resolve => setTimeout(resolve, 50)) + + await new Promise((resolve) => setTimeout(resolve, 50)) done() - + expect(metrics.operations).toBe(1) expect(metrics.value).toBeGreaterThan(40) }) @@ -41,24 +41,24 @@ describe('metrics', () => { const done = measure(metrics, { operation: 'test' }, {}, (spend) => { capturedSpend = spend }) - - await new Promise(resolve => setTimeout(resolve, 50)) + + await new Promise((resolve) => setTimeout(resolve, 50)) done() - + expect(capturedSpend).toBeGreaterThan(40) }) it('should handle multiple operations', async () => { const metrics = newMetrics() - + const done1 = measure(metrics, { operation: 'test' }) - await new Promise(resolve => setTimeout(resolve, 20)) + await new Promise((resolve) => setTimeout(resolve, 20)) done1() - + const done2 = measure(metrics, { operation: 'test' }) - await new Promise(resolve => setTimeout(resolve, 20)) + await new Promise((resolve) => setTimeout(resolve, 20)) done2() - + expect(metrics.operations).toBe(2) expect(metrics.value).toBeGreaterThan(30) }) @@ -68,9 +68,9 @@ describe('metrics', () => { it('should update metrics with custom value', () => { const metrics = newMetrics() const st = platformNow() - + updateMeasure(metrics, st, { op: 'test' }, {}, undefined, 100) - + expect(metrics.operations).toBe(1) expect(metrics.value).toBe(100) }) @@ -78,15 +78,15 @@ describe('metrics', () => { it('should override operations when override is true', () => { const metrics = newMetrics() const st = platformNow() - + // First call without override - accumulates value and increments operations updateMeasure(metrics, st, { op: 'test' }, {}, undefined, 50, false) expect(metrics.value).toBe(50) expect(metrics.operations).toBe(1) - + // Second call with override - sets operations, doesn't add to value updateMeasure(metrics, st, { op: 'test' }, {}, undefined, 100, true) - + expect(metrics.operations).toBe(100) // overridden expect(metrics.value).toBe(50) // not changed when override=true }) @@ -94,10 +94,10 @@ describe('metrics', () => { it('should track parameters', () => { const metrics = newMetrics() const st = platformNow() - + updateMeasure(metrics, st, { method: 'GET' }, {}, undefined, 100) updateMeasure(metrics, st, { method: 'POST' }, {}, undefined, 200) - + expect(metrics.params.method).toBeDefined() expect(metrics.params.method.GET).toBeDefined() expect(metrics.params.method.POST).toBeDefined() @@ -108,10 +108,10 @@ describe('metrics', () => { it('should handle multiple parameters as counters', () => { const metrics = newMetrics() const st = platformNow() - + updateMeasure(metrics, st, { method: 'GET', status: '200' }, {}, undefined, 100) updateMeasure(metrics, st, { method: 'GET', status: '404' }, {}, undefined, 50) - + expect(metrics.params.method.GET).toBeDefined() expect(metrics.params.method.GET.topResult).toBeDefined() expect(metrics.params.method.GET.topResult?.length).toBeGreaterThan(0) @@ -120,10 +120,10 @@ describe('metrics', () => { it('should update top results', () => { const metrics = newMetrics() const st = platformNow() - + updateMeasure(metrics, st, {}, { request: 'slow' }, undefined, 100) updateMeasure(metrics, st, {}, { request: 'fast' }, undefined, 10) - + expect(metrics.topResult).toBeDefined() expect(metrics.topResult?.length).toBeGreaterThan(0) }) @@ -133,7 +133,7 @@ describe('metrics', () => { it('should create child metrics in hierarchy', () => { const root = newMetrics() const child = childMetrics(root, ['level1', 'level2']) - + expect(root.measurements.level1).toBeDefined() expect(root.measurements.level1.measurements.level2).toBeDefined() expect(child).toBe(root.measurements.level1.measurements.level2) @@ -143,14 +143,14 @@ describe('metrics', () => { const root = newMetrics() const child1 = childMetrics(root, ['level1']) const child2 = childMetrics(root, ['level1']) - + expect(child1).toBe(child2) }) it('should create nested paths', () => { const root = newMetrics() childMetrics(root, ['api', 'users', 'create']) - + expect(root.measurements.api).toBeDefined() expect(root.measurements.api.measurements.users).toBeDefined() expect(root.measurements.api.measurements.users.measurements.create).toBeDefined() @@ -162,45 +162,45 @@ describe('metrics', () => { const metrics = newMetrics() metrics.value = 100 metrics.operations = 10 - + const child1 = childMetrics(metrics, ['child1']) child1.value = 50 child1.operations = 5 - + const child2 = childMetrics(metrics, ['child2']) child2.value = 30 child2.operations = 3 - + const aggregated = metricsAggregate(metrics) - + expect(aggregated.value).toBe(80) // child1 + child2 expect(aggregated.operations).toBe(10) }) it('should limit number of child metrics', () => { const metrics = newMetrics() - + for (let i = 0; i < 10; i++) { const child = childMetrics(metrics, [`child${i}`]) child.value = i * 10 } - + const aggregated = metricsAggregate(metrics, 3) - + expect(Object.keys(aggregated.measurements).length).toBe(3) }) it('should filter out metrics starting with #', () => { const metrics = newMetrics() - + const child1 = childMetrics(metrics, ['normal']) child1.value = 50 - + const child2 = childMetrics(metrics, ['#internal']) child2.value = 30 - + const aggregated = metricsAggregate(metrics) - + expect(aggregated.value).toBe(50) // only 'normal' counted }) }) @@ -210,9 +210,9 @@ describe('metrics', () => { const metrics = newMetrics() metrics.value = 100 metrics.operations = 10 - + const str = metricsToString(metrics, 'TestMetrics', 50) - + expect(str).toContain('TestMetrics') expect(str).toContain('100') expect(str).toContain('10') @@ -223,9 +223,9 @@ describe('metrics', () => { const child = childMetrics(metrics, ['operation']) child.value = 50 child.operations = 5 - + const str = metricsToString(metrics, 'TestMetrics', 50) - + expect(str).toContain('operation') }) }) @@ -235,9 +235,9 @@ describe('metrics', () => { const metrics = newMetrics() metrics.value = 100 metrics.operations = 10 - + const json = metricsToJson(metrics) - + // aggregated value is the total value when no children expect(json.$total).toBe(100) expect(json.$ops).toBe(10) @@ -248,12 +248,12 @@ describe('metrics', () => { const child = childMetrics(metrics, ['operation']) child.value = 50 child.operations = 5 - + const json = metricsToJson(metrics) - + expect(json).toBeDefined() const keys = Object.keys(json) - expect(keys.some(k => k.includes('operation'))).toBe(true) + expect(keys.some((k) => k.includes('operation'))).toBe(true) }) }) @@ -262,9 +262,9 @@ describe('metrics', () => { const metrics = newMetrics() metrics.value = 100 metrics.operations = 10 - + const rows = metricsToRows(metrics, 'TestMetrics') - + expect(Array.isArray(rows)).toBe(true) expect(rows.length).toBeGreaterThan(0) expect(rows[0]).toContain('TestMetrics') @@ -275,20 +275,20 @@ describe('metrics', () => { const child = childMetrics(metrics, ['operation']) child.value = 50 child.operations = 5 - + const rows = metricsToRows(metrics, 'TestMetrics') - + expect(rows.length).toBeGreaterThan(1) - expect(rows.some(row => row.includes('operation'))).toBe(true) + expect(rows.some((row) => row.includes('operation'))).toBe(true) }) it('should properly format row values', () => { const metrics = newMetrics() metrics.value = 100 metrics.operations = 10 - + const rows = metricsToRows(metrics, 'TestMetrics') - + expect(rows[0]).toHaveLength(5) // offset, name, avg, total, ops expect(typeof rows[0][0]).toBe('number') // offset expect(typeof rows[0][1]).toBe('string') // name diff --git a/packages/measurements/src/__tests__/performance.test.ts b/packages/measurements/src/__tests__/performance.test.ts index 315690fd9e..14f0ff3e35 100644 --- a/packages/measurements/src/__tests__/performance.test.ts +++ b/packages/measurements/src/__tests__/performance.test.ts @@ -1,6 +1,5 @@ -import { MeasureMetricsContext, NoMetricsContext } from '../context' +import { MeasureMetricsContext, NoMetricsContext, noParamsLogger } from '../context' import { newMetrics, metricsAggregate } from '../metrics' -import { noParamsLogger } from '../context' import type { MeasureContext } from '../types' describe('performance', () => { @@ -20,7 +19,7 @@ describe('performance', () => { // With measurement context const metrics = newMetrics() const ctx = new MeasureMetricsContext('root', {}, {}, metrics, noParamsLogger) - + const measuredStart = performance.now() for (let i = 0; i < iterations; i++) { await ctx.with('operation', { iteration: i }, async () => { @@ -40,7 +39,7 @@ describe('performance', () => { expect(metrics.measurements.operation).toBeDefined() expect(metrics.measurements.operation.operations).toBe(iterations) - + // Overhead should be reasonable (typically < 50% for simple operations) // This is informational rather than a strict assertion expect(overheadPercentage).toBeLessThan(200) @@ -95,12 +94,13 @@ describe('performance', () => { // Complex params with multiple tracked values const complexStart = performance.now() for (let i = 0; i < iterations; i++) { - await ctx.with('complex', - { + await ctx.with( + 'complex', + { method: i % 3 === 0 ? 'GET' : i % 3 === 1 ? 'POST' : 'PUT', status: i % 2 === 0 ? 200 : 404, cached: i % 4 === 0 - }, + }, async () => { await simulateWork(1) }, @@ -165,7 +165,7 @@ describe('performance', () => { const requests = 50 const baselineStart = performance.now() - + // Simulate without metrics for (let i = 0; i < requests; i++) { await simulateAPIRequest(null, i) @@ -174,7 +174,7 @@ describe('performance', () => { // Reset for measured run const measuredStart = performance.now() - + // Simulate with metrics for (let i = 0; i < requests; i++) { await simulateAPIRequest(ctx, i) @@ -189,10 +189,10 @@ describe('performance', () => { console.log(` With metrics: ${measuredTime.toFixed(2)}ms`) console.log(` Overhead: ${overhead.toFixed(2)}ms (${overheadPercentage.toFixed(2)}%)`) console.log(` Per request: ${(overhead / requests).toFixed(4)}ms`) - + // Check metrics structure const aggregated = metricsAggregate(metrics, 10) - console.log(` Collected operations: ${aggregated.measurements.request?.operations || 0}`) + console.log(` Collected operations: ${aggregated.measurements.request?.operations ?? 0}`) expect(aggregated.measurements.request).toBeDefined() expect(overheadPercentage).toBeLessThan(100) // Should be less than 100% overhead @@ -202,15 +202,16 @@ describe('performance', () => { // Helper functions -async function simulateWork(durationMs: number): Promise { +async function simulateWork (durationMs: number): Promise { const end = performance.now() + durationMs while (performance.now() < end) { // Busy wait to simulate work - Math.random() * Math.random() + const r = Math.random() * Math.random() + expect(r).toBeGreaterThanOrEqual(0) } } -async function deepNestedExecution( +async function deepNestedExecution ( ctx: MeasureContext, depth: number, workMs: number, @@ -226,10 +227,10 @@ async function deepNestedExecution( }) } -async function simulateAPIRequest(ctx: MeasureContext | null, requestId: number): Promise { +async function simulateAPIRequest (ctx: MeasureContext | null, requestId: number): Promise { const method = ['GET', 'POST', 'PUT'][requestId % 3] const endpoint = `/api/resource/${requestId % 10}` - + if (ctx === null) { // No metrics version await simulateWork(1) @@ -256,4 +257,4 @@ async function simulateAPIRequest(ctx: MeasureContext | null, requestId: number) await simulateWork(1) }) }) -} \ No newline at end of file +} diff --git a/packages/measurements/src/index.ts b/packages/measurements/src/index.ts index d736098c8a..16e4d95df6 100644 --- a/packages/measurements/src/index.ts +++ b/packages/measurements/src/index.ts @@ -1,6 +1,6 @@ export * from './context' export * from './metrics' -export * from './types' +export type * from './types' /** * Return a current performance timestamp diff --git a/packages/platform-rig/CHANGELOG.json b/packages/platform-rig/CHANGELOG.json index 08e76f1a6e..0384274795 100644 --- a/packages/platform-rig/CHANGELOG.json +++ b/packages/platform-rig/CHANGELOG.json @@ -1,6 +1,18 @@ { "name": "@hcengineering/platform-rig", "entries": [ + { + "version": "0.7.13", + "tag": "@hcengineering/platform-rig_v0.7.13", + "date": "Sat, 11 Oct 2025 17:58:53 GMT", + "comments": { + "patch": [ + { + "comment": "Script to sync eslint deps" + } + ] + } + }, { "version": "0.7.12", "tag": "@hcengineering/platform-rig_v0.7.12", diff --git a/packages/platform-rig/CHANGELOG.md b/packages/platform-rig/CHANGELOG.md index 873c611dd9..f53aa2f328 100644 --- a/packages/platform-rig/CHANGELOG.md +++ b/packages/platform-rig/CHANGELOG.md @@ -1,6 +1,13 @@ # Change Log - @hcengineering/platform-rig -This log was last generated on Fri, 10 Oct 2025 14:20:06 GMT and should not be manually modified. +This log was last generated on Sat, 11 Oct 2025 17:58:53 GMT and should not be manually modified. + +## 0.7.13 +Sat, 11 Oct 2025 17:58:53 GMT + +### Patches + +- Script to sync eslint deps ## 0.7.12 Fri, 10 Oct 2025 14:20:06 GMT diff --git a/packages/platform-rig/bin/sync-eslint-deps.js b/packages/platform-rig/bin/sync-eslint-deps.js new file mode 100755 index 0000000000..e76f47cd59 --- /dev/null +++ b/packages/platform-rig/bin/sync-eslint-deps.js @@ -0,0 +1,187 @@ +#!/usr/bin/env node +// +// Copyright Ā© 2025 Hardcore Engineering Inc. +// +// Script to sync ESLint dev dependencies from platform-rig to all Rush packages +// + +const fs = require('fs') +const path = require('path') +const { execSync } = require('child_process') + +// ESLint related dependency prefixes to sync +const ESLINT_PATTERNS = ['eslint', '@typescript-eslint/', 'eslint-plugin-', 'eslint-config-'] + +/** + * Get list of Rush projects using 'rush list --json' + */ +function getRushProjects() { + try { + const output = execSync('rush list --json', { + encoding: 'utf-8', + stdio: ['pipe', 'pipe', 'pipe'] + }) + + const data = JSON.parse(output) + const projects = data.projects || data + + if (!Array.isArray(projects)) { + throw new Error('Expected rush list --json to return an array of projects') + } + + return projects + } catch (err) { + if (err.message.includes('rush') || err.code === 'ENOENT') { + throw new Error('Failed to run "rush list --json". Make sure you are in a Rush workspace and Rush is installed.') + } + throw new Error(`Failed to get Rush projects: ${err.message}`) + } +} + +/** + * Check if a dependency name matches ESLint patterns + */ +function isEslintDependency(depName) { + return ESLINT_PATTERNS.some((pattern) => depName.startsWith(pattern)) +} + +/** + * Get ESLint dev dependencies from platform-rig package.json + */ +function getEslintDepsFromPlatformRig(platformRigPath) { + const packageJsonPath = path.join(platformRigPath, 'package.json') + + if (!fs.existsSync(packageJsonPath)) { + throw new Error(`platform-rig package.json not found at: ${packageJsonPath}`) + } + + const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8')) + const dependencies = packageJson.dependencies || {} + + const eslintDeps = {} + for (const [name, version] of Object.entries(dependencies)) { + if (isEslintDependency(name)) { + eslintDeps[name] = version + } + } + + return eslintDeps +} + +/** + * Update package.json with ESLint dependencies + */ +function updatePackageJson(packagePath, eslintDeps) { + const packageJsonPath = path.join(packagePath, 'package.json') + + if (!fs.existsSync(packageJsonPath)) { + console.warn(`āš ļø package.json not found at: ${packageJsonPath}`) + return { updated: false, changes: [] } + } + + const content = fs.readFileSync(packageJsonPath, 'utf-8') + const packageJson = JSON.parse(content) + + // Skip if this is the platform-rig package itself + if (packageJson.name === '@hcengineering/platform-rig') { + return { updated: false, changes: [] } + } + + // Initialize devDependencies if it doesn't exist + if (!packageJson.devDependencies) { + packageJson.devDependencies = {} + } + + const changes = [] + let hasChanges = false + + // Add or update ESLint dependencies + for (const [name, version] of Object.entries(eslintDeps)) { + const currentVersion = packageJson.devDependencies[name] + + if (currentVersion !== version) { + packageJson.devDependencies[name] = version + hasChanges = true + + if (currentVersion) { + changes.push(` ${name}: ${currentVersion} → ${version}`) + } else { + changes.push(` ${name}: (new) → ${version}`) + } + } + } + + if (hasChanges) { + // Preserve original formatting by maintaining indent detection + const indent = content.match(/^(\s+)/m)?.[1]?.length || 2 + const newContent = JSON.stringify(packageJson, null, indent) + '\n' + fs.writeFileSync(packageJsonPath, newContent, 'utf-8') + } + + return { updated: hasChanges, changes } +} + +/** + * Main execution + */ +function main() { + console.log('šŸ” Syncing ESLint dependencies from platform-rig to all packages...\n') + + try { + // Get all Rush projects + const projects = getRushProjects() + console.log(`Found ${projects.length} projects in Rush workspace\n`) + + // Find platform-rig project + const platformRigProject = projects.find((p) => p.name === '@hcengineering/platform-rig') + if (!platformRigProject) { + throw new Error('platform-rig package not found in Rush workspace') + } + + // Get ESLint dependencies from platform-rig + const eslintDeps = getEslintDepsFromPlatformRig(platformRigProject.fullPath) + + if (Object.keys(eslintDeps).length === 0) { + console.log('āš ļø No ESLint dependencies found in platform-rig') + return + } + + console.log('šŸ“¦ ESLint dependencies from platform-rig:') + for (const [name, version] of Object.entries(eslintDeps)) { + console.log(` ${name}: ${version}`) + } + console.log() + + // Update all packages + let updatedCount = 0 + let skippedCount = 0 + + for (const project of projects) { + const result = updatePackageJson(project.fullPath, eslintDeps) + + if (result.updated) { + updatedCount++ + console.log(`āœ… Updated ${project.name}`) + result.changes.forEach((change) => console.log(change)) + console.log() + } else if (result.changes.length === 0 && project.name !== '@hcengineering/platform-rig') { + skippedCount++ + } + } + + console.log('━'.repeat(50)) + console.log(`✨ Sync complete!`) + console.log(` Updated: ${updatedCount} package(s)`) + console.log(` Skipped: ${skippedCount} package(s) (already up-to-date)`) + + if (updatedCount > 0) { + console.log('\nšŸ’” Don\'t forget to run "rush update" to install the updated dependencies') + } + } catch (error) { + console.error(`\nāŒ Error: ${error.message}`) + process.exit(1) + } +} + +// Run the script +main() diff --git a/packages/platform-rig/package.json b/packages/platform-rig/package.json index 8b94219f19..84a0f54026 100644 --- a/packages/platform-rig/package.json +++ b/packages/platform-rig/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/platform-rig", - "version": "0.7.12", + "version": "0.7.13", "scripts": { "build": "echo 'Not required'", "format": "echo 'Not required'" @@ -13,12 +13,12 @@ "typescript": "^5.9.3", "esbuild": "^0.25.10", "esbuild-plugin-copy": "^2.1.1", - "@typescript-eslint/eslint-plugin": "^6.11.0", + "@typescript-eslint/eslint-plugin": "^8.46.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-promise": "^6.1.1", "eslint-plugin-n": "^15.4.0", "eslint": "^8.54.0", - "@typescript-eslint/parser": "^6.11.0", + "@typescript-eslint/parser": "^8.46.0", "eslint-config-standard-with-typescript": "^40.0.0", "prettier": "^3.6.2", "prettier-plugin-svelte": "^3.4.0", @@ -30,8 +30,14 @@ "do-svelte-check": "./bin/do-svelte-check.js", "bump-package-version": "./bin/bump-package-version.js", "bump-changes-from-tag": "./bin/bump-changes-from-tag.js", - "update-deps": "./bin/update-deps.js" + "update-deps": "./bin/update-deps.js", + "sync-eslint-deps": "./bin/sync-eslint-deps.js" }, + "files": [ + "bin/**/*", + "profiles/**/*", + "package.json" + ], "publishConfig": { "access": "public" } diff --git a/packages/postgres-base/CHANGELOG.json b/packages/postgres-base/CHANGELOG.json index ff2eeec02d..9aad29ddde 100644 --- a/packages/postgres-base/CHANGELOG.json +++ b/packages/postgres-base/CHANGELOG.json @@ -1,6 +1,23 @@ { "name": "@hcengineering/postgres-base", "entries": [ + { + "version": "0.7.11", + "tag": "@hcengineering/postgres-base_v0.7.11", + "date": "Sat, 11 Oct 2025 17:58:53 GMT", + "comments": { + "patch": [ + { + "comment": "Fix eslint deps" + } + ], + "dependency": [ + { + "comment": "Updating dependency \"@hcengineering/platform-rig\" from `^0.7.12` to `0.7.13`" + } + ] + } + }, { "version": "0.7.10", "tag": "@hcengineering/postgres-base_v0.7.10", diff --git a/packages/postgres-base/CHANGELOG.md b/packages/postgres-base/CHANGELOG.md index dd559eb1e2..cb87f67b9f 100644 --- a/packages/postgres-base/CHANGELOG.md +++ b/packages/postgres-base/CHANGELOG.md @@ -1,6 +1,13 @@ # Change Log - @hcengineering/postgres-base -This log was last generated on Fri, 10 Oct 2025 12:32:59 GMT and should not be manually modified. +This log was last generated on Sat, 11 Oct 2025 17:58:53 GMT and should not be manually modified. + +## 0.7.11 +Sat, 11 Oct 2025 17:58:53 GMT + +### Patches + +- Fix eslint deps ## 0.7.10 Fri, 10 Oct 2025 12:32:59 GMT diff --git a/packages/postgres-base/package.json b/packages/postgres-base/package.json index 331682a242..c778b01999 100644 --- a/packages/postgres-base/package.json +++ b/packages/postgres-base/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/postgres-base", - "version": "0.7.10", + "version": "0.7.11", "main": "lib/index.js", "svelte": "src/index.ts", "types": "types/index.d.ts", @@ -28,11 +28,19 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.12", + "@hcengineering/platform-rig": "workspace:^0.7.13", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5", - "@types/node": "^22.15.29" + "@types/node": "^22.15.29", + "@typescript-eslint/eslint-plugin": "^8.46.0", + "@typescript-eslint/parser": "^8.46.0", + "eslint": "^8.54.0", + "eslint-config-standard-with-typescript": "^40.0.0", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-n": "^15.4.0" }, "dependencies": { "postgres": "^3.4.7" From b01693e5b453d7a4f1842584a9680d3c7c5f33fc Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Sun, 12 Oct 2025 01:00:49 +0700 Subject: [PATCH 25/40] Fix deps --- common/config/rush/pnpm-lock.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 480300df36..38198f76e4 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -13,7 +13,7 @@ importers: ../../packages/measurements: devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.12 + specifier: workspace:^0.7.13 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 @@ -52,7 +52,7 @@ importers: ../../packages/measurements-otlp: dependencies: '@hcengineering/measurements': - specifier: workspace:^0.7.10 + specifier: workspace:^0.7.11 version: link:../measurements '@opentelemetry/api': specifier: ^1.9.0 @@ -98,7 +98,7 @@ importers: version: 2.1.0(@opentelemetry/api@1.9.0) devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.12 + specifier: workspace:^0.7.13 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 @@ -183,7 +183,7 @@ importers: version: 3.4.7 devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.12 + specifier: workspace:^0.7.13 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 @@ -225,7 +225,7 @@ importers: ../scripts: devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.12 + specifier: workspace:^0.7.13 version: link:../../packages/platform-rig '@typescript-eslint/eslint-plugin': specifier: ^8.46.0 From 5b2572bf6c43f7565276f5f631a9cd63a95302a4 Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Sun, 12 Oct 2025 01:02:40 +0700 Subject: [PATCH 26/40] Fix tests --- packages/measurements/src/__tests__/context.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/measurements/src/__tests__/context.test.ts b/packages/measurements/src/__tests__/context.test.ts index ef9a65a662..d59d0a4945 100644 --- a/packages/measurements/src/__tests__/context.test.ts +++ b/packages/measurements/src/__tests__/context.test.ts @@ -214,19 +214,19 @@ describe('context', () => { it('should handle named parameters', () => { const metrics = newMetrics() const r = new MeasureMetricsContext('test', { method: 'GET' }, {}, metrics, logger) - expect(r).toBeNull() + expect(r).toBeDefined() expect(metrics.namedParams.method).toBe('GET') }) it('should update named parameters on multiple contexts', () => { const metrics = newMetrics() const ctx1 = new MeasureMetricsContext('test1', { method: 'GET' }, {}, metrics, logger) - expect(ctx1).toBeNull() + expect(ctx1).toBeDefined() expect(metrics.namedParams.method).toBe('GET') // Create another context with different value for same param const ctx2 = new MeasureMetricsContext('test2', { method: 'POST' }, {}, metrics, logger) - expect(ctx2).toBeNull() + expect(ctx2).toBeDefined() // The second context will see existing value is different, so it will update to '*' // But this happens within the constructor logic From 70dfd5ccaf8ba303688adb1c4101eb5876076a82 Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Sun, 12 Oct 2025 01:09:59 +0700 Subject: [PATCH 27/40] Fix platform-rig detection --- common/config/rush/pnpm-lock.yaml | 135 ++++++++++-------- common/scripts/package.json | 4 +- packages/measurements-otlp/package.json | 4 +- packages/measurements/package.json | 4 +- packages/platform-rig/CHANGELOG.json | 12 ++ packages/platform-rig/CHANGELOG.md | 9 +- packages/platform-rig/bin/sync-eslint-deps.js | 40 ++++-- packages/platform-rig/package.json | 4 +- packages/postgres-base/package.json | 4 +- 9 files changed, 136 insertions(+), 80 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 38198f76e4..4181b76f6e 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -13,14 +13,14 @@ importers: ../../packages/measurements: devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.13 + specifier: workspace:^0.7.14 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 version: 29.5.14 '@typescript-eslint/eslint-plugin': - specifier: ^8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + specifier: ^6.11.0 + version: 6.21.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: ^8.46.0 version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) @@ -29,7 +29,7 @@ importers: version: 8.57.1 eslint-config-standard-with-typescript: specifier: ^40.0.0 - version: 40.0.0(@typescript-eslint/eslint-plugin@8.46.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.3) + version: 40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.3) eslint-plugin-import: specifier: ^2.26.0 version: 2.32.0(eslint@8.57.1) @@ -98,14 +98,14 @@ importers: version: 2.1.0(@opentelemetry/api@1.9.0) devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.13 + specifier: workspace:^0.7.14 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 version: 29.5.14 '@typescript-eslint/eslint-plugin': - specifier: ^8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + specifier: ^6.11.0 + version: 6.21.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: ^8.46.0 version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) @@ -114,7 +114,7 @@ importers: version: 8.57.1 eslint-config-standard-with-typescript: specifier: ^40.0.0 - version: 40.0.0(@typescript-eslint/eslint-plugin@8.46.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.3) + version: 40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.3) eslint-plugin-import: specifier: ^2.26.0 version: 2.32.0(eslint@8.57.1) @@ -137,8 +137,8 @@ importers: ../../packages/platform-rig: dependencies: '@typescript-eslint/eslint-plugin': - specifier: ^8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + specifier: ^6.11.0 + version: 6.21.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: ^8.46.0 version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) @@ -153,7 +153,7 @@ importers: version: 8.57.1 eslint-config-standard-with-typescript: specifier: ^40.0.0 - version: 40.0.0(@typescript-eslint/eslint-plugin@8.46.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.3) + version: 40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.3) eslint-plugin-import: specifier: ^2.26.0 version: 2.32.0(eslint@8.57.1) @@ -183,7 +183,7 @@ importers: version: 3.4.7 devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.13 + specifier: workspace:^0.7.14 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 @@ -192,8 +192,8 @@ importers: specifier: ^22.15.29 version: 22.18.1 '@typescript-eslint/eslint-plugin': - specifier: ^8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + specifier: ^6.11.0 + version: 6.21.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: ^8.46.0 version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) @@ -202,7 +202,7 @@ importers: version: 8.57.1 eslint-config-standard-with-typescript: specifier: ^40.0.0 - version: 40.0.0(@typescript-eslint/eslint-plugin@8.46.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.3) + version: 40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.3) eslint-plugin-import: specifier: ^2.26.0 version: 2.32.0(eslint@8.57.1) @@ -225,11 +225,11 @@ importers: ../scripts: devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.13 + specifier: workspace:^0.7.14 version: link:../../packages/platform-rig '@typescript-eslint/eslint-plugin': - specifier: ^8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + specifier: ^6.11.0 + version: 6.21.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: ^8.46.0 version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) @@ -238,7 +238,7 @@ importers: version: 8.57.1 eslint-config-standard-with-typescript: specifier: ^40.0.0 - version: 40.0.0(@typescript-eslint/eslint-plugin@8.46.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.3) + version: 40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.3) eslint-plugin-import: specifier: ^2.26.0 version: 2.32.0(eslint@8.57.1) @@ -1293,6 +1293,9 @@ packages: '@types/jest@29.5.14': resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==} + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} @@ -1314,6 +1317,9 @@ packages: '@types/pg@8.15.5': resolution: {integrity: sha512-LF7lF6zWEKxuT3/OR8wAZGzkg4ENGXFNyiV/JeOt9z5B+0ZVwbql9McqX5c/WStFq1GaGso7H1AzP/qSzmlCKQ==} + '@types/semver@7.7.1': + resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} + '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} @@ -1326,13 +1332,16 @@ packages: '@types/yargs@17.0.33': resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} - '@typescript-eslint/eslint-plugin@8.46.0': - resolution: {integrity: sha512-hA8gxBq4ukonVXPy0OKhiaUh/68D0E88GSmtC1iAEnGaieuDi38LhS7jdCHRLi6ErJBNDGCzvh5EnzdPwUc0DA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/eslint-plugin@6.21.0': + resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - '@typescript-eslint/parser': ^8.46.0 - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true '@typescript-eslint/parser@6.21.0': resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} @@ -1371,12 +1380,15 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.46.0': - resolution: {integrity: sha512-hy+lvYV1lZpVs2jRaEYvgCblZxUoJiPyCemwbQZ+NGulWkQRy0HRPYAoef/CNSzaLt+MLvMptZsHXHlkEilaeg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/type-utils@6.21.0': + resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true '@typescript-eslint/types@6.21.0': resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} @@ -1401,12 +1413,11 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.46.0': - resolution: {integrity: sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/utils@6.21.0': + resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' + eslint: ^7.0.0 || ^8.0.0 '@typescript-eslint/visitor-keys@6.21.0': resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} @@ -2137,10 +2148,6 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - ignore@7.0.5: - resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} - engines: {node: '>= 4'} - import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} @@ -4531,6 +4538,8 @@ snapshots: expect: 29.7.0 pretty-format: 29.7.0 + '@types/json-schema@7.0.15': {} + '@types/json5@0.0.29': {} '@types/memcached@2.2.10': @@ -4559,6 +4568,8 @@ snapshots: pg-protocol: 1.10.3 pg-types: 2.2.0 + '@types/semver@7.7.1': {} + '@types/stack-utils@2.0.3': {} '@types/tedious@4.0.14': @@ -4571,19 +4582,22 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.46.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.1 '@typescript-eslint/parser': 8.46.0(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.46.0 - '@typescript-eslint/type-utils': 8.46.0(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.0(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.46.0 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.4.1 eslint: 8.57.1 graphemer: 1.4.0 - ignore: 7.0.5 + ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.9.3) + semver: 7.7.2 + ts-api-utils: 1.4.3(typescript@5.9.3) + optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -4636,14 +4650,14 @@ snapshots: dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.46.0(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/type-utils@6.21.0(eslint@8.57.1)(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.46.0 - '@typescript-eslint/typescript-estree': 8.46.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.3) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.9.3) debug: 4.4.1 eslint: 8.57.1 - ts-api-utils: 2.1.0(typescript@5.9.3) + ts-api-utils: 1.4.3(typescript@5.9.3) + optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -4683,16 +4697,19 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.46.0(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) - '@typescript-eslint/scope-manager': 8.46.0 - '@typescript-eslint/types': 8.46.0 - '@typescript-eslint/typescript-estree': 8.46.0(typescript@5.9.3) + '@types/json-schema': 7.0.15 + '@types/semver': 7.7.1 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.3) eslint: 8.57.1 - typescript: 5.9.3 + semver: 7.7.2 transitivePeerDependencies: - supports-color + - typescript '@typescript-eslint/visitor-keys@6.21.0': dependencies: @@ -5208,9 +5225,9 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-standard-with-typescript@40.0.0(@typescript-eslint/eslint-plugin@8.46.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.3): + eslint-config-standard-with-typescript@40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.46.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.9.3) eslint: 8.57.1 eslint-config-standard: 17.1.0(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1) @@ -5633,8 +5650,6 @@ snapshots: ignore@5.3.2: {} - ignore@7.0.5: {} - import-fresh@3.3.1: dependencies: parent-module: 1.0.1 diff --git a/common/scripts/package.json b/common/scripts/package.json index d394890641..b43f158e23 100644 --- a/common/scripts/package.json +++ b/common/scripts/package.json @@ -5,8 +5,8 @@ "format": "echo \"No format specified\"" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.13", - "@typescript-eslint/eslint-plugin": "^8.46.0", + "@hcengineering/platform-rig": "workspace:^0.7.14", + "@typescript-eslint/eslint-plugin": "^6.11.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-promise": "^6.1.1", "eslint-plugin-n": "^15.4.0", diff --git a/packages/measurements-otlp/package.json b/packages/measurements-otlp/package.json index ef09da693e..8704e060b9 100644 --- a/packages/measurements-otlp/package.json +++ b/packages/measurements-otlp/package.json @@ -27,11 +27,11 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.13", + "@hcengineering/platform-rig": "workspace:^0.7.14", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5", - "@typescript-eslint/eslint-plugin": "^8.46.0", + "@typescript-eslint/eslint-plugin": "^6.11.0", "@typescript-eslint/parser": "^8.46.0", "eslint": "^8.54.0", "eslint-config-standard-with-typescript": "^40.0.0", diff --git a/packages/measurements/package.json b/packages/measurements/package.json index 58b92c3489..ef59ea1492 100644 --- a/packages/measurements/package.json +++ b/packages/measurements/package.json @@ -27,11 +27,11 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.13", + "@hcengineering/platform-rig": "workspace:^0.7.14", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5", - "@typescript-eslint/eslint-plugin": "^8.46.0", + "@typescript-eslint/eslint-plugin": "^6.11.0", "@typescript-eslint/parser": "^8.46.0", "eslint": "^8.54.0", "eslint-config-standard-with-typescript": "^40.0.0", diff --git a/packages/platform-rig/CHANGELOG.json b/packages/platform-rig/CHANGELOG.json index 0384274795..cf1e9b9528 100644 --- a/packages/platform-rig/CHANGELOG.json +++ b/packages/platform-rig/CHANGELOG.json @@ -1,6 +1,18 @@ { "name": "@hcengineering/platform-rig", "entries": [ + { + "version": "0.7.14", + "tag": "@hcengineering/platform-rig_v0.7.14", + "date": "Sat, 11 Oct 2025 18:10:18 GMT", + "comments": { + "patch": [ + { + "comment": "Fix eslint script" + } + ] + } + }, { "version": "0.7.13", "tag": "@hcengineering/platform-rig_v0.7.13", diff --git a/packages/platform-rig/CHANGELOG.md b/packages/platform-rig/CHANGELOG.md index f53aa2f328..be51dcba1d 100644 --- a/packages/platform-rig/CHANGELOG.md +++ b/packages/platform-rig/CHANGELOG.md @@ -1,6 +1,13 @@ # Change Log - @hcengineering/platform-rig -This log was last generated on Sat, 11 Oct 2025 17:58:53 GMT and should not be manually modified. +This log was last generated on Sat, 11 Oct 2025 18:10:18 GMT and should not be manually modified. + +## 0.7.14 +Sat, 11 Oct 2025 18:10:18 GMT + +### Patches + +- Fix eslint script ## 0.7.13 Sat, 11 Oct 2025 17:58:53 GMT diff --git a/packages/platform-rig/bin/sync-eslint-deps.js b/packages/platform-rig/bin/sync-eslint-deps.js index e76f47cd59..de8c77277e 100755 --- a/packages/platform-rig/bin/sync-eslint-deps.js +++ b/packages/platform-rig/bin/sync-eslint-deps.js @@ -45,6 +45,24 @@ function isEslintDependency(depName) { return ESLINT_PATTERNS.some((pattern) => depName.startsWith(pattern)) } +/** + * Find platform-rig in node_modules + */ +function findPlatformRigPath() { + // Try to find platform-rig in node_modules + const cwd = process.cwd() + const possiblePaths = [path.join(cwd, 'common', 'scripts', 'node_modules', '@hcengineering', 'platform-rig')] + + for (const platformRigPath of possiblePaths) { + const packageJsonPath = path.join(platformRigPath, 'package.json') + if (fs.existsSync(packageJsonPath)) { + return platformRigPath + } + } + + return null +} + /** * Get ESLint dev dependencies from platform-rig package.json */ @@ -128,18 +146,18 @@ function main() { console.log('šŸ” Syncing ESLint dependencies from platform-rig to all packages...\n') try { - // Get all Rush projects - const projects = getRushProjects() - console.log(`Found ${projects.length} projects in Rush workspace\n`) - - // Find platform-rig project - const platformRigProject = projects.find((p) => p.name === '@hcengineering/platform-rig') - if (!platformRigProject) { - throw new Error('platform-rig package not found in Rush workspace') + // Find platform-rig in node_modules + const platformRigPath = findPlatformRigPath() + if (!platformRigPath) { + console.log('āš ļø platform-rig package not found in node_modules. Skipping sync.') + console.log(' Make sure @hcengineering/platform-rig is installed as a dependency.') + return } + console.log(`šŸ“ Found platform-rig at: ${platformRigPath}\n`) + // Get ESLint dependencies from platform-rig - const eslintDeps = getEslintDepsFromPlatformRig(platformRigProject.fullPath) + const eslintDeps = getEslintDepsFromPlatformRig(platformRigPath) if (Object.keys(eslintDeps).length === 0) { console.log('āš ļø No ESLint dependencies found in platform-rig') @@ -152,6 +170,10 @@ function main() { } console.log() + // Get all Rush projects + const projects = getRushProjects() + console.log(`Found ${projects.length} projects in Rush workspace\n`) + // Update all packages let updatedCount = 0 let skippedCount = 0 diff --git a/packages/platform-rig/package.json b/packages/platform-rig/package.json index 84a0f54026..321a60ed2f 100644 --- a/packages/platform-rig/package.json +++ b/packages/platform-rig/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/platform-rig", - "version": "0.7.13", + "version": "0.7.14", "scripts": { "build": "echo 'Not required'", "format": "echo 'Not required'" @@ -13,7 +13,7 @@ "typescript": "^5.9.3", "esbuild": "^0.25.10", "esbuild-plugin-copy": "^2.1.1", - "@typescript-eslint/eslint-plugin": "^8.46.0", + "@typescript-eslint/eslint-plugin": "^6.11.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-promise": "^6.1.1", "eslint-plugin-n": "^15.4.0", diff --git a/packages/postgres-base/package.json b/packages/postgres-base/package.json index c778b01999..07f2b667d7 100644 --- a/packages/postgres-base/package.json +++ b/packages/postgres-base/package.json @@ -28,12 +28,12 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.13", + "@hcengineering/platform-rig": "workspace:^0.7.14", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5", "@types/node": "^22.15.29", - "@typescript-eslint/eslint-plugin": "^8.46.0", + "@typescript-eslint/eslint-plugin": "^6.11.0", "@typescript-eslint/parser": "^8.46.0", "eslint": "^8.54.0", "eslint-config-standard-with-typescript": "^40.0.0", From 4aa381a50e1d6e34574d0b30d9ea9f92b56baa40 Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Sun, 12 Oct 2025 02:18:33 +0700 Subject: [PATCH 28/40] Rollback eslint plugins --- common/config/rush/pnpm-lock.yaml | 172 ++++------------------ common/scripts/package.json | 6 +- packages/measurements-otlp/CHANGELOG.json | 20 +++ packages/measurements-otlp/CHANGELOG.md | 9 +- packages/measurements-otlp/package.json | 10 +- packages/measurements/CHANGELOG.json | 17 +++ packages/measurements/CHANGELOG.md | 9 +- packages/measurements/package.json | 8 +- packages/platform-rig/CHANGELOG.json | 12 ++ packages/platform-rig/CHANGELOG.md | 9 +- packages/platform-rig/package.json | 6 +- packages/postgres-base/CHANGELOG.json | 17 +++ packages/postgres-base/CHANGELOG.md | 9 +- packages/postgres-base/package.json | 8 +- 14 files changed, 146 insertions(+), 166 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 4181b76f6e..2a49a7151f 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -19,17 +19,17 @@ importers: specifier: ^29.5.5 version: 29.5.14 '@typescript-eslint/eslint-plugin': - specifier: ^6.11.0 - version: 6.21.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + specifier: ^6.21.0 + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': - specifier: ^8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) + specifier: ^6.21.0 + version: 6.21.0(eslint@8.57.1)(typescript@5.9.3) eslint: specifier: ^8.54.0 version: 8.57.1 eslint-config-standard-with-typescript: specifier: ^40.0.0 - version: 40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.3) + version: 40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.3) eslint-plugin-import: specifier: ^2.26.0 version: 2.32.0(eslint@8.57.1) @@ -104,17 +104,17 @@ importers: specifier: ^29.5.5 version: 29.5.14 '@typescript-eslint/eslint-plugin': - specifier: ^6.11.0 - version: 6.21.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + specifier: ^6.21.0 + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': - specifier: ^8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) + specifier: ^6.21.0 + version: 6.21.0(eslint@8.57.1)(typescript@5.9.3) eslint: specifier: ^8.54.0 version: 8.57.1 eslint-config-standard-with-typescript: specifier: ^40.0.0 - version: 40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.3) + version: 40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.3) eslint-plugin-import: specifier: ^2.26.0 version: 2.32.0(eslint@8.57.1) @@ -137,11 +137,11 @@ importers: ../../packages/platform-rig: dependencies: '@typescript-eslint/eslint-plugin': - specifier: ^6.11.0 - version: 6.21.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + specifier: ^6.21.0 + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': - specifier: ^8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) + specifier: ^6.21.0 + version: 6.21.0(eslint@8.57.1)(typescript@5.9.3) esbuild: specifier: ^0.25.10 version: 0.25.10 @@ -153,7 +153,7 @@ importers: version: 8.57.1 eslint-config-standard-with-typescript: specifier: ^40.0.0 - version: 40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.3) + version: 40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.3) eslint-plugin-import: specifier: ^2.26.0 version: 2.32.0(eslint@8.57.1) @@ -192,17 +192,17 @@ importers: specifier: ^22.15.29 version: 22.18.1 '@typescript-eslint/eslint-plugin': - specifier: ^6.11.0 - version: 6.21.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + specifier: ^6.21.0 + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': - specifier: ^8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) + specifier: ^6.21.0 + version: 6.21.0(eslint@8.57.1)(typescript@5.9.3) eslint: specifier: ^8.54.0 version: 8.57.1 eslint-config-standard-with-typescript: specifier: ^40.0.0 - version: 40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.3) + version: 40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.3) eslint-plugin-import: specifier: ^2.26.0 version: 2.32.0(eslint@8.57.1) @@ -228,17 +228,17 @@ importers: specifier: workspace:^0.7.14 version: link:../../packages/platform-rig '@typescript-eslint/eslint-plugin': - specifier: ^6.11.0 - version: 6.21.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + specifier: ^6.21.0 + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': - specifier: ^8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) + specifier: ^6.21.0 + version: 6.21.0(eslint@8.57.1)(typescript@5.9.3) eslint: specifier: ^8.54.0 version: 8.57.1 eslint-config-standard-with-typescript: specifier: ^40.0.0 - version: 40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.3) + version: 40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.3) eslint-plugin-import: specifier: ^2.26.0 version: 2.32.0(eslint@8.57.1) @@ -1353,33 +1353,10 @@ packages: typescript: optional: true - '@typescript-eslint/parser@8.46.0': - resolution: {integrity: sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/project-service@8.46.0': - resolution: {integrity: sha512-OEhec0mH+U5Je2NZOeK1AbVCdm0ChyapAyTeXVIYTPXDJ3F07+cu87PPXcGoYqZ7M9YJVvFnfpGg1UmCIqM+QQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@6.21.0': resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} engines: {node: ^16.0.0 || >=18.0.0} - '@typescript-eslint/scope-manager@8.46.0': - resolution: {integrity: sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/tsconfig-utils@8.46.0': - resolution: {integrity: sha512-WrYXKGAHY836/N7zoK/kzi6p8tXFhasHh8ocFL9VZSAkvH956gfeRfcnhs3xzRy8qQ/dq3q44v1jvQieMFg2cw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@6.21.0': resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} engines: {node: ^16.0.0 || >=18.0.0} @@ -1394,10 +1371,6 @@ packages: resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} engines: {node: ^16.0.0 || >=18.0.0} - '@typescript-eslint/types@8.46.0': - resolution: {integrity: sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@6.21.0': resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} engines: {node: ^16.0.0 || >=18.0.0} @@ -1407,12 +1380,6 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@8.46.0': - resolution: {integrity: sha512-ekDCUfVpAKWJbRfm8T1YRrCot1KFxZn21oV76v5Fj4tr7ELyk84OS+ouvYdcDAwZL89WpEkEj2DKQ+qg//+ucg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@6.21.0': resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} engines: {node: ^16.0.0 || >=18.0.0} @@ -1423,10 +1390,6 @@ packages: resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} engines: {node: ^16.0.0 || >=18.0.0} - '@typescript-eslint/visitor-keys@8.46.0': - resolution: {integrity: sha512-FrvMpAK+hTbFy7vH5j1+tMYHMSKLE6RzluFJlkFNKD0p9YsUT75JlBSmr5so3QRzvMwU5/bIEdeNrxm8du8l3Q==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} @@ -1899,10 +1862,6 @@ packages: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-visitor-keys@4.2.1: - resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@8.57.1: resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2589,10 +2548,6 @@ packages: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} - minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -3035,12 +2990,6 @@ packages: peerDependencies: typescript: '>=4.2.0' - ts-api-utils@2.1.0: - resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} - engines: {node: '>=18.12'} - peerDependencies: - typescript: '>=4.8.4' - ts-jest@29.4.1: resolution: {integrity: sha512-SaeUtjfpg9Uqu8IbeDKtdaS0g8lS6FT6OzM3ezrDfErPJPHNDo/Ey+VFGP1bQIDfagYDLyRpd7O15XpG1Es2Uw==} engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} @@ -4582,10 +4531,10 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.46.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.9.3) @@ -4615,41 +4564,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3)': - dependencies: - '@typescript-eslint/scope-manager': 8.46.0 - '@typescript-eslint/types': 8.46.0 - '@typescript-eslint/typescript-estree': 8.46.0(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.46.0 - debug: 4.4.1 - eslint: 8.57.1 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/project-service@8.46.0(typescript@5.9.3)': - dependencies: - '@typescript-eslint/tsconfig-utils': 8.46.0(typescript@5.9.3) - '@typescript-eslint/types': 8.46.0 - debug: 4.4.1 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/scope-manager@6.21.0': dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - '@typescript-eslint/scope-manager@8.46.0': - dependencies: - '@typescript-eslint/types': 8.46.0 - '@typescript-eslint/visitor-keys': 8.46.0 - - '@typescript-eslint/tsconfig-utils@8.46.0(typescript@5.9.3)': - dependencies: - typescript: 5.9.3 - '@typescript-eslint/type-utils@6.21.0(eslint@8.57.1)(typescript@5.9.3)': dependencies: '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.3) @@ -4664,8 +4583,6 @@ snapshots: '@typescript-eslint/types@6.21.0': {} - '@typescript-eslint/types@8.46.0': {} - '@typescript-eslint/typescript-estree@6.21.0(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 6.21.0 @@ -4681,22 +4598,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.46.0(typescript@5.9.3)': - dependencies: - '@typescript-eslint/project-service': 8.46.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.46.0(typescript@5.9.3) - '@typescript-eslint/types': 8.46.0 - '@typescript-eslint/visitor-keys': 8.46.0 - debug: 4.4.1 - fast-glob: 3.3.3 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) @@ -4716,11 +4617,6 @@ snapshots: '@typescript-eslint/types': 6.21.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@8.46.0': - dependencies: - '@typescript-eslint/types': 8.46.0 - eslint-visitor-keys: 4.2.1 - '@ungap/structured-clone@1.3.0': {} acorn-import-attributes@1.9.5(acorn@8.15.0): @@ -5225,9 +5121,9 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-standard-with-typescript@40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.3): + eslint-config-standard-with-typescript@40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.9.3) eslint: 8.57.1 eslint-config-standard: 17.1.0(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1) @@ -5338,8 +5234,6 @@ snapshots: eslint-visitor-keys@3.4.3: {} - eslint-visitor-keys@4.2.1: {} - eslint@8.57.1: dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) @@ -6272,10 +6166,6 @@ snapshots: dependencies: brace-expansion: 2.0.2 - minimatch@9.0.5: - dependencies: - brace-expansion: 2.0.2 - minimist@1.2.8: {} module-details-from-path@1.0.4: {} @@ -6740,10 +6630,6 @@ snapshots: dependencies: typescript: 5.9.3 - ts-api-utils@2.1.0(typescript@5.9.3): - dependencies: - typescript: 5.9.3 - ts-jest@29.4.1(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest-util@29.7.0)(jest@29.7.0(@types/node@22.18.1))(typescript@5.9.3): dependencies: bs-logger: 0.2.6 diff --git a/common/scripts/package.json b/common/scripts/package.json index b43f158e23..29c8fe4b4a 100644 --- a/common/scripts/package.json +++ b/common/scripts/package.json @@ -5,13 +5,13 @@ "format": "echo \"No format specified\"" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.14", - "@typescript-eslint/eslint-plugin": "^6.11.0", + "@hcengineering/platform-rig": "workspace:^0.7.15", + "@typescript-eslint/eslint-plugin": "^6.21.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-promise": "^6.1.1", "eslint-plugin-n": "^15.4.0", "eslint": "^8.54.0", - "@typescript-eslint/parser": "^8.46.0", + "@typescript-eslint/parser": "^6.21.0", "eslint-config-standard-with-typescript": "^40.0.0" }, "private": true diff --git a/packages/measurements-otlp/CHANGELOG.json b/packages/measurements-otlp/CHANGELOG.json index 29981d5732..544027e975 100644 --- a/packages/measurements-otlp/CHANGELOG.json +++ b/packages/measurements-otlp/CHANGELOG.json @@ -1,6 +1,26 @@ { "name": "@hcengineering/measurements-otlp", "entries": [ + { + "version": "0.7.12", + "tag": "@hcengineering/measurements-otlp_v0.7.12", + "date": "Sat, 11 Oct 2025 19:18:56 GMT", + "comments": { + "patch": [ + { + "comment": "rollback eslint" + } + ], + "dependency": [ + { + "comment": "Updating dependency \"@hcengineering/measurements\" from `^0.7.11` to `0.7.12`" + }, + { + "comment": "Updating dependency \"@hcengineering/platform-rig\" from `^0.7.14` to `0.7.15`" + } + ] + } + }, { "version": "0.7.11", "tag": "@hcengineering/measurements-otlp_v0.7.11", diff --git a/packages/measurements-otlp/CHANGELOG.md b/packages/measurements-otlp/CHANGELOG.md index 2b61689590..04a7b9b1eb 100644 --- a/packages/measurements-otlp/CHANGELOG.md +++ b/packages/measurements-otlp/CHANGELOG.md @@ -1,6 +1,13 @@ # Change Log - @hcengineering/measurements-otlp -This log was last generated on Sat, 11 Oct 2025 17:58:53 GMT and should not be manually modified. +This log was last generated on Sat, 11 Oct 2025 19:18:56 GMT and should not be manually modified. + +## 0.7.12 +Sat, 11 Oct 2025 19:18:56 GMT + +### Patches + +- rollback eslint ## 0.7.11 Sat, 11 Oct 2025 17:58:53 GMT diff --git a/packages/measurements-otlp/package.json b/packages/measurements-otlp/package.json index 8704e060b9..eca771f525 100644 --- a/packages/measurements-otlp/package.json +++ b/packages/measurements-otlp/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/measurements-otlp", - "version": "0.7.11", + "version": "0.7.12", "main": "lib/index.js", "svelte": "src/index.ts", "types": "types/index.d.ts", @@ -27,12 +27,12 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.14", + "@hcengineering/platform-rig": "workspace:^0.7.15", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5", - "@typescript-eslint/eslint-plugin": "^6.11.0", - "@typescript-eslint/parser": "^8.46.0", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", "eslint": "^8.54.0", "eslint-config-standard-with-typescript": "^40.0.0", "eslint-plugin-import": "^2.26.0", @@ -41,7 +41,7 @@ "eslint-plugin-n": "^15.4.0" }, "dependencies": { - "@hcengineering/measurements": "workspace:^0.7.11", + "@hcengineering/measurements": "workspace:^0.7.12", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-logs": "^0.203.0", "@opentelemetry/auto-instrumentations-node": "^0.62.0", diff --git a/packages/measurements/CHANGELOG.json b/packages/measurements/CHANGELOG.json index 177ce67e4c..75d261f4f4 100644 --- a/packages/measurements/CHANGELOG.json +++ b/packages/measurements/CHANGELOG.json @@ -1,6 +1,23 @@ { "name": "@hcengineering/measurements", "entries": [ + { + "version": "0.7.12", + "tag": "@hcengineering/measurements_v0.7.12", + "date": "Sat, 11 Oct 2025 19:18:56 GMT", + "comments": { + "patch": [ + { + "comment": "rollback eslint" + } + ], + "dependency": [ + { + "comment": "Updating dependency \"@hcengineering/platform-rig\" from `^0.7.14` to `0.7.15`" + } + ] + } + }, { "version": "0.7.11", "tag": "@hcengineering/measurements_v0.7.11", diff --git a/packages/measurements/CHANGELOG.md b/packages/measurements/CHANGELOG.md index d532018d7d..0e5ac8f513 100644 --- a/packages/measurements/CHANGELOG.md +++ b/packages/measurements/CHANGELOG.md @@ -1,6 +1,13 @@ # Change Log - @hcengineering/measurements -This log was last generated on Sat, 11 Oct 2025 17:58:53 GMT and should not be manually modified. +This log was last generated on Sat, 11 Oct 2025 19:18:56 GMT and should not be manually modified. + +## 0.7.12 +Sat, 11 Oct 2025 19:18:56 GMT + +### Patches + +- rollback eslint ## 0.7.11 Sat, 11 Oct 2025 17:58:53 GMT diff --git a/packages/measurements/package.json b/packages/measurements/package.json index ef59ea1492..d68ba05428 100644 --- a/packages/measurements/package.json +++ b/packages/measurements/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/measurements", - "version": "0.7.11", + "version": "0.7.12", "main": "lib/index.js", "svelte": "src/index.ts", "types": "types/index.d.ts", @@ -27,12 +27,12 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.14", + "@hcengineering/platform-rig": "workspace:^0.7.15", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5", - "@typescript-eslint/eslint-plugin": "^6.11.0", - "@typescript-eslint/parser": "^8.46.0", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", "eslint": "^8.54.0", "eslint-config-standard-with-typescript": "^40.0.0", "eslint-plugin-import": "^2.26.0", diff --git a/packages/platform-rig/CHANGELOG.json b/packages/platform-rig/CHANGELOG.json index cf1e9b9528..2889a012f2 100644 --- a/packages/platform-rig/CHANGELOG.json +++ b/packages/platform-rig/CHANGELOG.json @@ -1,6 +1,18 @@ { "name": "@hcengineering/platform-rig", "entries": [ + { + "version": "0.7.15", + "tag": "@hcengineering/platform-rig_v0.7.15", + "date": "Sat, 11 Oct 2025 19:18:56 GMT", + "comments": { + "patch": [ + { + "comment": "rollback eslint" + } + ] + } + }, { "version": "0.7.14", "tag": "@hcengineering/platform-rig_v0.7.14", diff --git a/packages/platform-rig/CHANGELOG.md b/packages/platform-rig/CHANGELOG.md index be51dcba1d..b1bd92573c 100644 --- a/packages/platform-rig/CHANGELOG.md +++ b/packages/platform-rig/CHANGELOG.md @@ -1,6 +1,13 @@ # Change Log - @hcengineering/platform-rig -This log was last generated on Sat, 11 Oct 2025 18:10:18 GMT and should not be manually modified. +This log was last generated on Sat, 11 Oct 2025 19:18:56 GMT and should not be manually modified. + +## 0.7.15 +Sat, 11 Oct 2025 19:18:56 GMT + +### Patches + +- rollback eslint ## 0.7.14 Sat, 11 Oct 2025 18:10:18 GMT diff --git a/packages/platform-rig/package.json b/packages/platform-rig/package.json index 321a60ed2f..58e1df6fdd 100644 --- a/packages/platform-rig/package.json +++ b/packages/platform-rig/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/platform-rig", - "version": "0.7.14", + "version": "0.7.15", "scripts": { "build": "echo 'Not required'", "format": "echo 'Not required'" @@ -13,12 +13,12 @@ "typescript": "^5.9.3", "esbuild": "^0.25.10", "esbuild-plugin-copy": "^2.1.1", - "@typescript-eslint/eslint-plugin": "^6.11.0", + "@typescript-eslint/eslint-plugin": "^6.21.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-promise": "^6.1.1", "eslint-plugin-n": "^15.4.0", "eslint": "^8.54.0", - "@typescript-eslint/parser": "^8.46.0", + "@typescript-eslint/parser": "^6.21.0", "eslint-config-standard-with-typescript": "^40.0.0", "prettier": "^3.6.2", "prettier-plugin-svelte": "^3.4.0", diff --git a/packages/postgres-base/CHANGELOG.json b/packages/postgres-base/CHANGELOG.json index 9aad29ddde..3f964c9c17 100644 --- a/packages/postgres-base/CHANGELOG.json +++ b/packages/postgres-base/CHANGELOG.json @@ -1,6 +1,23 @@ { "name": "@hcengineering/postgres-base", "entries": [ + { + "version": "0.7.12", + "tag": "@hcengineering/postgres-base_v0.7.12", + "date": "Sat, 11 Oct 2025 19:18:56 GMT", + "comments": { + "patch": [ + { + "comment": "rollback eslint" + } + ], + "dependency": [ + { + "comment": "Updating dependency \"@hcengineering/platform-rig\" from `^0.7.14` to `0.7.15`" + } + ] + } + }, { "version": "0.7.11", "tag": "@hcengineering/postgres-base_v0.7.11", diff --git a/packages/postgres-base/CHANGELOG.md b/packages/postgres-base/CHANGELOG.md index cb87f67b9f..f81c959a6a 100644 --- a/packages/postgres-base/CHANGELOG.md +++ b/packages/postgres-base/CHANGELOG.md @@ -1,6 +1,13 @@ # Change Log - @hcengineering/postgres-base -This log was last generated on Sat, 11 Oct 2025 17:58:53 GMT and should not be manually modified. +This log was last generated on Sat, 11 Oct 2025 19:18:56 GMT and should not be manually modified. + +## 0.7.12 +Sat, 11 Oct 2025 19:18:56 GMT + +### Patches + +- rollback eslint ## 0.7.11 Sat, 11 Oct 2025 17:58:53 GMT diff --git a/packages/postgres-base/package.json b/packages/postgres-base/package.json index 07f2b667d7..af6a559912 100644 --- a/packages/postgres-base/package.json +++ b/packages/postgres-base/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/postgres-base", - "version": "0.7.11", + "version": "0.7.12", "main": "lib/index.js", "svelte": "src/index.ts", "types": "types/index.d.ts", @@ -28,13 +28,13 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.14", + "@hcengineering/platform-rig": "workspace:^0.7.15", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5", "@types/node": "^22.15.29", - "@typescript-eslint/eslint-plugin": "^6.11.0", - "@typescript-eslint/parser": "^8.46.0", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", "eslint": "^8.54.0", "eslint-config-standard-with-typescript": "^40.0.0", "eslint-plugin-import": "^2.26.0", From 002e3fb97e0cd9b09d72b688dcd6addf73fe5632 Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Sun, 12 Oct 2025 02:20:47 +0700 Subject: [PATCH 29/40] Fix lock file --- common/config/rush/pnpm-lock.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 2a49a7151f..3623eeb2b8 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -13,7 +13,7 @@ importers: ../../packages/measurements: devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.14 + specifier: workspace:^0.7.15 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 @@ -52,7 +52,7 @@ importers: ../../packages/measurements-otlp: dependencies: '@hcengineering/measurements': - specifier: workspace:^0.7.11 + specifier: workspace:^0.7.12 version: link:../measurements '@opentelemetry/api': specifier: ^1.9.0 @@ -98,7 +98,7 @@ importers: version: 2.1.0(@opentelemetry/api@1.9.0) devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.14 + specifier: workspace:^0.7.15 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 @@ -183,7 +183,7 @@ importers: version: 3.4.7 devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.14 + specifier: workspace:^0.7.15 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 @@ -225,7 +225,7 @@ importers: ../scripts: devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.14 + specifier: workspace:^0.7.15 version: link:../../packages/platform-rig '@typescript-eslint/eslint-plugin': specifier: ^6.21.0 From 2430d5d7bfca3510f0ebb4c05807d23667303b30 Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Sun, 12 Oct 2025 09:48:56 +0700 Subject: [PATCH 30/40] Allow to compile svelte files --- common/config/rush/pnpm-lock.yaml | 176 +++++++++++++++++++++++- common/scripts/package.json | 2 +- packages/measurements-otlp/package.json | 2 +- packages/measurements/package.json | 2 +- packages/platform-rig/CHANGELOG.json | 12 ++ packages/platform-rig/CHANGELOG.md | 9 +- packages/platform-rig/bin/compile.js | 114 ++++++++++++++- packages/platform-rig/package.json | 9 +- packages/postgres-base/package.json | 2 +- 9 files changed, 315 insertions(+), 13 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 3623eeb2b8..6145db6184 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -13,7 +13,7 @@ importers: ../../packages/measurements: devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.15 + specifier: workspace:^0.7.16 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 @@ -98,7 +98,7 @@ importers: version: 2.1.0(@opentelemetry/api@1.9.0) devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.15 + specifier: workspace:^0.7.16 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 @@ -148,6 +148,9 @@ importers: esbuild-plugin-copy: specifier: ^2.1.1 version: 2.1.1(esbuild@0.25.10) + esbuild-svelte: + specifier: ^0.8.2 + version: 0.8.2(esbuild@0.25.10)(svelte@4.2.20) eslint: specifier: ^8.54.0 version: 8.57.1 @@ -172,6 +175,12 @@ importers: svelte: specifier: ^4.2.20 version: 4.2.20 + svelte-preprocess: + specifier: ^5.1.3 + version: 5.1.4(@babel/core@7.28.4)(svelte@4.2.20)(typescript@5.9.3) + svelte2tsx: + specifier: ^0.7.25 + version: 0.7.45(svelte@4.2.20)(typescript@5.9.3) typescript: specifier: ^5.9.3 version: 5.9.3 @@ -183,7 +192,7 @@ importers: version: 3.4.7 devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.15 + specifier: workspace:^0.7.16 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 @@ -225,7 +234,7 @@ importers: ../scripts: devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.15 + specifier: workspace:^0.7.16 version: link:../../packages/platform-rig '@typescript-eslint/eslint-plugin': specifier: ^6.21.0 @@ -1317,6 +1326,9 @@ packages: '@types/pg@8.15.5': resolution: {integrity: sha512-LF7lF6zWEKxuT3/OR8wAZGzkg4ENGXFNyiV/JeOt9z5B+0ZVwbql9McqX5c/WStFq1GaGso7H1AzP/qSzmlCKQ==} + '@types/pug@2.0.10': + resolution: {integrity: sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==} + '@types/semver@7.7.1': resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} @@ -1542,6 +1554,10 @@ packages: bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + buffer-crc32@1.0.0: + resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} + engines: {node: '>=8.0.0'} + buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -1658,6 +1674,9 @@ packages: supports-color: optional: true + dedent-js@1.0.1: + resolution: {integrity: sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==} + dedent@1.7.0: resolution: {integrity: sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==} peerDependencies: @@ -1681,6 +1700,10 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} @@ -1746,11 +1769,21 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} + es6-promise@3.3.1: + resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} + esbuild-plugin-copy@2.1.1: resolution: {integrity: sha512-Bk66jpevTcV8KMFzZI1P7MZKZ+uDcrZm2G2egZ2jNIvVnivDpodZI+/KnpL3Jnap0PBdIHU7HwFGB8r+vV5CVw==} peerDependencies: esbuild: '>= 0.14.0' + esbuild-svelte@0.8.2: + resolution: {integrity: sha512-tG97WrhH/OH8wFCmRBk6sRggMVMPNZDktGx1jJcvh9Obvjwm8M1UYoXmliuLL+4fs/wfyVVwM2fvyNYz2e6UPQ==} + engines: {node: '>=14'} + peerDependencies: + esbuild: '>=0.9.6' + svelte: '>=3.43.0 <6 || ^5.0.0-next.0' + esbuild@0.25.10: resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} engines: {node: '>=18'} @@ -2541,6 +2574,10 @@ packages: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -2551,6 +2588,10 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + module-details-from-path@1.0.4: resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==} @@ -2814,6 +2855,11 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rimraf@2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} deprecated: Rimraf versions prior to v4 are no longer supported @@ -2834,6 +2880,12 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} + sander@0.5.1: + resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==} + + scule@1.3.0: + resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -2889,6 +2941,10 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} + sorcery@0.11.1: + resolution: {integrity: sha512-o7npfeJE6wi6J9l0/5LKshFzZ2rMatRiCDwYeDQaOzqdzRJwALhX7mk/A/ecg6wjMu7wdZbmXfD2S/vpOg0bdQ==} + hasBin: true + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -2947,6 +3003,10 @@ packages: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -2963,6 +3023,49 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + svelte-preprocess@5.1.4: + resolution: {integrity: sha512-IvnbQ6D6Ao3Gg6ftiM5tdbR6aAETwjhHV+UKGf5bHGYR69RQvF1ho0JKPcbUON4vy4R7zom13jPjgdOWCQ5hDA==} + engines: {node: '>= 16.0.0'} + peerDependencies: + '@babel/core': ^7.10.2 + coffeescript: ^2.5.1 + less: ^3.11.3 || ^4.0.0 + postcss: ^7 || ^8 + postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 + pug: ^3.0.0 + sass: ^1.26.8 + stylus: ^0.55.0 + sugarss: ^2.0.0 || ^3.0.0 || ^4.0.0 + svelte: ^3.23.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0 + typescript: '>=3.9.5 || ^4.0.0 || ^5.0.0' + peerDependenciesMeta: + '@babel/core': + optional: true + coffeescript: + optional: true + less: + optional: true + postcss: + optional: true + postcss-load-config: + optional: true + pug: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + typescript: + optional: true + + svelte2tsx@0.7.45: + resolution: {integrity: sha512-cSci+mYGygYBHIZLHlm/jYlEc1acjAHqaQaDFHdEBpUueM9kSTnPpvPtSl5VkJOU1qSJ7h1K+6F/LIUYiqC8VA==} + peerDependencies: + svelte: ^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0 + typescript: ^4.9.4 || ^5.0.0 + svelte@4.2.20: resolution: {integrity: sha512-eeEgGc2DtiUil5ANdtd8vPwt9AgaMdnuUFnPft9F5oMvU/FHu5IHFic+p1dR/UOB7XU2mX2yHW+NcTch4DCh5Q==} engines: {node: '>=16'} @@ -4517,6 +4620,8 @@ snapshots: pg-protocol: 1.10.3 pg-types: 2.2.0 + '@types/pug@2.0.10': {} + '@types/semver@7.7.1': {} '@types/stack-utils@2.0.3': {} @@ -4812,6 +4917,8 @@ snapshots: dependencies: node-int64: 0.4.0 + buffer-crc32@1.0.0: {} + buffer-from@1.1.2: {} builtins@5.1.0: @@ -4946,6 +5053,8 @@ snapshots: dependencies: ms: 2.1.3 + dedent-js@1.0.1: {} + dedent@1.7.0: {} deep-is@0.1.4: {} @@ -4964,6 +5073,8 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 + detect-indent@6.1.0: {} + detect-newline@3.1.0: {} diff-sequences@29.6.3: {} @@ -5078,6 +5189,8 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 + es6-promise@3.3.1: {} + esbuild-plugin-copy@2.1.1(esbuild@0.25.10): dependencies: chalk: 4.1.2 @@ -5086,6 +5199,12 @@ snapshots: fs-extra: 10.1.0 globby: 11.1.0 + esbuild-svelte@0.8.2(esbuild@0.25.10)(svelte@4.2.20): + dependencies: + '@jridgewell/trace-mapping': 0.3.30 + esbuild: 0.25.10 + svelte: 4.2.20 + esbuild@0.25.10: optionalDependencies: '@esbuild/aix-ppc64': 0.25.10 @@ -6158,6 +6277,8 @@ snapshots: mimic-fn@2.1.0: {} + min-indent@1.0.1: {} + minimatch@3.1.2: dependencies: brace-expansion: 1.1.12 @@ -6168,6 +6289,10 @@ snapshots: minimist@1.2.8: {} + mkdirp@0.5.6: + dependencies: + minimist: 1.2.8 + module-details-from-path@1.0.4: {} ms@2.1.3: {} @@ -6424,6 +6549,10 @@ snapshots: reusify@1.1.0: {} + rimraf@2.7.1: + dependencies: + glob: 7.2.3 + rimraf@3.0.2: dependencies: glob: 7.2.3 @@ -6451,6 +6580,15 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 + sander@0.5.1: + dependencies: + es6-promise: 3.3.1 + graceful-fs: 4.2.11 + mkdirp: 0.5.6 + rimraf: 2.7.1 + + scule@1.3.0: {} + semver@6.3.1: {} semver@7.7.2: {} @@ -6517,6 +6655,13 @@ snapshots: slash@3.0.0: {} + sorcery@0.11.1: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + buffer-crc32: 1.0.0 + minimist: 1.2.8 + sander: 0.5.1 + source-map-js@1.2.1: {} source-map-support@0.5.13: @@ -6581,6 +6726,10 @@ snapshots: strip-final-newline@2.0.0: {} + strip-indent@3.0.0: + dependencies: + min-indent: 1.0.1 + strip-json-comments@3.1.1: {} supports-color@7.2.0: @@ -6593,6 +6742,25 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + svelte-preprocess@5.1.4(@babel/core@7.28.4)(svelte@4.2.20)(typescript@5.9.3): + dependencies: + '@types/pug': 2.0.10 + detect-indent: 6.1.0 + magic-string: 0.30.19 + sorcery: 0.11.1 + strip-indent: 3.0.0 + svelte: 4.2.20 + optionalDependencies: + '@babel/core': 7.28.4 + typescript: 5.9.3 + + svelte2tsx@0.7.45(svelte@4.2.20)(typescript@5.9.3): + dependencies: + dedent-js: 1.0.1 + scule: 1.3.0 + svelte: 4.2.20 + typescript: 5.9.3 + svelte@4.2.20: dependencies: '@ampproject/remapping': 2.3.0 diff --git a/common/scripts/package.json b/common/scripts/package.json index 29c8fe4b4a..9f10550ac1 100644 --- a/common/scripts/package.json +++ b/common/scripts/package.json @@ -5,7 +5,7 @@ "format": "echo \"No format specified\"" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.15", + "@hcengineering/platform-rig": "workspace:^0.7.16", "@typescript-eslint/eslint-plugin": "^6.21.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-promise": "^6.1.1", diff --git a/packages/measurements-otlp/package.json b/packages/measurements-otlp/package.json index eca771f525..1764651662 100644 --- a/packages/measurements-otlp/package.json +++ b/packages/measurements-otlp/package.json @@ -27,7 +27,7 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.15", + "@hcengineering/platform-rig": "workspace:^0.7.16", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5", diff --git a/packages/measurements/package.json b/packages/measurements/package.json index d68ba05428..83e47edaca 100644 --- a/packages/measurements/package.json +++ b/packages/measurements/package.json @@ -27,7 +27,7 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.15", + "@hcengineering/platform-rig": "workspace:^0.7.16", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5", diff --git a/packages/platform-rig/CHANGELOG.json b/packages/platform-rig/CHANGELOG.json index 2889a012f2..e6c110fd25 100644 --- a/packages/platform-rig/CHANGELOG.json +++ b/packages/platform-rig/CHANGELOG.json @@ -1,6 +1,18 @@ { "name": "@hcengineering/platform-rig", "entries": [ + { + "version": "0.7.16", + "tag": "@hcengineering/platform-rig_v0.7.16", + "date": "Sun, 12 Oct 2025 02:49:17 GMT", + "comments": { + "patch": [ + { + "comment": "Allow to compile svelte files" + } + ] + } + }, { "version": "0.7.15", "tag": "@hcengineering/platform-rig_v0.7.15", diff --git a/packages/platform-rig/CHANGELOG.md b/packages/platform-rig/CHANGELOG.md index b1bd92573c..1eee7524a5 100644 --- a/packages/platform-rig/CHANGELOG.md +++ b/packages/platform-rig/CHANGELOG.md @@ -1,6 +1,13 @@ # Change Log - @hcengineering/platform-rig -This log was last generated on Sat, 11 Oct 2025 19:18:56 GMT and should not be manually modified. +This log was last generated on Sun, 12 Oct 2025 02:49:17 GMT and should not be manually modified. + +## 0.7.16 +Sun, 12 Oct 2025 02:49:17 GMT + +### Patches + +- Allow to compile svelte files ## 0.7.15 Sat, 11 Oct 2025 19:18:56 GMT diff --git a/packages/platform-rig/bin/compile.js b/packages/platform-rig/bin/compile.js index ae9b97840b..a12563e5b8 100755 --- a/packages/platform-rig/bin/compile.js +++ b/packages/platform-rig/bin/compile.js @@ -15,6 +15,9 @@ const esbuild = require('esbuild') const { copy } = require('esbuild-plugin-copy') const fs = require('fs') const ts = require('typescript') +const sveltePlugin = require('esbuild-svelte') +const { svelte2tsx } = require('svelte2tsx') +const sveltePreprocess = require('svelte-preprocess') async function execProcess(cmd, logFile, args, buildDir = '.build') { let compileRoot = dirname(dirname(process.argv[1])) @@ -131,7 +134,20 @@ function cleanNonModified(before, after) { switch (args[0]) { case 'ui': { - console.log('Nothing to compile to UI') + console.log('Building UI package with Svelte support...') + let st = performance.now() + const filesToTranspile = collectFiles(join(process.cwd(), 'src')) + const before = {} + const after = {} + collectFileStats('lib', before) + collectFileStats('types', before) + + Promise.all([performESBuildWithSvelte(filesToTranspile), validateTSC(), generateSvelteTypes()]).then(() => { + console.log('UI build time: ', Math.round((performance.now() - st) * 100) / 100) + collectFileStats('lib', after) + collectFileStats('types', after) + cleanNonModified(before, after) + }) break } case 'transpile': { @@ -190,6 +206,102 @@ async function performESBuild(filesToTranspile) { }) } +async function performESBuildWithSvelte(filesToTranspile) { + // Separate Svelte and non-Svelte files + const svelteFiles = filesToTranspile.filter((f) => f.endsWith('.svelte')) + const nonSvelteFiles = filesToTranspile.filter((f) => !f.endsWith('.svelte')) + + // Build non-Svelte files + if (nonSvelteFiles.length > 0) { + await esbuild.build({ + entryPoints: nonSvelteFiles, + bundle: false, + minify: false, + outdir: 'lib', + keepNames: true, + sourcemap: 'linked', + allowOverwrite: true, + format: 'cjs', + color: true, + plugins: [ + copy({ + resolveFrom: 'cwd', + assets: { + from: ['src/**/*.json'], + to: ['./lib'] + }, + watch: false + }) + ] + }) + } + + // Build Svelte files + if (svelteFiles.length > 0) { + await esbuild.build({ + entryPoints: svelteFiles, + bundle: false, + minify: false, + outdir: 'lib', + outExtension: { '.js': '.svelte.js' }, + keepNames: true, + sourcemap: 'linked', + allowOverwrite: true, + format: 'cjs', + color: true, + plugins: [ + sveltePlugin({ + preprocess: sveltePreprocess(), + compilerOptions: { + css: 'injected', + generate: 'ssr' + } + }) + ] + }) + } +} + +async function generateSvelteTypes() { + const srcDir = join(process.cwd(), 'src') + const typesDir = join(process.cwd(), 'types') + + if (!existsSync(srcDir)) { + return + } + + if (!existsSync(typesDir)) { + mkdirSync(typesDir, { recursive: true }) + } + + const svelteFiles = collectFiles(srcDir).filter((f) => f.endsWith('.svelte')) + + for (const svelteFile of svelteFiles) { + try { + const content = readFileSync(svelteFile, 'utf-8') + const result = svelte2tsx(content, { + filename: svelteFile, + isTsFile: true, + mode: 'dts' + }) + + const relativePath = svelteFile.replace(srcDir, '') + const outputPath = join(typesDir, relativePath.replace('.svelte', '.svelte.d.ts')) + const outputDir = dirname(outputPath) + + if (!existsSync(outputDir)) { + mkdirSync(outputDir, { recursive: true }) + } + + // Generate simple .d.ts file for Svelte components + const dtsContent = `import { SvelteComponentTyped } from 'svelte';\nexport default class extends SvelteComponentTyped {}\n` + writeFileSync(outputPath, dtsContent) + } catch (err) { + console.error(`Error generating types for ${svelteFile}:`, err.message) + } + } +} + async function validateTSC(st) { const buildDir = '.validate' diff --git a/packages/platform-rig/package.json b/packages/platform-rig/package.json index 58e1df6fdd..8a01dd3072 100644 --- a/packages/platform-rig/package.json +++ b/packages/platform-rig/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/platform-rig", - "version": "0.7.15", + "version": "0.7.16", "scripts": { "build": "echo 'Not required'", "format": "echo 'Not required'" @@ -13,6 +13,10 @@ "typescript": "^5.9.3", "esbuild": "^0.25.10", "esbuild-plugin-copy": "^2.1.1", + "esbuild-svelte": "^0.8.2", + "svelte": "^4.2.20", + "svelte-preprocess": "^5.1.3", + "svelte2tsx": "^0.7.25", "@typescript-eslint/eslint-plugin": "^6.21.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-promise": "^6.1.1", @@ -21,8 +25,7 @@ "@typescript-eslint/parser": "^6.21.0", "eslint-config-standard-with-typescript": "^40.0.0", "prettier": "^3.6.2", - "prettier-plugin-svelte": "^3.4.0", - "svelte": "^4.2.20" + "prettier-plugin-svelte": "^3.4.0" }, "bin": { "format": "./bin/format.js", diff --git a/packages/postgres-base/package.json b/packages/postgres-base/package.json index af6a559912..7b46b5b9fc 100644 --- a/packages/postgres-base/package.json +++ b/packages/postgres-base/package.json @@ -28,7 +28,7 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.15", + "@hcengineering/platform-rig": "workspace:^0.7.16", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5", From ccc5ca7e922b3266737843b90baf6baa37a2c51e Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Sun, 12 Oct 2025 10:30:14 +0700 Subject: [PATCH 31/40] Add ui-test component for checking compile --- common/config/rush/pnpm-lock.yaml | 307 ++++++++++++++++++++- common/scripts/package.json | 2 +- packages/measurements-otlp/package.json | 2 +- packages/measurements/package.json | 2 +- packages/platform-rig/CHANGELOG.json | 12 + packages/platform-rig/CHANGELOG.md | 9 +- packages/platform-rig/bin/compile.js | 40 ++- packages/platform-rig/package.json | 4 +- packages/postgres-base/package.json | 2 +- packages/ui-test/.eslintignore | 5 + packages/ui-test/.eslintrc.js | 8 + packages/ui-test/.npmignore | 8 + packages/ui-test/config/rig.json | 5 + packages/ui-test/jest.config.js | 7 + packages/ui-test/package.json | 59 ++++ packages/ui-test/postcss.config.js | 5 + packages/ui-test/src/component/Test.svelte | 6 + packages/ui-test/src/index.ts | 4 + packages/ui-test/src/svelte.d.ts_ | 4 + packages/ui-test/svelte.config.js | 5 + packages/ui-test/tsconfig.json | 12 + rush.json | 5 + 22 files changed, 491 insertions(+), 22 deletions(-) create mode 100644 packages/ui-test/.eslintignore create mode 100644 packages/ui-test/.eslintrc.js create mode 100644 packages/ui-test/.npmignore create mode 100644 packages/ui-test/config/rig.json create mode 100644 packages/ui-test/jest.config.js create mode 100644 packages/ui-test/package.json create mode 100644 packages/ui-test/postcss.config.js create mode 100644 packages/ui-test/src/component/Test.svelte create mode 100644 packages/ui-test/src/index.ts create mode 100644 packages/ui-test/src/svelte.d.ts_ create mode 100644 packages/ui-test/svelte.config.js create mode 100644 packages/ui-test/tsconfig.json diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 6145db6184..6f762d74cc 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -13,7 +13,7 @@ importers: ../../packages/measurements: devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.16 + specifier: workspace:^0.7.17 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 @@ -98,7 +98,7 @@ importers: version: 2.1.0(@opentelemetry/api@1.9.0) devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.16 + specifier: workspace:^0.7.17 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 @@ -177,9 +177,9 @@ importers: version: 4.2.20 svelte-preprocess: specifier: ^5.1.3 - version: 5.1.4(@babel/core@7.28.4)(svelte@4.2.20)(typescript@5.9.3) + version: 5.1.4(@babel/core@7.28.4)(sass@1.93.2)(svelte@4.2.20)(typescript@5.9.3) svelte2tsx: - specifier: ^0.7.25 + specifier: ^0.7.45 version: 0.7.45(svelte@4.2.20)(typescript@5.9.3) typescript: specifier: ^5.9.3 @@ -192,7 +192,7 @@ importers: version: 3.4.7 devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.16 + specifier: workspace:^0.7.17 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 @@ -231,10 +231,65 @@ importers: specifier: ^29.1.1 version: 29.4.1(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest-util@29.7.0)(jest@29.7.0(@types/node@22.18.1))(typescript@5.9.3) + ../../packages/ui-test: + dependencies: + svelte: + specifier: ^4.2.20 + version: 4.2.20 + devDependencies: + '@hcengineering/platform-rig': + specifier: workspace:^0.7.17 + version: link:../platform-rig + '@types/jest': + specifier: ^29.5.5 + version: 29.5.14 + '@types/node': + specifier: ^22.15.29 + version: 22.18.1 + '@typescript-eslint/eslint-plugin': + specifier: ^6.21.0 + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/parser': + specifier: ^6.21.0 + version: 6.21.0(eslint@8.57.1)(typescript@5.9.3) + eslint: + specifier: ^8.54.0 + version: 8.57.1 + eslint-config-standard-with-typescript: + specifier: ^40.0.0 + version: 40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.3) + eslint-plugin-import: + specifier: ^2.26.0 + version: 2.32.0(eslint@8.57.1) + eslint-plugin-n: + specifier: ^15.4.0 + version: 15.7.0(eslint@8.57.1) + eslint-plugin-node: + specifier: ^11.1.0 + version: 11.1.0(eslint@8.57.1) + eslint-plugin-promise: + specifier: ^6.1.1 + version: 6.6.0(eslint@8.57.1) + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@22.18.1) + sass: + specifier: ^1.53.0 + version: 1.93.2 + svelte-loader: + specifier: ^3.2.0 + version: 3.2.4(svelte@4.2.20) + svelte-preprocess: + specifier: ^5.1.3 + version: 5.1.4(@babel/core@7.28.4)(sass@1.93.2)(svelte@4.2.20)(typescript@5.9.3) + ts-jest: + specifier: ^29.1.1 + version: 29.4.1(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest-util@29.7.0)(jest@29.7.0(@types/node@22.18.1))(typescript@5.9.3) + ../scripts: devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.16 + specifier: workspace:^0.7.17 version: link:../../packages/platform-rig '@typescript-eslint/eslint-plugin': specifier: ^6.21.0 @@ -1221,6 +1276,88 @@ packages: peerDependencies: '@opentelemetry/api': ^1.1.0 + '@parcel/watcher-android-arm64@2.5.1': + resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.1': + resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.1': + resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.1': + resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.1': + resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm-musl@2.5.1': + resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-arm64-musl@2.5.1': + resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-x64-glibc@2.5.1': + resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-linux-x64-musl@2.5.1': + resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-win32-arm64@2.5.1': + resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.1': + resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.1': + resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.1': + resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} + engines: {node: '>= 10.0.0'} + '@protobufjs/aspromise@1.1.2': resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} @@ -1525,6 +1662,9 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + bignumber.js@9.3.1: resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} @@ -1603,6 +1743,10 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} @@ -1704,6 +1848,11 @@ packages: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} @@ -1738,6 +1887,10 @@ packages: emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} @@ -2140,6 +2293,9 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + immutable@5.1.3: + resolution: {integrity: sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==} + import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} @@ -2513,6 +2669,10 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + loader-utils@2.0.4: + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} + engines: {node: '>=8.9.0'} + locate-character@3.0.0: resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} @@ -2604,6 +2764,9 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -2810,6 +2973,10 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + reflect.getprototypeof@1.0.10: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} @@ -2883,6 +3050,11 @@ packages: sander@0.5.1: resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==} + sass@1.93.2: + resolution: {integrity: sha512-t+YPtOQHpGW1QWsh1CHQ5cPIr9lbbGZLZnbihP/D/qZj/yuV68m8qarcV17nvkOX81BCrvzAlq2klCQFZghyTg==} + engines: {node: '>=14.0.0'} + hasBin: true + scule@1.3.0: resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} @@ -3023,6 +3195,20 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + svelte-dev-helper@1.1.9: + resolution: {integrity: sha512-oU+Xv7Dl4kRU2kdFjsoPLfJfnt5hUhsFUZtuzI3Ku/f2iAFZqBoEuXOqK3N9ngD4dxQOmN4OKWPHVi3NeAeAfQ==} + + svelte-hmr@0.14.12: + resolution: {integrity: sha512-4QSW/VvXuqVcFZ+RhxiR8/newmwOCTlbYIezvkeN6302YFRE8cXy0naamHcjz8Y9Ce3ITTZtrHrIL0AGfyo61w==} + engines: {node: ^12.20 || ^14.13.1 || >= 16} + peerDependencies: + svelte: '>=3.19.0' + + svelte-loader@3.2.4: + resolution: {integrity: sha512-e0HdDnkYH/MDx4/IfTSka5AOFg9yYJcPuoZJB5x0l60fkHjVjNvrrxr+rJegDG9J7ZymmdHt00/hdLw+QF299w==} + peerDependencies: + svelte: ^3.0.0 || ^4.0.0-next.0 || ^5.0.0-next.1 + svelte-preprocess@5.1.4: resolution: {integrity: sha512-IvnbQ6D6Ao3Gg6ftiM5tdbR6aAETwjhHV+UKGf5bHGYR69RQvF1ho0JKPcbUON4vy4R7zom13jPjgdOWCQ5hDA==} engines: {node: '>= 16.0.0'} @@ -4503,6 +4689,67 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@parcel/watcher-android-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-x64@2.5.1': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.1': + optional: true + + '@parcel/watcher-win32-arm64@2.5.1': + optional: true + + '@parcel/watcher-win32-ia32@2.5.1': + optional: true + + '@parcel/watcher-win32-x64@2.5.1': + optional: true + + '@parcel/watcher@2.5.1': + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.8 + node-addon-api: 7.1.1 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.1 + '@parcel/watcher-darwin-arm64': 2.5.1 + '@parcel/watcher-darwin-x64': 2.5.1 + '@parcel/watcher-freebsd-x64': 2.5.1 + '@parcel/watcher-linux-arm-glibc': 2.5.1 + '@parcel/watcher-linux-arm-musl': 2.5.1 + '@parcel/watcher-linux-arm64-glibc': 2.5.1 + '@parcel/watcher-linux-arm64-musl': 2.5.1 + '@parcel/watcher-linux-x64-glibc': 2.5.1 + '@parcel/watcher-linux-x64-musl': 2.5.1 + '@parcel/watcher-win32-arm64': 2.5.1 + '@parcel/watcher-win32-ia32': 2.5.1 + '@parcel/watcher-win32-x64': 2.5.1 + optional: true + '@protobufjs/aspromise@1.1.2': {} '@protobufjs/base64@1.1.2': {} @@ -4885,6 +5132,8 @@ snapshots: balanced-match@1.0.2: {} + big.js@5.2.2: {} + bignumber.js@9.3.1: {} binary-extensions@2.3.0: {} @@ -4969,6 +5218,10 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + ci-info@3.9.0: {} cjs-module-lexer@1.4.3: {} @@ -5075,6 +5328,9 @@ snapshots: detect-indent@6.1.0: {} + detect-libc@1.0.3: + optional: true + detect-newline@3.1.0: {} diff-sequences@29.6.3: {} @@ -5103,6 +5359,8 @@ snapshots: emoji-regex@8.0.0: {} + emojis-list@3.0.0: {} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 @@ -5663,6 +5921,8 @@ snapshots: ignore@5.3.2: {} + immutable@5.1.3: {} + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 @@ -6226,6 +6486,12 @@ snapshots: lines-and-columns@1.2.4: {} + loader-utils@2.0.4: + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 2.2.3 + locate-character@3.0.0: {} locate-path@5.0.0: @@ -6301,6 +6567,9 @@ snapshots: neo-async@2.6.2: {} + node-addon-api@7.1.1: + optional: true + node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 @@ -6499,6 +6768,8 @@ snapshots: dependencies: picomatch: 2.3.1 + readdirp@4.1.2: {} + reflect.getprototypeof@1.0.10: dependencies: call-bind: 1.0.8 @@ -6587,6 +6858,14 @@ snapshots: mkdirp: 0.5.6 rimraf: 2.7.1 + sass@1.93.2: + dependencies: + chokidar: 4.0.3 + immutable: 5.1.3 + source-map-js: 1.2.1 + optionalDependencies: + '@parcel/watcher': 2.5.1 + scule@1.3.0: {} semver@6.3.1: {} @@ -6742,7 +7021,20 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte-preprocess@5.1.4(@babel/core@7.28.4)(svelte@4.2.20)(typescript@5.9.3): + svelte-dev-helper@1.1.9: {} + + svelte-hmr@0.14.12(svelte@4.2.20): + dependencies: + svelte: 4.2.20 + + svelte-loader@3.2.4(svelte@4.2.20): + dependencies: + loader-utils: 2.0.4 + svelte: 4.2.20 + svelte-dev-helper: 1.1.9 + svelte-hmr: 0.14.12(svelte@4.2.20) + + svelte-preprocess@5.1.4(@babel/core@7.28.4)(sass@1.93.2)(svelte@4.2.20)(typescript@5.9.3): dependencies: '@types/pug': 2.0.10 detect-indent: 6.1.0 @@ -6752,6 +7044,7 @@ snapshots: svelte: 4.2.20 optionalDependencies: '@babel/core': 7.28.4 + sass: 1.93.2 typescript: 5.9.3 svelte2tsx@0.7.45(svelte@4.2.20)(typescript@5.9.3): diff --git a/common/scripts/package.json b/common/scripts/package.json index 9f10550ac1..6e9ec7d22c 100644 --- a/common/scripts/package.json +++ b/common/scripts/package.json @@ -5,7 +5,7 @@ "format": "echo \"No format specified\"" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.16", + "@hcengineering/platform-rig": "workspace:^0.7.17", "@typescript-eslint/eslint-plugin": "^6.21.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-promise": "^6.1.1", diff --git a/packages/measurements-otlp/package.json b/packages/measurements-otlp/package.json index 1764651662..045916b146 100644 --- a/packages/measurements-otlp/package.json +++ b/packages/measurements-otlp/package.json @@ -27,7 +27,7 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.16", + "@hcengineering/platform-rig": "workspace:^0.7.17", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5", diff --git a/packages/measurements/package.json b/packages/measurements/package.json index 83e47edaca..21d1751066 100644 --- a/packages/measurements/package.json +++ b/packages/measurements/package.json @@ -27,7 +27,7 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.16", + "@hcengineering/platform-rig": "workspace:^0.7.17", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5", diff --git a/packages/platform-rig/CHANGELOG.json b/packages/platform-rig/CHANGELOG.json index e6c110fd25..ef6895e454 100644 --- a/packages/platform-rig/CHANGELOG.json +++ b/packages/platform-rig/CHANGELOG.json @@ -1,6 +1,18 @@ { "name": "@hcengineering/platform-rig", "entries": [ + { + "version": "0.7.17", + "tag": "@hcengineering/platform-rig_v0.7.17", + "date": "Sun, 12 Oct 2025 03:31:47 GMT", + "comments": { + "patch": [ + { + "comment": "Fix svelte build" + } + ] + } + }, { "version": "0.7.16", "tag": "@hcengineering/platform-rig_v0.7.16", diff --git a/packages/platform-rig/CHANGELOG.md b/packages/platform-rig/CHANGELOG.md index 1eee7524a5..b0eb7db5e4 100644 --- a/packages/platform-rig/CHANGELOG.md +++ b/packages/platform-rig/CHANGELOG.md @@ -1,6 +1,13 @@ # Change Log - @hcengineering/platform-rig -This log was last generated on Sun, 12 Oct 2025 02:49:17 GMT and should not be manually modified. +This log was last generated on Sun, 12 Oct 2025 03:31:47 GMT and should not be manually modified. + +## 0.7.17 +Sun, 12 Oct 2025 03:31:47 GMT + +### Patches + +- Fix svelte build ## 0.7.16 Sun, 12 Oct 2025 02:49:17 GMT diff --git a/packages/platform-rig/bin/compile.js b/packages/platform-rig/bin/compile.js index a12563e5b8..281b979418 100755 --- a/packages/platform-rig/bin/compile.js +++ b/packages/platform-rig/bin/compile.js @@ -142,12 +142,15 @@ switch (args[0]) { collectFileStats('lib', before) collectFileStats('types', before) - Promise.all([performESBuildWithSvelte(filesToTranspile), validateTSC(), generateSvelteTypes()]).then(() => { - console.log('UI build time: ', Math.round((performance.now() - st) * 100) / 100) - collectFileStats('lib', after) - collectFileStats('types', after) - cleanNonModified(before, after) - }) + performESBuildWithSvelte(filesToTranspile) + .then(() => generateSvelteTypes()) + .then(() => validateTSC()) + .then(() => { + console.log('UI build time: ', Math.round((performance.now() - st) * 100) / 100) + collectFileStats('lib', after) + collectFileStats('types', after) + cleanNonModified(before, after) + }) break } case 'transpile': { @@ -218,6 +221,7 @@ async function performESBuildWithSvelte(filesToTranspile) { bundle: false, minify: false, outdir: 'lib', + outbase: 'src', keepNames: true, sourcemap: 'linked', allowOverwrite: true, @@ -243,6 +247,7 @@ async function performESBuildWithSvelte(filesToTranspile) { bundle: false, minify: false, outdir: 'lib', + outbase: 'src', outExtension: { '.js': '.svelte.js' }, keepNames: true, sourcemap: 'linked', @@ -304,6 +309,7 @@ async function generateSvelteTypes() { async function validateTSC(st) { const buildDir = '.validate' + const typesDir = join(process.cwd(), 'types') if (!existsSync(buildDir)) { mkdirSync(buildDir, { recursive: true }) @@ -321,11 +327,29 @@ async function validateTSC(st) { } const configFile = ts.readConfigFile(configPath, ts.sys.readFile) - const parsedConfig = ts.parseJsonConfigFileContent(configFile.config, ts.sys, process.cwd(), { + + // Prepare compiler options that include the types directory + const compilerOptionsOverride = { emitDeclarationOnly: true, incremental: true, tsBuildInfoFile: join(buildDir, 'tsBuildInfoFile.info') - }) + } + + // Add types directory to typeRoots if it exists + if (existsSync(typesDir)) { + compilerOptionsOverride.typeRoots = [ + ...(configFile.config.compilerOptions?.typeRoots || ['./node_modules/@types']), + typesDir + ] + } + + const parsedConfig = ts.parseJsonConfigFileContent(configFile.config, ts.sys, process.cwd(), compilerOptionsOverride) + + // Add generated Svelte type files to the file list + if (existsSync(typesDir)) { + const svelteTypeFiles = collectFiles(typesDir).filter((f) => f.endsWith('.svelte.d.ts')) + parsedConfig.fileNames.push(...svelteTypeFiles) + } // Create the TypeScript program const program = ts.createProgram({ diff --git a/packages/platform-rig/package.json b/packages/platform-rig/package.json index 8a01dd3072..e0c10f3aa8 100644 --- a/packages/platform-rig/package.json +++ b/packages/platform-rig/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/platform-rig", - "version": "0.7.16", + "version": "0.7.17", "scripts": { "build": "echo 'Not required'", "format": "echo 'Not required'" @@ -16,7 +16,7 @@ "esbuild-svelte": "^0.8.2", "svelte": "^4.2.20", "svelte-preprocess": "^5.1.3", - "svelte2tsx": "^0.7.25", + "svelte2tsx": "^0.7.45", "@typescript-eslint/eslint-plugin": "^6.21.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-promise": "^6.1.1", diff --git a/packages/postgres-base/package.json b/packages/postgres-base/package.json index 7b46b5b9fc..717705bcf4 100644 --- a/packages/postgres-base/package.json +++ b/packages/postgres-base/package.json @@ -28,7 +28,7 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.16", + "@hcengineering/platform-rig": "workspace:^0.7.17", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5", diff --git a/packages/ui-test/.eslintignore b/packages/ui-test/.eslintignore new file mode 100644 index 0000000000..8dc69cef22 --- /dev/null +++ b/packages/ui-test/.eslintignore @@ -0,0 +1,5 @@ +lib +types +dist +node_modules +.build diff --git a/packages/ui-test/.eslintrc.js b/packages/ui-test/.eslintrc.js new file mode 100644 index 0000000000..1ff9bc7c24 --- /dev/null +++ b/packages/ui-test/.eslintrc.js @@ -0,0 +1,8 @@ +module.exports = { + extends: ['./node_modules/@hcengineering/platform-rig/profiles/node/eslint.config.json'], + parserOptions: { + tsconfigRootDir: __dirname, + project: './tsconfig.json', + extraFileExtensions: ['.svelte'] + } +} diff --git a/packages/ui-test/.npmignore b/packages/ui-test/.npmignore new file mode 100644 index 0000000000..9b083cb0c4 --- /dev/null +++ b/packages/ui-test/.npmignore @@ -0,0 +1,8 @@ +* +!/lib/** +!/types/** +!/src/** +!CHANGELOG.md +/lib/**/__test__/ +/types/**/__test__/ +/src/**/__test__/ \ No newline at end of file diff --git a/packages/ui-test/config/rig.json b/packages/ui-test/config/rig.json new file mode 100644 index 0000000000..1a4b944f83 --- /dev/null +++ b/packages/ui-test/config/rig.json @@ -0,0 +1,5 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/rig-package/rig.schema.json", + "rigPackageName": "@hcengineering/platform-rig", + "rigProfile": "ui" +} diff --git a/packages/ui-test/jest.config.js b/packages/ui-test/jest.config.js new file mode 100644 index 0000000000..2cfd408b67 --- /dev/null +++ b/packages/ui-test/jest.config.js @@ -0,0 +1,7 @@ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', + testMatch: ['**/?(*.)+(spec|test).[jt]s?(x)'], + roots: ["./src"], + coverageReporters: ["text-summary", "html"] +} diff --git a/packages/ui-test/package.json b/packages/ui-test/package.json new file mode 100644 index 0000000000..ca9d53d921 --- /dev/null +++ b/packages/ui-test/package.json @@ -0,0 +1,59 @@ +{ + "name": "@hcengineering/ui-test", + "version": "0.7.12", + "author": "Copyright Ā© Hardcore Engineering Inc.", + "template": "@hcengineering/node-package", + "license": "EPL-2.0", + "main": "./lib/index.js", + "types": "./types/index.d.ts", + "files": [ + "lib", + "types", + "src", + "fonts", + "styles" + ], + "exports": { + ".": { + "types": "./types/index.d.ts", + "default": "./lib/index.js" + }, + "./lang/*": "./lang/*", + "./styles/*": "./styles/*" + }, + "scripts": { + "build": "compile ui", + "build:watch": "compile ui", + "test": "jest --passWithNoTests --silent --forceExit", + "format": "format src", + "_phase:build": "compile ui", + "_phase:test": "jest --passWithNoTests --silent --forceExit", + "_phase:format": "format src", + "_phase:validate": "compile validate" + }, + "devDependencies": { + "@hcengineering/platform-rig": "workspace:^0.7.17", + "svelte-loader": "^3.2.0", + "sass": "^1.53.0", + "svelte-preprocess": "^5.1.3", + "jest": "^29.7.0", + "ts-jest": "^29.1.1", + "@types/jest": "^29.5.5", + "@types/node": "^22.15.29", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", + "eslint": "^8.54.0", + "eslint-config-standard-with-typescript": "^40.0.0", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-n": "^15.4.0" + }, + "dependencies": { + "svelte": "^4.2.20" + }, + "repository": "https://github.com/hcengineering/huly.utils", + "publishConfig": { + "access": "public" + } +} diff --git a/packages/ui-test/postcss.config.js b/packages/ui-test/postcss.config.js new file mode 100644 index 0000000000..88752c6cb0 --- /dev/null +++ b/packages/ui-test/postcss.config.js @@ -0,0 +1,5 @@ +module.exports = { + plugins: [ + require('autoprefixer') + ] +} diff --git a/packages/ui-test/src/component/Test.svelte b/packages/ui-test/src/component/Test.svelte new file mode 100644 index 0000000000..7579eba4c2 --- /dev/null +++ b/packages/ui-test/src/component/Test.svelte @@ -0,0 +1,6 @@ + + +Test component +{variable} \ No newline at end of file diff --git a/packages/ui-test/src/index.ts b/packages/ui-test/src/index.ts new file mode 100644 index 0000000000..68e17b80c9 --- /dev/null +++ b/packages/ui-test/src/index.ts @@ -0,0 +1,4 @@ +import Test from './component/Test.svelte' +export { + Test +} diff --git a/packages/ui-test/src/svelte.d.ts_ b/packages/ui-test/src/svelte.d.ts_ new file mode 100644 index 0000000000..81cd9a1388 --- /dev/null +++ b/packages/ui-test/src/svelte.d.ts_ @@ -0,0 +1,4 @@ +declare module '*.svelte' { + import { SvelteComponentTyped } from 'svelte' + export default class extends SvelteComponentTyped {} +} diff --git a/packages/ui-test/svelte.config.js b/packages/ui-test/svelte.config.js new file mode 100644 index 0000000000..944a06f73e --- /dev/null +++ b/packages/ui-test/svelte.config.js @@ -0,0 +1,5 @@ +const sveltePreprocess = require('svelte-preprocess') + +module.exports = { + preprocess: sveltePreprocess() +}; \ No newline at end of file diff --git a/packages/ui-test/tsconfig.json b/packages/ui-test/tsconfig.json new file mode 100644 index 0000000000..d815a54801 --- /dev/null +++ b/packages/ui-test/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "./node_modules/@hcengineering/platform-rig/profiles/ui/tsconfig.json", + + "compilerOptions": { + "rootDir": "./src", + "outDir": "./lib", + "declarationDir": "./types", + "tsBuildInfoFile": ".build/build.tsbuildinfo" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "lib", "dist", "types", "bundle"] +} diff --git a/rush.json b/rush.json index 113e70aa26..4142d81375 100644 --- a/rush.json +++ b/rush.json @@ -355,6 +355,11 @@ "packageName": "@hcengineering/postgres-base", "projectFolder": "packages/postgres-base", "shouldPublish": true + }, + { + "packageName": "@hcengineering/ui-test", + "projectFolder": "packages/ui-test", + "shouldPublish": false } ] } From 4aed02095dafd486e2f5f246c3692706b2b179bf Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Sun, 12 Oct 2025 22:50:19 +0700 Subject: [PATCH 32/40] Fix log levels rename compile ui -> compile ui-esbuild --- common/config/rush/pnpm-lock.yaml | 10 +++++----- common/scripts/package.json | 2 +- packages/measurements-otlp/package.json | 2 +- packages/measurements/package.json | 2 +- packages/platform-rig/CHANGELOG.json | 12 ++++++++++++ packages/platform-rig/CHANGELOG.md | 9 ++++++++- packages/platform-rig/bin/compile.js | 19 ++++++------------- packages/platform-rig/package.json | 2 +- packages/postgres-base/package.json | 2 +- packages/ui-test/package.json | 2 +- 10 files changed, 37 insertions(+), 25 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 6f762d74cc..42653337ae 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -13,7 +13,7 @@ importers: ../../packages/measurements: devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.17 + specifier: workspace:^0.7.18 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 @@ -98,7 +98,7 @@ importers: version: 2.1.0(@opentelemetry/api@1.9.0) devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.17 + specifier: workspace:^0.7.18 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 @@ -192,7 +192,7 @@ importers: version: 3.4.7 devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.17 + specifier: workspace:^0.7.18 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 @@ -238,7 +238,7 @@ importers: version: 4.2.20 devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.17 + specifier: workspace:^0.7.18 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 @@ -289,7 +289,7 @@ importers: ../scripts: devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.17 + specifier: workspace:^0.7.18 version: link:../../packages/platform-rig '@typescript-eslint/eslint-plugin': specifier: ^6.21.0 diff --git a/common/scripts/package.json b/common/scripts/package.json index 6e9ec7d22c..863e10d9f7 100644 --- a/common/scripts/package.json +++ b/common/scripts/package.json @@ -5,7 +5,7 @@ "format": "echo \"No format specified\"" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.17", + "@hcengineering/platform-rig": "workspace:^0.7.18", "@typescript-eslint/eslint-plugin": "^6.21.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-promise": "^6.1.1", diff --git a/packages/measurements-otlp/package.json b/packages/measurements-otlp/package.json index 045916b146..4821527793 100644 --- a/packages/measurements-otlp/package.json +++ b/packages/measurements-otlp/package.json @@ -27,7 +27,7 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.17", + "@hcengineering/platform-rig": "workspace:^0.7.18", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5", diff --git a/packages/measurements/package.json b/packages/measurements/package.json index 21d1751066..820303ace8 100644 --- a/packages/measurements/package.json +++ b/packages/measurements/package.json @@ -27,7 +27,7 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.17", + "@hcengineering/platform-rig": "workspace:^0.7.18", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5", diff --git a/packages/platform-rig/CHANGELOG.json b/packages/platform-rig/CHANGELOG.json index ef6895e454..cdfe4a9712 100644 --- a/packages/platform-rig/CHANGELOG.json +++ b/packages/platform-rig/CHANGELOG.json @@ -1,6 +1,18 @@ { "name": "@hcengineering/platform-rig", "entries": [ + { + "version": "0.7.18", + "tag": "@hcengineering/platform-rig_v0.7.18", + "date": "Sun, 12 Oct 2025 15:50:41 GMT", + "comments": { + "patch": [ + { + "comment": "Revert compile ui do nothing" + } + ] + } + }, { "version": "0.7.17", "tag": "@hcengineering/platform-rig_v0.7.17", diff --git a/packages/platform-rig/CHANGELOG.md b/packages/platform-rig/CHANGELOG.md index b0eb7db5e4..bde8e14136 100644 --- a/packages/platform-rig/CHANGELOG.md +++ b/packages/platform-rig/CHANGELOG.md @@ -1,6 +1,13 @@ # Change Log - @hcengineering/platform-rig -This log was last generated on Sun, 12 Oct 2025 03:31:47 GMT and should not be manually modified. +This log was last generated on Sun, 12 Oct 2025 15:50:41 GMT and should not be manually modified. + +## 0.7.18 +Sun, 12 Oct 2025 15:50:41 GMT + +### Patches + +- Revert compile ui do nothing ## 0.7.17 Sun, 12 Oct 2025 03:31:47 GMT diff --git a/packages/platform-rig/bin/compile.js b/packages/platform-rig/bin/compile.js index 281b979418..2136c3620b 100755 --- a/packages/platform-rig/bin/compile.js +++ b/packages/platform-rig/bin/compile.js @@ -122,18 +122,12 @@ function collectFileStats(source, result) { } } -function cleanNonModified(before, after) { - for (const [k, v] of Object.entries(before)) { - if (after[k] === v) { - // Same modify date, looks like not modified - console.log('clean file', k) - rmSync(k) - } - } -} - switch (args[0]) { case 'ui': { + console.log('Nothing to compile to UI') + break + } + case 'ui-esbuild': { console.log('Building UI package with Svelte support...') let st = performance.now() const filesToTranspile = collectFiles(join(process.cwd(), 'src')) @@ -144,12 +138,10 @@ switch (args[0]) { performESBuildWithSvelte(filesToTranspile) .then(() => generateSvelteTypes()) - .then(() => validateTSC()) .then(() => { console.log('UI build time: ', Math.round((performance.now() - st) * 100) / 100) collectFileStats('lib', after) collectFileStats('types', after) - cleanNonModified(before, after) }) break } @@ -163,7 +155,6 @@ switch (args[0]) { performESBuild(filesToTranspile).then(() => { console.log('Transpile time: ', Math.round((performance.now() - st) * 100) / 100) collectFileStats('lib', after) - cleanNonModified(before, after) }) break } @@ -223,6 +214,7 @@ async function performESBuildWithSvelte(filesToTranspile) { outdir: 'lib', outbase: 'src', keepNames: true, + logLevel: 'error', sourcemap: 'linked', allowOverwrite: true, format: 'cjs', @@ -251,6 +243,7 @@ async function performESBuildWithSvelte(filesToTranspile) { outExtension: { '.js': '.svelte.js' }, keepNames: true, sourcemap: 'linked', + logLevel: 'error', allowOverwrite: true, format: 'cjs', color: true, diff --git a/packages/platform-rig/package.json b/packages/platform-rig/package.json index e0c10f3aa8..04fab8a50a 100644 --- a/packages/platform-rig/package.json +++ b/packages/platform-rig/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/platform-rig", - "version": "0.7.17", + "version": "0.7.18", "scripts": { "build": "echo 'Not required'", "format": "echo 'Not required'" diff --git a/packages/postgres-base/package.json b/packages/postgres-base/package.json index 717705bcf4..da33374f69 100644 --- a/packages/postgres-base/package.json +++ b/packages/postgres-base/package.json @@ -28,7 +28,7 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.17", + "@hcengineering/platform-rig": "workspace:^0.7.18", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5", diff --git a/packages/ui-test/package.json b/packages/ui-test/package.json index ca9d53d921..4f2f9366df 100644 --- a/packages/ui-test/package.json +++ b/packages/ui-test/package.json @@ -32,7 +32,7 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.17", + "@hcengineering/platform-rig": "workspace:^0.7.18", "svelte-loader": "^3.2.0", "sass": "^1.53.0", "svelte-preprocess": "^5.1.3", From 9157f803cf18d49a5fa08be6fd7875efcb99cf3f Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Sun, 12 Oct 2025 22:52:52 +0700 Subject: [PATCH 33/40] Fix build --- packages/ui-test/package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/ui-test/package.json b/packages/ui-test/package.json index 4f2f9366df..ec63fa38b4 100644 --- a/packages/ui-test/package.json +++ b/packages/ui-test/package.json @@ -22,11 +22,11 @@ "./styles/*": "./styles/*" }, "scripts": { - "build": "compile ui", - "build:watch": "compile ui", + "build": "compile ui-esbuild", + "build:watch": "compile ui-esbuild", "test": "jest --passWithNoTests --silent --forceExit", "format": "format src", - "_phase:build": "compile ui", + "_phase:build": "compile ui-esbuild", "_phase:test": "jest --passWithNoTests --silent --forceExit", "_phase:format": "format src", "_phase:validate": "compile validate" From cbf55729024ae63af68c6b8601a87600abb141db Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Sun, 12 Oct 2025 23:42:55 +0700 Subject: [PATCH 34/40] Bump esbuild svelte version --- common/config/rush/pnpm-lock.yaml | 18 +++++++++--------- packages/platform-rig/package.json | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 42653337ae..fde01456b1 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -149,8 +149,8 @@ importers: specifier: ^2.1.1 version: 2.1.1(esbuild@0.25.10) esbuild-svelte: - specifier: ^0.8.2 - version: 0.8.2(esbuild@0.25.10)(svelte@4.2.20) + specifier: ^0.9.3 + version: 0.9.3(esbuild@0.25.10)(svelte@4.2.20) eslint: specifier: ^8.54.0 version: 8.57.1 @@ -176,7 +176,7 @@ importers: specifier: ^4.2.20 version: 4.2.20 svelte-preprocess: - specifier: ^5.1.3 + specifier: ^5.1.4 version: 5.1.4(@babel/core@7.28.4)(sass@1.93.2)(svelte@4.2.20)(typescript@5.9.3) svelte2tsx: specifier: ^0.7.45 @@ -1930,12 +1930,12 @@ packages: peerDependencies: esbuild: '>= 0.14.0' - esbuild-svelte@0.8.2: - resolution: {integrity: sha512-tG97WrhH/OH8wFCmRBk6sRggMVMPNZDktGx1jJcvh9Obvjwm8M1UYoXmliuLL+4fs/wfyVVwM2fvyNYz2e6UPQ==} - engines: {node: '>=14'} + esbuild-svelte@0.9.3: + resolution: {integrity: sha512-CgEcGY1r/d16+aggec3czoFBEBaYIrFOnMxpsO6fWNaNEqHregPN5DLAPZDqrL7rXDNplW+WMu8s3GMq9FqgJA==} + engines: {node: '>=18'} peerDependencies: - esbuild: '>=0.9.6' - svelte: '>=3.43.0 <6 || ^5.0.0-next.0' + esbuild: '>=0.17.0' + svelte: '>=4.2.1 <6' esbuild@0.25.10: resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} @@ -5457,7 +5457,7 @@ snapshots: fs-extra: 10.1.0 globby: 11.1.0 - esbuild-svelte@0.8.2(esbuild@0.25.10)(svelte@4.2.20): + esbuild-svelte@0.9.3(esbuild@0.25.10)(svelte@4.2.20): dependencies: '@jridgewell/trace-mapping': 0.3.30 esbuild: 0.25.10 diff --git a/packages/platform-rig/package.json b/packages/platform-rig/package.json index 04fab8a50a..36b0b2dba8 100644 --- a/packages/platform-rig/package.json +++ b/packages/platform-rig/package.json @@ -13,9 +13,9 @@ "typescript": "^5.9.3", "esbuild": "^0.25.10", "esbuild-plugin-copy": "^2.1.1", - "esbuild-svelte": "^0.8.2", + "esbuild-svelte": "^0.9.3", "svelte": "^4.2.20", - "svelte-preprocess": "^5.1.3", + "svelte-preprocess": "^5.1.4", "svelte2tsx": "^0.7.45", "@typescript-eslint/eslint-plugin": "^6.21.0", "eslint-plugin-import": "^2.26.0", From 63bb7b229ea2a21262466b70cbbfde21be0b6137 Mon Sep 17 00:00:00 2001 From: Alexey Zinoviev Date: Mon, 13 Oct 2025 14:13:29 +0400 Subject: [PATCH 35/40] Chore: use fixed versions in update-deps Signed-off-by: Alexey Zinoviev --- .nvmrc | 1 + packages/platform-rig/bin/update-deps.js | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 .nvmrc diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000000..53d1c14db3 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +v22 diff --git a/packages/platform-rig/bin/update-deps.js b/packages/platform-rig/bin/update-deps.js index 1db163629b..b509df3b5f 100755 --- a/packages/platform-rig/bin/update-deps.js +++ b/packages/platform-rig/bin/update-deps.js @@ -160,8 +160,8 @@ async function updatePackageDependencies(project, latestVersions, dryRun = false } if (isNewerVersion(currentVersion, latestVersion)) { - const prefix = currentVersion.match(/^[\^~]/)?.[0] || '^' - const newVersion = `${prefix}${latestVersion}` + // Use fixed version without ^ prefix for hcengineering packages + const newVersion = latestVersion changes.push({ depType, From c6663d2e38759b0805d9828aec0f7c6c03c3bdcb Mon Sep 17 00:00:00 2001 From: Alexey Zinoviev Date: Mon, 13 Oct 2025 14:48:39 +0400 Subject: [PATCH 36/40] Chore: commit changes Signed-off-by: Alexey Zinoviev --- .../chore-fixed-update-deps_2025-10-13-10-32.json | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 common/changes/@hcengineering/platform-rig/chore-fixed-update-deps_2025-10-13-10-32.json diff --git a/common/changes/@hcengineering/platform-rig/chore-fixed-update-deps_2025-10-13-10-32.json b/common/changes/@hcengineering/platform-rig/chore-fixed-update-deps_2025-10-13-10-32.json new file mode 100644 index 0000000000..c5e85bccbe --- /dev/null +++ b/common/changes/@hcengineering/platform-rig/chore-fixed-update-deps_2025-10-13-10-32.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@hcengineering/platform-rig", + "comment": "use fixed versions when upgrading hcengineering deps", + "type": "patch" + } + ], + "packageName": "@hcengineering/platform-rig" +} \ No newline at end of file From 611ebeb3e44eda740b921f28dda07c8d90073468 Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Tue, 14 Oct 2025 10:00:26 +0700 Subject: [PATCH 37/40] Prevent metrics zero values in measure + Fix format svelte files --- common/config/rush/pnpm-lock.yaml | 188 ++++++++++++++++++++- packages/measurements/src/metrics.ts | 8 +- packages/platform-rig/bin/format.js | 28 ++- packages/platform-rig/package.json | 4 +- packages/ui-test/.eslintrc.js | 2 +- packages/ui-test/src/component/Test.svelte | 4 +- packages/ui-test/src/index.ts | 4 +- 7 files changed, 221 insertions(+), 17 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index fde01456b1..63d1218488 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -166,18 +166,24 @@ importers: eslint-plugin-promise: specifier: ^6.1.1 version: 6.6.0(eslint@8.57.1) + eslint-plugin-svelte: + specifier: ^2.35.1 + version: 2.46.1(eslint@8.57.1)(svelte@4.2.20) prettier: specifier: ^3.6.2 version: 3.6.2 prettier-plugin-svelte: - specifier: ^3.4.0 + specifier: ^3.2.0 version: 3.4.0(prettier@3.6.2)(svelte@4.2.20) svelte: specifier: ^4.2.20 version: 4.2.20 + svelte-eslint-parser: + specifier: ^0.33.1 + version: 0.33.1(svelte@4.2.20) svelte-preprocess: specifier: ^5.1.4 - version: 5.1.4(@babel/core@7.28.4)(sass@1.93.2)(svelte@4.2.20)(typescript@5.9.3) + version: 5.1.4(@babel/core@7.28.4)(postcss-load-config@3.1.4(postcss@8.5.6))(postcss@8.5.6)(sass@1.93.2)(svelte@4.2.20)(typescript@5.9.3) svelte2tsx: specifier: ^0.7.45 version: 0.7.45(svelte@4.2.20)(typescript@5.9.3) @@ -281,7 +287,7 @@ importers: version: 3.2.4(svelte@4.2.20) svelte-preprocess: specifier: ^5.1.3 - version: 5.1.4(@babel/core@7.28.4)(sass@1.93.2)(svelte@4.2.20)(typescript@5.9.3) + version: 5.1.4(@babel/core@7.28.4)(postcss-load-config@3.1.4(postcss@8.5.6))(postcss@8.5.6)(sass@1.93.2)(svelte@4.2.20)(typescript@5.9.3) ts-jest: specifier: ^29.1.1 version: 29.4.1(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest-util@29.7.0)(jest@29.7.0(@types/node@22.18.1))(typescript@5.9.3) @@ -1794,6 +1800,11 @@ packages: resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + data-view-buffer@1.0.2: resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} @@ -1954,6 +1965,12 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} + eslint-compat-utils@0.5.1: + resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} + engines: {node: '>=12'} + peerDependencies: + eslint: '>=6.0.0' + eslint-config-standard-with-typescript@40.0.0: resolution: {integrity: sha512-GXUJcwIXiTQaS3H4etv8a1lejVVdZYaxZNz3g7vt6GoJosQqMTurbmSC4FVGyHiGT/d1TjFr3+47A3xsHhsG+Q==} deprecated: Please use eslint-config-love, instead. @@ -2022,6 +2039,16 @@ packages: peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + eslint-plugin-svelte@2.46.1: + resolution: {integrity: sha512-7xYr2o4NID/f9OEYMqxsEQsCsj4KaMy4q5sANaKkAb6/QeCjYFxRmDm2S3YC3A3pl1kyPZ/syOx/i7LcWYSbIw==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0-0 || ^9.0.0-0 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + svelte: + optional: true + eslint-scope@7.2.2: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2658,6 +2685,9 @@ packages: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} + known-css-properties@0.35.0: + resolution: {integrity: sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==} + leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} @@ -2666,6 +2696,10 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -2758,6 +2792,11 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -2909,6 +2948,38 @@ packages: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} + postcss-load-config@3.1.4: + resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} + engines: {node: '>= 10'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-safe-parser@6.0.0: + resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.3.3 + + postcss-scss@4.0.9: + resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.4.29 + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + postgres-array@2.0.0: resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} engines: {node: '>=4'} @@ -3198,6 +3269,24 @@ packages: svelte-dev-helper@1.1.9: resolution: {integrity: sha512-oU+Xv7Dl4kRU2kdFjsoPLfJfnt5hUhsFUZtuzI3Ku/f2iAFZqBoEuXOqK3N9ngD4dxQOmN4OKWPHVi3NeAeAfQ==} + svelte-eslint-parser@0.33.1: + resolution: {integrity: sha512-vo7xPGTlKBGdLH8T5L64FipvTrqv3OQRx9d2z5X05KKZDlF4rQk8KViZO4flKERY+5BiVdOh7zZ7JGJWo5P0uA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + svelte: ^3.37.0 || ^4.0.0 + peerDependenciesMeta: + svelte: + optional: true + + svelte-eslint-parser@0.43.0: + resolution: {integrity: sha512-GpU52uPKKcVnh8tKN5P4UZpJ/fUDndmq7wfsvoVXsyP+aY0anol7Yqo01fyrlaWGMFfm4av5DyrjlaXdLRJvGA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + svelte: + optional: true + svelte-hmr@0.14.12: resolution: {integrity: sha512-4QSW/VvXuqVcFZ+RhxiR8/newmwOCTlbYIezvkeN6302YFRE8cXy0naamHcjz8Y9Ce3ITTZtrHrIL0AGfyo61w==} engines: {node: ^12.20 || ^14.13.1 || >= 16} @@ -3375,6 +3464,9 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + uuid@9.0.1: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} hasBin: true @@ -3442,6 +3534,10 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} @@ -5280,6 +5376,8 @@ snapshots: mdn-data: 2.0.30 source-map-js: 1.2.1 + cssesc@3.0.0: {} + data-view-buffer@1.0.2: dependencies: call-bound: 1.0.4 @@ -5498,6 +5596,11 @@ snapshots: escape-string-regexp@4.0.0: {} + eslint-compat-utils@0.5.1(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + semver: 7.7.2 + eslint-config-standard-with-typescript@40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.3): dependencies: '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) @@ -5591,6 +5694,25 @@ snapshots: dependencies: eslint: 8.57.1 + eslint-plugin-svelte@2.46.1(eslint@8.57.1)(svelte@4.2.20): + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) + '@jridgewell/sourcemap-codec': 1.5.5 + eslint: 8.57.1 + eslint-compat-utils: 0.5.1(eslint@8.57.1) + esutils: 2.0.3 + known-css-properties: 0.35.0 + postcss: 8.5.6 + postcss-load-config: 3.1.4(postcss@8.5.6) + postcss-safe-parser: 6.0.0(postcss@8.5.6) + postcss-selector-parser: 6.1.2 + semver: 7.7.2 + svelte-eslint-parser: 0.43.0(svelte@4.2.20) + optionalDependencies: + svelte: 4.2.20 + transitivePeerDependencies: + - ts-node + eslint-scope@7.2.2: dependencies: esrecurse: 4.3.0 @@ -6477,6 +6599,8 @@ snapshots: kleur@3.0.3: {} + known-css-properties@0.35.0: {} + leven@3.1.0: {} levn@0.4.1: @@ -6484,6 +6608,8 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + lilconfig@2.1.0: {} + lines-and-columns@1.2.4: {} loader-utils@2.0.4: @@ -6563,6 +6689,8 @@ snapshots: ms@2.1.3: {} + nanoid@3.3.11: {} + natural-compare@1.4.0: {} neo-async@2.6.2: {} @@ -6709,6 +6837,32 @@ snapshots: possible-typed-array-names@1.1.0: {} + postcss-load-config@3.1.4(postcss@8.5.6): + dependencies: + lilconfig: 2.1.0 + yaml: 1.10.2 + optionalDependencies: + postcss: 8.5.6 + + postcss-safe-parser@6.0.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-scss@4.0.9(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + postgres-array@2.0.0: {} postgres-bytea@1.0.0: {} @@ -7023,6 +7177,26 @@ snapshots: svelte-dev-helper@1.1.9: {} + svelte-eslint-parser@0.33.1(svelte@4.2.20): + dependencies: + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + postcss: 8.5.6 + postcss-scss: 4.0.9(postcss@8.5.6) + optionalDependencies: + svelte: 4.2.20 + + svelte-eslint-parser@0.43.0(svelte@4.2.20): + dependencies: + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + postcss: 8.5.6 + postcss-scss: 4.0.9(postcss@8.5.6) + optionalDependencies: + svelte: 4.2.20 + svelte-hmr@0.14.12(svelte@4.2.20): dependencies: svelte: 4.2.20 @@ -7034,7 +7208,7 @@ snapshots: svelte-dev-helper: 1.1.9 svelte-hmr: 0.14.12(svelte@4.2.20) - svelte-preprocess@5.1.4(@babel/core@7.28.4)(sass@1.93.2)(svelte@4.2.20)(typescript@5.9.3): + svelte-preprocess@5.1.4(@babel/core@7.28.4)(postcss-load-config@3.1.4(postcss@8.5.6))(postcss@8.5.6)(sass@1.93.2)(svelte@4.2.20)(typescript@5.9.3): dependencies: '@types/pug': 2.0.10 detect-indent: 6.1.0 @@ -7044,6 +7218,8 @@ snapshots: svelte: 4.2.20 optionalDependencies: '@babel/core': 7.28.4 + postcss: 8.5.6 + postcss-load-config: 3.1.4(postcss@8.5.6) sass: 1.93.2 typescript: 5.9.3 @@ -7189,6 +7365,8 @@ snapshots: dependencies: punycode: 2.3.1 + util-deprecate@1.0.2: {} + uuid@9.0.1: {} v8-to-istanbul@9.3.0: @@ -7276,6 +7454,8 @@ snapshots: yallist@3.1.1: {} + yaml@1.10.2: {} + yargs-parser@21.1.1: {} yargs@17.7.2: diff --git a/packages/measurements/src/metrics.ts b/packages/measurements/src/metrics.ts index 55b23fc318..695dc0372a 100644 --- a/packages/measurements/src/metrics.ts +++ b/packages/measurements/src/metrics.ts @@ -101,7 +101,13 @@ export function updateMeasure ( params[vKey] = param } if (override === true) { - param.operations = value ?? ed - st + if (value === 0) { + // We need to delete value, to preserve sending zero values. + // eslint-disable-next-line @typescript-eslint/no-dynamic-delete + delete params[vKey] + } else { + param.operations = value ?? ed - st + } } else { param.value += value ?? ed - st param.operations++ diff --git a/packages/platform-rig/bin/format.js b/packages/platform-rig/bin/format.js index e6ae1254e0..6b896cc90e 100755 --- a/packages/platform-rig/bin/format.js +++ b/packages/platform-rig/bin/format.js @@ -14,6 +14,13 @@ const crypto = require('crypto') const prettier = require('prettier') const { ESLint } = require('eslint') +let pluginSvelte +try { + pluginSvelte = require('prettier-plugin-svelte') +} catch (e) { + console.warn('prettier-plugin-svelte not available') +} + if (!existsSync('.format')) { mkdirSync('.format', { recursive: true }) } @@ -102,15 +109,26 @@ if (filesToCheck.length > 0) { for (const file of filesToCheck) { try { - const options = await prettier.resolveConfig(file) + let options = await prettier.resolveConfig(file) const fileInfo = await prettier.getFileInfo(file) if (!fileInfo.ignored) { const input = readFileSync(file, 'utf8') - const formatted = await prettier.format(input, { - ...options, - filepath: file - }) + + // Build prettier options - remove plugins from config to avoid resolution issues + const prettierOptions = { + ...(options || {}), + filepath: file, + plugins: [] // Clear any plugins from config + } + + // Add svelte plugin directly if available and file is .svelte + if (pluginSvelte && file.endsWith('.svelte')) { + prettierOptions.plugins = [pluginSvelte] + prettierOptions.parser = 'svelte' + } + + const formatted = await prettier.format(input, prettierOptions) if (input !== formatted) { writeFileSync(file, formatted, 'utf8') diff --git a/packages/platform-rig/package.json b/packages/platform-rig/package.json index 36b0b2dba8..cc68ccd761 100644 --- a/packages/platform-rig/package.json +++ b/packages/platform-rig/package.json @@ -25,7 +25,9 @@ "@typescript-eslint/parser": "^6.21.0", "eslint-config-standard-with-typescript": "^40.0.0", "prettier": "^3.6.2", - "prettier-plugin-svelte": "^3.4.0" + "prettier-plugin-svelte": "^3.2.0", + "svelte-eslint-parser": "^0.33.1", + "eslint-plugin-svelte": "^2.35.1" }, "bin": { "format": "./bin/format.js", diff --git a/packages/ui-test/.eslintrc.js b/packages/ui-test/.eslintrc.js index 1ff9bc7c24..aef5965cab 100644 --- a/packages/ui-test/.eslintrc.js +++ b/packages/ui-test/.eslintrc.js @@ -1,5 +1,5 @@ module.exports = { - extends: ['./node_modules/@hcengineering/platform-rig/profiles/node/eslint.config.json'], + extends: ['./node_modules/@hcengineering/platform-rig/profiles/ui/eslint.config.json'], parserOptions: { tsconfigRootDir: __dirname, project: './tsconfig.json', diff --git a/packages/ui-test/src/component/Test.svelte b/packages/ui-test/src/component/Test.svelte index 7579eba4c2..762ffd17f4 100644 --- a/packages/ui-test/src/component/Test.svelte +++ b/packages/ui-test/src/component/Test.svelte @@ -1,6 +1,6 @@ - Test component -{variable} \ No newline at end of file +{variable} diff --git a/packages/ui-test/src/index.ts b/packages/ui-test/src/index.ts index 68e17b80c9..9635092d52 100644 --- a/packages/ui-test/src/index.ts +++ b/packages/ui-test/src/index.ts @@ -1,4 +1,2 @@ import Test from './component/Test.svelte' -export { - Test -} +export { Test } From 955ed4846d9ae58ff914f16db3339e3083ab6bb1 Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Tue, 14 Oct 2025 10:01:50 +0700 Subject: [PATCH 38/40] Revert update-deps script logic --- packages/platform-rig/bin/update-deps.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/platform-rig/bin/update-deps.js b/packages/platform-rig/bin/update-deps.js index b509df3b5f..1db163629b 100755 --- a/packages/platform-rig/bin/update-deps.js +++ b/packages/platform-rig/bin/update-deps.js @@ -160,8 +160,8 @@ async function updatePackageDependencies(project, latestVersions, dryRun = false } if (isNewerVersion(currentVersion, latestVersion)) { - // Use fixed version without ^ prefix for hcengineering packages - const newVersion = latestVersion + const prefix = currentVersion.match(/^[\^~]/)?.[0] || '^' + const newVersion = `${prefix}${latestVersion}` changes.push({ depType, From 00bc9ced410e0c23c1ec2aef81d88a7a6840c41f Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Tue, 14 Oct 2025 10:02:59 +0700 Subject: [PATCH 39/40] v0.7.19 --- ...hore-fixed-update-deps_2025-10-13-10-32.json | 10 ---------- common/config/rush/pnpm-lock.yaml | 12 ++++++------ common/scripts/package.json | 2 +- packages/measurements-otlp/package.json | 4 ++-- packages/measurements/CHANGELOG.json | 17 +++++++++++++++++ packages/measurements/CHANGELOG.md | 9 ++++++++- packages/measurements/package.json | 4 ++-- packages/platform-rig/CHANGELOG.json | 15 +++++++++++++++ packages/platform-rig/CHANGELOG.md | 10 +++++++++- packages/platform-rig/package.json | 2 +- packages/postgres-base/package.json | 2 +- packages/ui-test/package.json | 2 +- 12 files changed, 63 insertions(+), 26 deletions(-) delete mode 100644 common/changes/@hcengineering/platform-rig/chore-fixed-update-deps_2025-10-13-10-32.json diff --git a/common/changes/@hcengineering/platform-rig/chore-fixed-update-deps_2025-10-13-10-32.json b/common/changes/@hcengineering/platform-rig/chore-fixed-update-deps_2025-10-13-10-32.json deleted file mode 100644 index c5e85bccbe..0000000000 --- a/common/changes/@hcengineering/platform-rig/chore-fixed-update-deps_2025-10-13-10-32.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "changes": [ - { - "packageName": "@hcengineering/platform-rig", - "comment": "use fixed versions when upgrading hcengineering deps", - "type": "patch" - } - ], - "packageName": "@hcengineering/platform-rig" -} \ No newline at end of file diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 63d1218488..5fce7a5a22 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -13,7 +13,7 @@ importers: ../../packages/measurements: devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.18 + specifier: workspace:^0.7.19 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 @@ -52,7 +52,7 @@ importers: ../../packages/measurements-otlp: dependencies: '@hcengineering/measurements': - specifier: workspace:^0.7.12 + specifier: workspace:^0.7.13 version: link:../measurements '@opentelemetry/api': specifier: ^1.9.0 @@ -98,7 +98,7 @@ importers: version: 2.1.0(@opentelemetry/api@1.9.0) devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.18 + specifier: workspace:^0.7.19 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 @@ -198,7 +198,7 @@ importers: version: 3.4.7 devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.18 + specifier: workspace:^0.7.19 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 @@ -244,7 +244,7 @@ importers: version: 4.2.20 devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.18 + specifier: workspace:^0.7.19 version: link:../platform-rig '@types/jest': specifier: ^29.5.5 @@ -295,7 +295,7 @@ importers: ../scripts: devDependencies: '@hcengineering/platform-rig': - specifier: workspace:^0.7.18 + specifier: workspace:^0.7.19 version: link:../../packages/platform-rig '@typescript-eslint/eslint-plugin': specifier: ^6.21.0 diff --git a/common/scripts/package.json b/common/scripts/package.json index 863e10d9f7..d01107f829 100644 --- a/common/scripts/package.json +++ b/common/scripts/package.json @@ -5,7 +5,7 @@ "format": "echo \"No format specified\"" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.18", + "@hcengineering/platform-rig": "workspace:^0.7.19", "@typescript-eslint/eslint-plugin": "^6.21.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-promise": "^6.1.1", diff --git a/packages/measurements-otlp/package.json b/packages/measurements-otlp/package.json index 4821527793..6d22efb276 100644 --- a/packages/measurements-otlp/package.json +++ b/packages/measurements-otlp/package.json @@ -27,7 +27,7 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.18", + "@hcengineering/platform-rig": "workspace:^0.7.19", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5", @@ -41,7 +41,7 @@ "eslint-plugin-n": "^15.4.0" }, "dependencies": { - "@hcengineering/measurements": "workspace:^0.7.12", + "@hcengineering/measurements": "workspace:^0.7.13", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-logs": "^0.203.0", "@opentelemetry/auto-instrumentations-node": "^0.62.0", diff --git a/packages/measurements/CHANGELOG.json b/packages/measurements/CHANGELOG.json index 75d261f4f4..5204586b73 100644 --- a/packages/measurements/CHANGELOG.json +++ b/packages/measurements/CHANGELOG.json @@ -1,6 +1,23 @@ { "name": "@hcengineering/measurements", "entries": [ + { + "version": "0.7.13", + "tag": "@hcengineering/measurements_v0.7.13", + "date": "Tue, 14 Oct 2025 03:02:36 GMT", + "comments": { + "patch": [ + { + "comment": "Remove zero value measure with override values" + } + ], + "dependency": [ + { + "comment": "Updating dependency \"@hcengineering/platform-rig\" from `^0.7.18` to `0.7.19`" + } + ] + } + }, { "version": "0.7.12", "tag": "@hcengineering/measurements_v0.7.12", diff --git a/packages/measurements/CHANGELOG.md b/packages/measurements/CHANGELOG.md index 0e5ac8f513..f3e8679861 100644 --- a/packages/measurements/CHANGELOG.md +++ b/packages/measurements/CHANGELOG.md @@ -1,6 +1,13 @@ # Change Log - @hcengineering/measurements -This log was last generated on Sat, 11 Oct 2025 19:18:56 GMT and should not be manually modified. +This log was last generated on Tue, 14 Oct 2025 03:02:36 GMT and should not be manually modified. + +## 0.7.13 +Tue, 14 Oct 2025 03:02:36 GMT + +### Patches + +- Remove zero value measure with override values ## 0.7.12 Sat, 11 Oct 2025 19:18:56 GMT diff --git a/packages/measurements/package.json b/packages/measurements/package.json index 820303ace8..12d858a48d 100644 --- a/packages/measurements/package.json +++ b/packages/measurements/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/measurements", - "version": "0.7.12", + "version": "0.7.13", "main": "lib/index.js", "svelte": "src/index.ts", "types": "types/index.d.ts", @@ -27,7 +27,7 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.18", + "@hcengineering/platform-rig": "workspace:^0.7.19", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5", diff --git a/packages/platform-rig/CHANGELOG.json b/packages/platform-rig/CHANGELOG.json index cdfe4a9712..2050f049e5 100644 --- a/packages/platform-rig/CHANGELOG.json +++ b/packages/platform-rig/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@hcengineering/platform-rig", "entries": [ + { + "version": "0.7.19", + "tag": "@hcengineering/platform-rig_v0.7.19", + "date": "Tue, 14 Oct 2025 03:02:36 GMT", + "comments": { + "patch": [ + { + "comment": "use fixed versions when upgrading hcengineering deps" + }, + { + "comment": "Revert update-deps script and fix svelte format logic" + } + ] + } + }, { "version": "0.7.18", "tag": "@hcengineering/platform-rig_v0.7.18", diff --git a/packages/platform-rig/CHANGELOG.md b/packages/platform-rig/CHANGELOG.md index bde8e14136..2951bf64fe 100644 --- a/packages/platform-rig/CHANGELOG.md +++ b/packages/platform-rig/CHANGELOG.md @@ -1,6 +1,14 @@ # Change Log - @hcengineering/platform-rig -This log was last generated on Sun, 12 Oct 2025 15:50:41 GMT and should not be manually modified. +This log was last generated on Tue, 14 Oct 2025 03:02:36 GMT and should not be manually modified. + +## 0.7.19 +Tue, 14 Oct 2025 03:02:36 GMT + +### Patches + +- use fixed versions when upgrading hcengineering deps +- Revert update-deps script and fix svelte format logic ## 0.7.18 Sun, 12 Oct 2025 15:50:41 GMT diff --git a/packages/platform-rig/package.json b/packages/platform-rig/package.json index cc68ccd761..5f37fabd3f 100644 --- a/packages/platform-rig/package.json +++ b/packages/platform-rig/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/platform-rig", - "version": "0.7.18", + "version": "0.7.19", "scripts": { "build": "echo 'Not required'", "format": "echo 'Not required'" diff --git a/packages/postgres-base/package.json b/packages/postgres-base/package.json index da33374f69..0ea5a2602a 100644 --- a/packages/postgres-base/package.json +++ b/packages/postgres-base/package.json @@ -28,7 +28,7 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.18", + "@hcengineering/platform-rig": "workspace:^0.7.19", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5", diff --git a/packages/ui-test/package.json b/packages/ui-test/package.json index ec63fa38b4..99885e2989 100644 --- a/packages/ui-test/package.json +++ b/packages/ui-test/package.json @@ -32,7 +32,7 @@ "_phase:validate": "compile validate" }, "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.18", + "@hcengineering/platform-rig": "workspace:^0.7.19", "svelte-loader": "^3.2.0", "sass": "^1.53.0", "svelte-preprocess": "^5.1.3", From 063b52c1cac395319e99d017986c35abe6b79deb Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Thu, 16 Oct 2025 00:52:37 +0700 Subject: [PATCH 40/40] Move packages to huly.core --- README.md | 6 +- common/config/rush/pnpm-lock.yaml | 1748 ----------------- packages/measurements-otlp/.eslintrc.js | 7 - packages/measurements-otlp/.npmignore | 8 - packages/measurements-otlp/CHANGELOG.json | 62 - packages/measurements-otlp/CHANGELOG.md | 23 - packages/measurements-otlp/config/rig.json | 4 - packages/measurements-otlp/jest.config.js | 7 - packages/measurements-otlp/package.json | 71 - .../src/__tests__/telemetry.test.ts | 451 ----- packages/measurements-otlp/src/index.ts | 1 - packages/measurements-otlp/src/telemetry.ts | 632 ------ packages/measurements-otlp/tsconfig.json | 12 - packages/measurements/.eslintrc.js | 7 - packages/measurements/.npmignore | 8 - packages/measurements/CHANGELOG.json | 73 - packages/measurements/CHANGELOG.md | 30 - packages/measurements/config/rig.json | 4 - packages/measurements/jest.config.js | 7 - packages/measurements/package.json | 54 - .../src/__tests__/context.test.ts | 467 ----- .../measurements/src/__tests__/index.test.ts | 47 - .../src/__tests__/metrics.test.ts | 297 --- .../src/__tests__/performance.test.ts | 260 --- packages/measurements/src/context.ts | 386 ---- packages/measurements/src/index.ts | 13 - packages/measurements/src/metrics.ts | 343 ---- packages/measurements/src/types.ts | 132 -- packages/measurements/tsconfig.json | 12 - packages/postgres-base/.eslintrc.js | 7 - packages/postgres-base/.npmignore | 8 - packages/postgres-base/CHANGELOG.json | 51 - packages/postgres-base/CHANGELOG.md | 23 - packages/postgres-base/config/rig.json | 5 - packages/postgres-base/jest.config.js | 7 - packages/postgres-base/package.json | 59 - packages/postgres-base/src/index.ts | 439 ----- packages/postgres-base/tsconfig.json | 12 - rush.json | 15 - 39 files changed, 2 insertions(+), 5796 deletions(-) delete mode 100644 packages/measurements-otlp/.eslintrc.js delete mode 100644 packages/measurements-otlp/.npmignore delete mode 100644 packages/measurements-otlp/CHANGELOG.json delete mode 100644 packages/measurements-otlp/CHANGELOG.md delete mode 100644 packages/measurements-otlp/config/rig.json delete mode 100644 packages/measurements-otlp/jest.config.js delete mode 100644 packages/measurements-otlp/package.json delete mode 100644 packages/measurements-otlp/src/__tests__/telemetry.test.ts delete mode 100644 packages/measurements-otlp/src/index.ts delete mode 100644 packages/measurements-otlp/src/telemetry.ts delete mode 100644 packages/measurements-otlp/tsconfig.json delete mode 100644 packages/measurements/.eslintrc.js delete mode 100644 packages/measurements/.npmignore delete mode 100644 packages/measurements/CHANGELOG.json delete mode 100644 packages/measurements/CHANGELOG.md delete mode 100644 packages/measurements/config/rig.json delete mode 100644 packages/measurements/jest.config.js delete mode 100644 packages/measurements/package.json delete mode 100644 packages/measurements/src/__tests__/context.test.ts delete mode 100644 packages/measurements/src/__tests__/index.test.ts delete mode 100644 packages/measurements/src/__tests__/metrics.test.ts delete mode 100644 packages/measurements/src/__tests__/performance.test.ts delete mode 100644 packages/measurements/src/context.ts delete mode 100644 packages/measurements/src/index.ts delete mode 100644 packages/measurements/src/metrics.ts delete mode 100644 packages/measurements/src/types.ts delete mode 100644 packages/measurements/tsconfig.json delete mode 100644 packages/postgres-base/.eslintrc.js delete mode 100644 packages/postgres-base/.npmignore delete mode 100644 packages/postgres-base/CHANGELOG.json delete mode 100644 packages/postgres-base/CHANGELOG.md delete mode 100644 packages/postgres-base/config/rig.json delete mode 100644 packages/postgres-base/jest.config.js delete mode 100644 packages/postgres-base/package.json delete mode 100644 packages/postgres-base/src/index.ts delete mode 100644 packages/postgres-base/tsconfig.json diff --git a/README.md b/README.md index b273591f2b..95776ed141 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # Huly Utils -Huly Utils is a monorepo managed by [Rush](https://rushjs.io/) that contains various packages and tools for engineering purposes. This repository is structured to support scalable development and efficient collaboration. +Huly Utils is a monorepo managed by [Rush](https://rushjs.io/) that contains build tools to Huly platform. +This repository is structured to support scalable development and efficient collaboration. ## Repository Structure @@ -13,10 +14,7 @@ common/ scripts/ # Utility scripts for managing the repository temp/ # Temporary files and caches packages/ - measurements/ # Measurement utilities - measurements-otlp/ # OpenTelemetry-based measurement utilities platform-rig/ # Platform rig utilities - postgres-base/ # PostgreSQL base utilities ``` ## Getting Started diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 5fce7a5a22..c5dc3ae0b6 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -10,130 +10,6 @@ importers: .: {} - ../../packages/measurements: - devDependencies: - '@hcengineering/platform-rig': - specifier: workspace:^0.7.19 - version: link:../platform-rig - '@types/jest': - specifier: ^29.5.5 - version: 29.5.14 - '@typescript-eslint/eslint-plugin': - specifier: ^6.21.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/parser': - specifier: ^6.21.0 - version: 6.21.0(eslint@8.57.1)(typescript@5.9.3) - eslint: - specifier: ^8.54.0 - version: 8.57.1 - eslint-config-standard-with-typescript: - specifier: ^40.0.0 - version: 40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.3) - eslint-plugin-import: - specifier: ^2.26.0 - version: 2.32.0(eslint@8.57.1) - eslint-plugin-n: - specifier: ^15.4.0 - version: 15.7.0(eslint@8.57.1) - eslint-plugin-node: - specifier: ^11.1.0 - version: 11.1.0(eslint@8.57.1) - eslint-plugin-promise: - specifier: ^6.1.1 - version: 6.6.0(eslint@8.57.1) - jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@22.18.1) - ts-jest: - specifier: ^29.1.1 - version: 29.4.1(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest-util@29.7.0)(jest@29.7.0(@types/node@22.18.1))(typescript@5.9.3) - - ../../packages/measurements-otlp: - dependencies: - '@hcengineering/measurements': - specifier: workspace:^0.7.13 - version: link:../measurements - '@opentelemetry/api': - specifier: ^1.9.0 - version: 1.9.0 - '@opentelemetry/api-logs': - specifier: ^0.203.0 - version: 0.203.0 - '@opentelemetry/auto-instrumentations-node': - specifier: ^0.62.0 - version: 0.62.2(@opentelemetry/api@1.9.0)(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0)) - '@opentelemetry/core': - specifier: ^2.0.1 - version: 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-logs-otlp-http': - specifier: ^0.203.0 - version: 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-http': - specifier: ^0.203.0 - version: 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-trace-otlp-http': - specifier: ^0.203.0 - version: 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/id-generator-aws-xray': - specifier: ^2.0.0 - version: 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': - specifier: ^0.203.0 - version: 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': - specifier: ^2.0.1 - version: 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': - specifier: ^0.203.0 - version: 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': - specifier: ^2.0.1 - version: 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-node': - specifier: ^0.203.0 - version: 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-node': - specifier: ^2.0.1 - version: 2.1.0(@opentelemetry/api@1.9.0) - devDependencies: - '@hcengineering/platform-rig': - specifier: workspace:^0.7.19 - version: link:../platform-rig - '@types/jest': - specifier: ^29.5.5 - version: 29.5.14 - '@typescript-eslint/eslint-plugin': - specifier: ^6.21.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/parser': - specifier: ^6.21.0 - version: 6.21.0(eslint@8.57.1)(typescript@5.9.3) - eslint: - specifier: ^8.54.0 - version: 8.57.1 - eslint-config-standard-with-typescript: - specifier: ^40.0.0 - version: 40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.3) - eslint-plugin-import: - specifier: ^2.26.0 - version: 2.32.0(eslint@8.57.1) - eslint-plugin-n: - specifier: ^15.4.0 - version: 15.7.0(eslint@8.57.1) - eslint-plugin-node: - specifier: ^11.1.0 - version: 11.1.0(eslint@8.57.1) - eslint-plugin-promise: - specifier: ^6.1.1 - version: 6.6.0(eslint@8.57.1) - jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@22.18.1) - ts-jest: - specifier: ^29.1.1 - version: 29.4.1(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest-util@29.7.0)(jest@29.7.0(@types/node@22.18.1))(typescript@5.9.3) - ../../packages/platform-rig: dependencies: '@typescript-eslint/eslint-plugin': @@ -191,52 +67,6 @@ importers: specifier: ^5.9.3 version: 5.9.3 - ../../packages/postgres-base: - dependencies: - postgres: - specifier: ^3.4.7 - version: 3.4.7 - devDependencies: - '@hcengineering/platform-rig': - specifier: workspace:^0.7.19 - version: link:../platform-rig - '@types/jest': - specifier: ^29.5.5 - version: 29.5.14 - '@types/node': - specifier: ^22.15.29 - version: 22.18.1 - '@typescript-eslint/eslint-plugin': - specifier: ^6.21.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/parser': - specifier: ^6.21.0 - version: 6.21.0(eslint@8.57.1)(typescript@5.9.3) - eslint: - specifier: ^8.54.0 - version: 8.57.1 - eslint-config-standard-with-typescript: - specifier: ^40.0.0 - version: 40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.3) - eslint-plugin-import: - specifier: ^2.26.0 - version: 2.32.0(eslint@8.57.1) - eslint-plugin-n: - specifier: ^15.4.0 - version: 15.7.0(eslint@8.57.1) - eslint-plugin-node: - specifier: ^11.1.0 - version: 11.1.0(eslint@8.57.1) - eslint-plugin-promise: - specifier: ^6.1.1 - version: 6.6.0(eslint@8.57.1) - jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@22.18.1) - ts-jest: - specifier: ^29.1.1 - version: 29.4.1(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest-util@29.7.0)(jest@29.7.0(@types/node@22.18.1))(typescript@5.9.3) - ../../packages/ui-test: dependencies: svelte: @@ -664,15 +494,6 @@ packages: resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@grpc/grpc-js@1.13.4': - resolution: {integrity: sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg==} - engines: {node: '>=12.10.0'} - - '@grpc/proto-loader@0.7.15': - resolution: {integrity: sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==} - engines: {node: '>=6'} - hasBin: true - '@humanwhocodes/config-array@0.13.0': resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} @@ -776,9 +597,6 @@ packages: '@jridgewell/trace-mapping@0.3.30': resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} - '@js-sdsl/ordered-map@4.4.2': - resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} - '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -791,497 +609,6 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@opentelemetry/api-logs@0.203.0': - resolution: {integrity: sha512-9B9RU0H7Ya1Dx/Rkyc4stuBZSGVQF27WigitInx2QQoj6KUpEFYPKoWjdFTunJYxmXmh17HeBvbMa1EhGyPmqQ==} - engines: {node: '>=8.0.0'} - - '@opentelemetry/api@1.9.0': - resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} - engines: {node: '>=8.0.0'} - - '@opentelemetry/auto-instrumentations-node@0.62.2': - resolution: {integrity: sha512-Ipe6X7ddrCiRsuewyTU83IvKiSFT4piqmv9z8Ovg1E7v98pdTj1pUE6sDrHV50zl7/ypd+cONBgt+EYSZu4u9Q==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.4.1 - '@opentelemetry/core': ^2.0.0 - - '@opentelemetry/context-async-hooks@2.0.1': - resolution: {integrity: sha512-XuY23lSI3d4PEqKA+7SLtAgwqIfc6E/E9eAQWLN1vlpC53ybO3o6jW4BsXo1xvz9lYyyWItfQDDLzezER01mCw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - - '@opentelemetry/context-async-hooks@2.1.0': - resolution: {integrity: sha512-zOyetmZppnwTyPrt4S7jMfXiSX9yyfF0hxlA8B5oo2TtKl+/RGCy7fi4DrBfIf3lCPrkKsRBWZZD7RFojK7FDg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - - '@opentelemetry/core@2.0.1': - resolution: {integrity: sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - - '@opentelemetry/core@2.1.0': - resolution: {integrity: sha512-RMEtHsxJs/GiHHxYT58IY57UXAQTuUnZVco6ymDEqTNlJKTimM4qPUPVe8InNFyBjhHBEAx4k3Q8LtNayBsbUQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - - '@opentelemetry/exporter-logs-otlp-grpc@0.203.0': - resolution: {integrity: sha512-g/2Y2noc/l96zmM+g0LdeuyYKINyBwN6FJySoU15LHPLcMN/1a0wNk2SegwKcxrRdE7Xsm7fkIR5n6XFe3QpPw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/exporter-logs-otlp-http@0.203.0': - resolution: {integrity: sha512-s0hys1ljqlMTbXx2XiplmMJg9wG570Z5lH7wMvrZX6lcODI56sG4HL03jklF63tBeyNwK2RV1/ntXGo3HgG4Qw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/exporter-logs-otlp-proto@0.203.0': - resolution: {integrity: sha512-nl/7S91MXn5R1aIzoWtMKGvqxgJgepB/sH9qW0rZvZtabnsjbf8OQ1uSx3yogtvLr0GzwD596nQKz2fV7q2RBw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/exporter-metrics-otlp-grpc@0.203.0': - resolution: {integrity: sha512-FCCj9nVZpumPQSEI57jRAA89hQQgONuoC35Lt+rayWY/mzCAc6BQT7RFyFaZKJ2B7IQ8kYjOCPsF/HGFWjdQkQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/exporter-metrics-otlp-http@0.203.0': - resolution: {integrity: sha512-HFSW10y8lY6BTZecGNpV3GpoSy7eaO0Z6GATwZasnT4bEsILp8UJXNG5OmEsz4SdwCSYvyCbTJdNbZP3/8LGCQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/exporter-metrics-otlp-proto@0.203.0': - resolution: {integrity: sha512-OZnhyd9npU7QbyuHXFEPVm3LnjZYifuKpT3kTnF84mXeEQ84pJJZgyLBpU4FSkSwUkt/zbMyNAI7y5+jYTWGIg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/exporter-prometheus@0.203.0': - resolution: {integrity: sha512-2jLuNuw5m4sUj/SncDf/mFPabUxMZmmYetx5RKIMIQyPnl6G6ooFzfeE8aXNRf8YD1ZXNlCnRPcISxjveGJHNg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/exporter-trace-otlp-grpc@0.203.0': - resolution: {integrity: sha512-322coOTf81bm6cAA8+ML6A+m4r2xTCdmAZzGNTboPXRzhwPt4JEmovsFAs+grpdarObd68msOJ9FfH3jxM6wqA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/exporter-trace-otlp-http@0.203.0': - resolution: {integrity: sha512-ZDiaswNYo0yq/cy1bBLJFe691izEJ6IgNmkjm4C6kE9ub/OMQqDXORx2D2j8fzTBTxONyzusbaZlqtfmyqURPw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/exporter-trace-otlp-proto@0.203.0': - resolution: {integrity: sha512-1xwNTJ86L0aJmWRwENCJlH4LULMG2sOXWIVw+Szta4fkqKVY50Eo4HoVKKq6U9QEytrWCr8+zjw0q/ZOeXpcAQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/exporter-zipkin@2.0.1': - resolution: {integrity: sha512-a9eeyHIipfdxzCfc2XPrE+/TI3wmrZUDFtG2RRXHSbZZULAny7SyybSvaDvS77a7iib5MPiAvluwVvbGTsHxsw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.0.0 - - '@opentelemetry/id-generator-aws-xray@2.0.1': - resolution: {integrity: sha512-fq+OysMUCZ+XI6VUjVvjjJId4sdXrX1jBUL0mOkc+lysiv7uZsL0ga+jp/cey9wkKyLayyC8GAQzj901w9legw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.0.0 - - '@opentelemetry/instrumentation-amqplib@0.50.0': - resolution: {integrity: sha512-kwNs/itehHG/qaQBcVrLNcvXVPW0I4FCOVtw3LHMLdYIqD7GJ6Yv2nX+a4YHjzbzIeRYj8iyMp0Bl7tlkidq5w==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-aws-lambda@0.54.1': - resolution: {integrity: sha512-qm8pGSAM1mXk7unbrGktWWGJc6IFI58ZsaHJ+i420Fp5VO3Vf7GglIgaXTS8CKBrVB4LHFj3NvzJg31PtsAQcA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-aws-sdk@0.58.0': - resolution: {integrity: sha512-9vFH7gU686dsAeLMCkqUj9y0MQZ1xrTtStSpNV2UaGWtDnRjJrAdJLu9Y545oKEaDTeVaob4UflyZvvpZnw3Xw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-bunyan@0.49.0': - resolution: {integrity: sha512-ky5Am1y6s3Ex/3RygHxB/ZXNG07zPfg9Z6Ora+vfeKcr/+I6CJbWXWhSBJor3gFgKN3RvC11UWVURnmDpBS6Pg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-cassandra-driver@0.49.0': - resolution: {integrity: sha512-BNIvqldmLkeikfI5w5Rlm9vG5NnQexfPoxOgEMzfDVOEF+vS6351I6DzWLLgWWR9CNF/jQJJi/lr6am2DLp0Rw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-connect@0.47.0': - resolution: {integrity: sha512-pjenvjR6+PMRb6/4X85L4OtkQCootgb/Jzh/l/Utu3SJHBid1F+gk9sTGU2FWuhhEfV6P7MZ7BmCdHXQjgJ42g==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-cucumber@0.19.0': - resolution: {integrity: sha512-99ms8kQWRuPt5lkDqbJJzD+7Tq5TMUlBZki4SA2h6CgK4ncX+tyep9XFY1e+XTBLJIWmuFMGbWqBLJ4fSKIQNQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.0.0 - - '@opentelemetry/instrumentation-dataloader@0.21.1': - resolution: {integrity: sha512-hNAm/bwGawLM8VDjKR0ZUDJ/D/qKR3s6lA5NV+btNaPVm2acqhPcT47l2uCVi+70lng2mywfQncor9v8/ykuyw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-dns@0.47.0': - resolution: {integrity: sha512-775fOnewWkTF4iXMGKgwvOGqEmPrU1PZpXjjqvTrEErYBJe7Fz1WlEeUStHepyKOdld7Ghv7TOF/kE3QDctvrg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-express@0.52.0': - resolution: {integrity: sha512-W7pizN0Wh1/cbNhhTf7C62NpyYw7VfCFTYg0DYieSTrtPBT1vmoSZei19wfKLnrMsz3sHayCg0HxCVL2c+cz5w==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-fastify@0.48.0': - resolution: {integrity: sha512-3zQlE/DoVfVH6/ycuTv7vtR/xib6WOa0aLFfslYcvE62z0htRu/ot8PV/zmMZfnzpTQj8S/4ULv36R6UIbpJIg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-fs@0.23.0': - resolution: {integrity: sha512-Puan+QopWHA/KNYvDfOZN6M/JtF6buXEyD934vrb8WhsX1/FuM7OtoMlQyIqAadnE8FqqDL4KDPiEfCQH6pQcQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-generic-pool@0.47.0': - resolution: {integrity: sha512-UfHqf3zYK+CwDwEtTjaD12uUqGGTswZ7ofLBEdQ4sEJp9GHSSJMQ2hT3pgBxyKADzUdoxQAv/7NqvL42ZI+Qbw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-graphql@0.51.0': - resolution: {integrity: sha512-LchkOu9X5DrXAnPI1+Z06h/EH/zC7D6sA86hhPrk3evLlsJTz0grPrkL/yUJM9Ty0CL/y2HSvmWQCjbJEz/ADg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-grpc@0.203.0': - resolution: {integrity: sha512-Qmjx2iwccHYRLoE4RFS46CvQE9JG9Pfeae4EPaNZjvIuJxb/pZa2R9VWzRlTehqQWpAvto/dGhtkw8Tv+o0LTg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-hapi@0.50.0': - resolution: {integrity: sha512-5xGusXOFQXKacrZmDbpHQzqYD1gIkrMWuwvlrEPkYOsjUqGUjl1HbxCsn5Y9bUXOCgP1Lj6A4PcKt1UiJ2MujA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-http@0.203.0': - resolution: {integrity: sha512-y3uQAcCOAwnO6vEuNVocmpVzG3PER6/YZqbPbbffDdJ9te5NkHEkfSMNzlC3+v7KlE+WinPGc3N7MR30G1HY2g==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-ioredis@0.51.0': - resolution: {integrity: sha512-9IUws0XWCb80NovS+17eONXsw1ZJbHwYYMXiwsfR9TSurkLV5UNbRSKb9URHO+K+pIJILy9wCxvyiOneMr91Ig==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-kafkajs@0.13.0': - resolution: {integrity: sha512-FPQyJsREOaGH64hcxlzTsIEQC4DYANgTwHjiB7z9lldmvua1LRMVn3/FfBlzXoqF179B0VGYviz6rn75E9wsDw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-knex@0.48.0': - resolution: {integrity: sha512-V5wuaBPv/lwGxuHjC6Na2JFRjtPgstw19jTFl1B1b6zvaX8zVDYUDaR5hL7glnQtUSCMktPttQsgK4dhXpddcA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-koa@0.51.0': - resolution: {integrity: sha512-XNLWeMTMG1/EkQBbgPYzCeBD0cwOrfnn8ao4hWgLv0fNCFQu1kCsJYygz2cvKuCs340RlnG4i321hX7R8gj3Rg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-lru-memoizer@0.48.0': - resolution: {integrity: sha512-KUW29wfMlTPX1wFz+NNrmE7IzN7NWZDrmFWHM/VJcmFEuQGnnBuTIdsP55CnBDxKgQ/qqYFp4udQFNtjeFosPw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-memcached@0.47.0': - resolution: {integrity: sha512-vXDs/l4hlWy1IepPG1S6aYiIZn+tZDI24kAzwKKJmR2QEJRL84PojmALAEJGazIOLl/VdcCPZdMb0U2K0VzojA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-mongodb@0.56.0': - resolution: {integrity: sha512-YG5IXUUmxX3Md2buVMvxm9NWlKADrnavI36hbJsihqqvBGsWnIfguf0rUP5Srr0pfPqhQjUP+agLMsvu0GmUpA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-mongoose@0.50.0': - resolution: {integrity: sha512-Am8pk1Ct951r4qCiqkBcGmPIgGhoDiFcRtqPSLbJrUZqEPUsigjtMjoWDRLG1Ki1NHgOF7D0H7d+suWz1AAizw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-mysql2@0.50.0': - resolution: {integrity: sha512-PoOMpmq73rOIE3nlTNLf3B1SyNYGsp7QXHYKmeTZZnJ2Ou7/fdURuOhWOI0e6QZ5gSem18IR1sJi6GOULBQJ9g==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-mysql@0.49.0': - resolution: {integrity: sha512-QU9IUNqNsrlfE3dJkZnFHqLjlndiU39ll/YAAEvWE40sGOCi9AtOF6rmEGzJ1IswoZ3oyePV7q2MP8SrhJfVAA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-nestjs-core@0.49.0': - resolution: {integrity: sha512-1R/JFwdmZIk3T/cPOCkVvFQeKYzbbUvDxVH3ShXamUwBlGkdEu5QJitlRMyVNZaHkKZKWgYrBarGQsqcboYgaw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-net@0.47.0': - resolution: {integrity: sha512-csoJ++Njpf7C09JH+0HNGenuNbDZBqO1rFhMRo6s0rAmJwNh9zY3M/urzptmKlqbKnf4eH0s+CKHy/+M8fbFsQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-oracledb@0.29.0': - resolution: {integrity: sha512-2aHLiJdkyiUbooIUm7FaZf+O4jyqEl+RfFpgud1dxT87QeeYM216wi+xaMNzsb5yKtRBqbA3qeHBCyenYrOZwA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-pg@0.56.1': - resolution: {integrity: sha512-0/PiHDPVaLdcXNw6Gqb3JBdMxComMEwh444X8glwiynJKJHRTR49+l2cqJfoOVzB8Sl1XRl3Yaqw6aDi3s8e9w==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-pino@0.50.1': - resolution: {integrity: sha512-pBbvuWiHA9iAumAuQ0SKYOXK7NRlbnVTf/qBV0nMdRnxBPrc/GZTbh0f7Y59gZfYsbCLhXLL1oRTEnS+PwS3CA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-redis@0.52.0': - resolution: {integrity: sha512-R8Y7cCZlJ2Vl31S2i7bl5SqyC/aul54ski4wCFip/Tp9WGtLK1xVATi2rwy2wkc8ZCtjdEe9eEVR+QFG6gGZxg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-restify@0.49.0': - resolution: {integrity: sha512-tsGZZhS4mVZH7omYxw5jpsrD3LhWizqWc0PYtAnzpFUvL5ZINHE+cm57bssTQ2AK/GtZMxu9LktwCvIIf3dSmw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-router@0.48.0': - resolution: {integrity: sha512-Wixrc8CchuJojXpaS/dCQjFOMc+3OEil1H21G+WLYQb8PcKt5kzW9zDBT19nyjjQOx/D/uHPfgbrT+Dc7cfJ9w==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-runtime-node@0.17.1': - resolution: {integrity: sha512-c1FlAk+bB2uF9a8YneGmNPTl7c/xVaan4mmWvbkWcOmH/ipKqR1LaKUlz/BMzLrJLjho1EJlG2NrS2w2Arg+nw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-socket.io@0.50.0': - resolution: {integrity: sha512-6JN6lnKN9ZuZtZdMQIR+no1qHzQvXSZUsNe3sSWMgqmNRyEXuDUWBIyKKeG0oHRHtR4xE4QhJyD4D5kKRPWZFA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-tedious@0.22.0': - resolution: {integrity: sha512-XrrNSUCyEjH1ax9t+Uo6lv0S2FCCykcF7hSxBMxKf7Xn0bPRxD3KyFUZy25aQXzbbbUHhtdxj3r2h88SfEM3aA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-undici@0.14.0': - resolution: {integrity: sha512-2HN+7ztxAReXuxzrtA3WboAKlfP5OsPA57KQn2AdYZbJ3zeRPcLXyW4uO/jpLE6PLm0QRtmeGCmfYpqRlwgSwg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.7.0 - - '@opentelemetry/instrumentation-winston@0.48.1': - resolution: {integrity: sha512-XyOuVwdziirHHYlsw+BWrvdI/ymjwnexupKA787zQQ+D5upaE/tseZxjfQa7+t4+FdVLxHICaMTmkSD4yZHpzQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation@0.203.0': - resolution: {integrity: sha512-ke1qyM+3AK2zPuBPb6Hk/GCsc5ewbLvPNkEuELx/JmANeEp6ZjnZ+wypPAJSucTw0wvCGrUaibDSdcrGFoWxKQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/otlp-exporter-base@0.203.0': - resolution: {integrity: sha512-Wbxf7k+87KyvxFr5D7uOiSq/vHXWommvdnNE7vECO3tAhsA2GfOlpWINCMWUEPdHZ7tCXxw6Epp3vgx3jU7llQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/otlp-grpc-exporter-base@0.203.0': - resolution: {integrity: sha512-te0Ze1ueJF+N/UOFl5jElJW4U0pZXQ8QklgSfJ2linHN0JJsuaHG8IabEUi2iqxY8ZBDlSiz1Trfv5JcjWWWwQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/otlp-transformer@0.203.0': - resolution: {integrity: sha512-Y8I6GgoCna0qDQ2W6GCRtaF24SnvqvA8OfeTi7fqigD23u8Jpb4R5KFv/pRvrlGagcCLICMIyh9wiejp4TXu/A==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/propagator-b3@2.0.1': - resolution: {integrity: sha512-Hc09CaQ8Tf5AGLmf449H726uRoBNGPBL4bjr7AnnUpzWMvhdn61F78z9qb6IqB737TffBsokGAK1XykFEZ1igw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - - '@opentelemetry/propagator-jaeger@2.0.1': - resolution: {integrity: sha512-7PMdPBmGVH2eQNb/AtSJizQNgeNTfh6jQFqys6lfhd6P4r+m/nTh3gKPPpaCXVdRQ+z93vfKk+4UGty390283w==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - - '@opentelemetry/redis-common@0.38.0': - resolution: {integrity: sha512-4Wc0AWURII2cfXVVoZ6vDqK+s5n4K5IssdrlVrvGsx6OEOKdghKtJZqXAHWFiZv4nTDLH2/2fldjIHY8clMOjQ==} - engines: {node: ^18.19.0 || >=20.6.0} - - '@opentelemetry/resource-detector-alibaba-cloud@0.31.3': - resolution: {integrity: sha512-I556LHcLVsBXEgnbPgQISP/JezDt5OfpgOaJNR1iVJl202r+K145OSSOxnH5YOc/KvrydBD0FOE03F7x0xnVTw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.0.0 - - '@opentelemetry/resource-detector-aws@2.3.0': - resolution: {integrity: sha512-PkD/lyXG3B3REq1Y6imBLckljkJYXavtqGYSryAeJYvGOf5Ds3doR+BCGjmKeF6ObAtI5MtpBeUStTDtGtBsWA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.0.0 - - '@opentelemetry/resource-detector-azure@0.10.0': - resolution: {integrity: sha512-5cNAiyPBg53Uxe/CW7hsCq8HiKNAUGH+gi65TtgpzSR9bhJG4AEbuZhbJDFwe97tn2ifAD1JTkbc/OFuaaFWbA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.0.0 - - '@opentelemetry/resource-detector-container@0.7.3': - resolution: {integrity: sha512-SK+xUFw6DKYbQniaGmIFsFxAZsr8RpRSRWxKi5/ZJAoqqPnjcyGI/SeUx8zzPk4XLO084zyM4pRHgir0hRTaSQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.0.0 - - '@opentelemetry/resource-detector-gcp@0.37.0': - resolution: {integrity: sha512-LGpJBECIMsVKhiulb4nxUw++m1oF4EiDDPmFGW2aqYaAF0oUvJNv8Z/55CAzcZ7SxvlTgUwzewXDBsuCup7iqw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.0.0 - - '@opentelemetry/resources@2.0.1': - resolution: {integrity: sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.10.0' - - '@opentelemetry/resources@2.1.0': - resolution: {integrity: sha512-1CJjf3LCvoefUOgegxi8h6r4B/wLSzInyhGP2UmIBYNlo4Qk5CZ73e1eEyWmfXvFtm1ybkmfb2DqWvspsYLrWw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.10.0' - - '@opentelemetry/sdk-logs@0.203.0': - resolution: {integrity: sha512-vM2+rPq0Vi3nYA5akQD2f3QwossDnTDLvKbea6u/A2NZ3XDkPxMfo/PNrDoXhDUD/0pPo2CdH5ce/thn9K0kLw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.4.0 <1.10.0' - - '@opentelemetry/sdk-metrics@2.0.1': - resolution: {integrity: sha512-wf8OaJoSnujMAHWR3g+/hGvNcsC16rf9s1So4JlMiFaFHiE4HpIA3oUh+uWZQ7CNuK8gVW/pQSkgoa5HkkOl0g==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.9.0 <1.10.0' - - '@opentelemetry/sdk-metrics@2.1.0': - resolution: {integrity: sha512-J9QX459mzqHLL9Y6FZ4wQPRZG4TOpMCyPOh6mkr/humxE1W2S3Bvf4i75yiMW9uyed2Kf5rxmLhTm/UK8vNkAw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.9.0 <1.10.0' - - '@opentelemetry/sdk-node@0.203.0': - resolution: {integrity: sha512-zRMvrZGhGVMvAbbjiNQW3eKzW/073dlrSiAKPVWmkoQzah9wfynpVPeL55f9fVIm0GaBxTLcPeukWGy0/Wj7KQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.10.0' - - '@opentelemetry/sdk-trace-base@2.0.1': - resolution: {integrity: sha512-xYLlvk/xdScGx1aEqvxLwf6sXQLXCjk3/1SQT9X9AoN5rXRhkdvIFShuNNmtTEPRBqcsMbS4p/gJLNI2wXaDuQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.10.0' - - '@opentelemetry/sdk-trace-base@2.1.0': - resolution: {integrity: sha512-uTX9FBlVQm4S2gVQO1sb5qyBLq/FPjbp+tmGoxu4tIgtYGmBYB44+KX/725RFDe30yBSaA9Ml9fqphe1hbUyLQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.10.0' - - '@opentelemetry/sdk-trace-node@2.0.1': - resolution: {integrity: sha512-UhdbPF19pMpBtCWYP5lHbTogLWx9N0EBxtdagvkn5YtsAnCBZzL7SjktG+ZmupRgifsHMjwUaCCaVmqGfSADmA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - - '@opentelemetry/sdk-trace-node@2.1.0': - resolution: {integrity: sha512-SvVlBFc/jI96u/mmlKm86n9BbTCbQ35nsPoOohqJX6DXH92K0kTe73zGY5r8xoI1QkjR9PizszVJLzMC966y9Q==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - - '@opentelemetry/semantic-conventions@1.37.0': - resolution: {integrity: sha512-JD6DerIKdJGmRp4jQyX5FlrQjA4tjOw1cvfsPAZXfOOEErMUHjPcPSICS+6WnM0nB0efSFARh0KAZss+bvExOA==} - engines: {node: '>=14'} - - '@opentelemetry/sql-common@0.41.0': - resolution: {integrity: sha512-pmzXctVbEERbqSfiAgdes9Y63xjoOyXcD7B6IXBkVb+vbM7M9U98mn33nGXxPf4dfYR0M+vhcKRZmbSJ7HfqFA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.1.0 - '@parcel/watcher-android-arm64@2.5.1': resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} engines: {node: '>= 10.0.0'} @@ -1364,36 +691,6 @@ packages: resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} engines: {node: '>= 10.0.0'} - '@protobufjs/aspromise@1.1.2': - resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} - - '@protobufjs/base64@1.1.2': - resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} - - '@protobufjs/codegen@2.0.4': - resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} - - '@protobufjs/eventemitter@1.1.0': - resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} - - '@protobufjs/fetch@1.1.0': - resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} - - '@protobufjs/float@1.0.2': - resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} - - '@protobufjs/inquire@1.1.0': - resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} - - '@protobufjs/path@1.1.2': - resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} - - '@protobufjs/pool@1.1.0': - resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} - - '@protobufjs/utf8@1.1.0': - resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} @@ -1406,9 +703,6 @@ packages: '@sinonjs/fake-timers@10.3.0': resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - '@types/aws-lambda@8.10.152': - resolution: {integrity: sha512-soT/c2gYBnT5ygwiHPmd9a1bftj462NWVk2tKCc1PYHSIacB2UwbTS2zYG4jzag1mRDuzg/OjtxQjQ2NKRB6Rw==} - '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -1421,12 +715,6 @@ packages: '@types/babel__traverse@7.28.0': resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} - '@types/bunyan@1.8.11': - resolution: {integrity: sha512-758fRH7umIMk5qt5ELmRMff4mLDlN+xyYzC+dkPTdKwbSkJFvz6xwyScrytPU0QIBbRRwbiE8/BIg8bpajerNQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} @@ -1451,24 +739,9 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/memcached@2.2.10': - resolution: {integrity: sha512-AM9smvZN55Gzs2wRrqeMHVP7KE8KWgCJO/XL5yCly2xF6EKa4YlbpK+cLSAH4NG/Ah64HrlegmGqW8kYws7Vxg==} - - '@types/mysql@2.15.27': - resolution: {integrity: sha512-YfWiV16IY0OeBfBCk8+hXKmdTKrKlwKN1MNKAPBu5JYxLwBEZl7QzeEpGnlZb3VMGJrrGmB84gXiH+ofs/TezA==} - '@types/node@22.18.1': resolution: {integrity: sha512-rzSDyhn4cYznVG+PCzGe1lwuMYJrcBS1fc3JqSa2PvtABwWo+dZ1ij5OVok3tqfpEBCBoaR4d7upFJk73HRJDw==} - '@types/oracledb@6.5.2': - resolution: {integrity: sha512-kK1eBS/Adeyis+3OlBDMeQQuasIDLUYXsi2T15ccNJ0iyUpQ4xDF7svFu3+bGVrI0CMBUclPciz+lsQR3JX3TQ==} - - '@types/pg-pool@2.0.6': - resolution: {integrity: sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ==} - - '@types/pg@8.15.5': - resolution: {integrity: sha512-LF7lF6zWEKxuT3/OR8wAZGzkg4ENGXFNyiV/JeOt9z5B+0ZVwbql9McqX5c/WStFq1GaGso7H1AzP/qSzmlCKQ==} - '@types/pug@2.0.10': resolution: {integrity: sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==} @@ -1478,9 +751,6 @@ packages: '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} - '@types/tedious@4.0.14': - resolution: {integrity: sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==} - '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} @@ -1548,11 +818,6 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - acorn-import-attributes@1.9.5: - resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} - peerDependencies: - acorn: ^8 - acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1563,10 +828,6 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - agent-base@7.1.4: - resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} - engines: {node: '>= 14'} - ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -1671,9 +932,6 @@ packages: big.js@5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} - bignumber.js@9.3.1: - resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} - binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} @@ -2121,9 +1379,6 @@ packages: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -2170,9 +1425,6 @@ packages: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} - forwarded-parse@2.1.2: - resolution: {integrity: sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==} - fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} @@ -2195,14 +1447,6 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - gaxios@6.7.1: - resolution: {integrity: sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==} - engines: {node: '>=14'} - - gcp-metadata@6.1.1: - resolution: {integrity: sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==} - engines: {node: '>=14'} - generator-function@2.0.1: resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} engines: {node: '>= 0.4'} @@ -2259,10 +1503,6 @@ packages: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} - google-logging-utils@0.0.2: - resolution: {integrity: sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==} - engines: {node: '>=14'} - gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -2308,10 +1548,6 @@ packages: html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - https-proxy-agent@7.0.6: - resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} - engines: {node: '>= 14'} - human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} @@ -2327,9 +1563,6 @@ packages: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} - import-in-the-middle@1.14.2: - resolution: {integrity: sha512-5tCuY9BV8ujfOpwtAGgsTx9CGUapcFMEEyByLv1B+v2+6DhAcw+Zr0nhQT7uwaZ7DiourxFEscghOR8e1aPLQw==} - import-local@3.2.0: resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} engines: {node: '>=8'} @@ -2651,9 +1884,6 @@ packages: engines: {node: '>=6'} hasBin: true - json-bigint@1.0.0: - resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} - json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -2718,18 +1948,12 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - long@5.3.2: - resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} - lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -2786,9 +2010,6 @@ packages: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true - module-details-from-path@1.0.4: - resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -2806,15 +2027,6 @@ packages: node-addon-api@7.1.1: resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} @@ -2918,17 +2130,6 @@ packages: periscopic@3.1.0: resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} - pg-int8@1.0.1: - resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} - engines: {node: '>=4.0.0'} - - pg-protocol@1.10.3: - resolution: {integrity: sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==} - - pg-types@2.2.0: - resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} - engines: {node: '>=4'} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -2980,26 +2181,6 @@ packages: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} - postgres-array@2.0.0: - resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} - engines: {node: '>=4'} - - postgres-bytea@1.0.0: - resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} - engines: {node: '>=0.10.0'} - - postgres-date@1.0.7: - resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} - engines: {node: '>=0.10.0'} - - postgres-interval@1.2.0: - resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} - engines: {node: '>=0.10.0'} - - postgres@3.4.7: - resolution: {integrity: sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw==} - engines: {node: '>=12'} - prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -3023,10 +2204,6 @@ packages: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} - protobufjs@7.5.4: - resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} - engines: {node: '>=12.0.0'} - punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -3064,10 +2241,6 @@ packages: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - require-in-the-middle@7.5.2: - resolution: {integrity: sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==} - engines: {node: '>=8.6.0'} - resolve-cwd@3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} @@ -3359,9 +2532,6 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - ts-api-utils@1.4.3: resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} engines: {node: '>=16'} @@ -3467,10 +2637,6 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - hasBin: true - v8-to-istanbul@9.3.0: resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} engines: {node: '>=10.12.0'} @@ -3478,12 +2644,6 @@ packages: walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} @@ -3523,10 +2683,6 @@ packages: resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -3847,18 +3003,6 @@ snapshots: '@eslint/js@8.57.1': {} - '@grpc/grpc-js@1.13.4': - dependencies: - '@grpc/proto-loader': 0.7.15 - '@js-sdsl/ordered-map': 4.4.2 - - '@grpc/proto-loader@0.7.15': - dependencies: - lodash.camelcase: 4.3.0 - long: 5.3.2 - protobufjs: 7.5.4 - yargs: 17.7.2 - '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 @@ -4062,8 +3206,6 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@js-sdsl/ordered-map@4.4.2': {} - '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -4076,715 +3218,6 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - '@opentelemetry/api-logs@0.203.0': - dependencies: - '@opentelemetry/api': 1.9.0 - - '@opentelemetry/api@1.9.0': {} - - '@opentelemetry/auto-instrumentations-node@0.62.2(@opentelemetry/api@1.9.0)(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-amqplib': 0.50.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-aws-lambda': 0.54.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-aws-sdk': 0.58.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-bunyan': 0.49.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-cassandra-driver': 0.49.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-connect': 0.47.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-cucumber': 0.19.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-dataloader': 0.21.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-dns': 0.47.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-express': 0.52.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-fastify': 0.48.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-fs': 0.23.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-generic-pool': 0.47.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-graphql': 0.51.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-grpc': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-hapi': 0.50.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-http': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-ioredis': 0.51.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-kafkajs': 0.13.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-knex': 0.48.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-koa': 0.51.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-lru-memoizer': 0.48.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-memcached': 0.47.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mongodb': 0.56.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mongoose': 0.50.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mysql': 0.49.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mysql2': 0.50.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-nestjs-core': 0.49.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-net': 0.47.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-oracledb': 0.29.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-pg': 0.56.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-pino': 0.50.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-redis': 0.52.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-restify': 0.49.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-router': 0.48.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-runtime-node': 0.17.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-socket.io': 0.50.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-tedious': 0.22.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-undici': 0.14.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-winston': 0.48.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resource-detector-alibaba-cloud': 0.31.3(@opentelemetry/api@1.9.0) - '@opentelemetry/resource-detector-aws': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resource-detector-azure': 0.10.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resource-detector-container': 0.7.3(@opentelemetry/api@1.9.0) - '@opentelemetry/resource-detector-gcp': 0.37.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-node': 0.203.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - encoding - - supports-color - - '@opentelemetry/context-async-hooks@2.0.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - - '@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - - '@opentelemetry/core@2.0.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.37.0 - - '@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.37.0 - - '@opentelemetry/exporter-logs-otlp-grpc@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@grpc/grpc-js': 1.13.4 - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-grpc-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.0) - - '@opentelemetry/exporter-logs-otlp-http@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.203.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.0) - - '@opentelemetry/exporter-logs-otlp-proto@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.203.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) - - '@opentelemetry/exporter-metrics-otlp-grpc@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@grpc/grpc-js': 1.13.4 - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-http': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-grpc-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) - - '@opentelemetry/exporter-metrics-otlp-http@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) - - '@opentelemetry/exporter-metrics-otlp-proto@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-http': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) - - '@opentelemetry/exporter-prometheus@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) - - '@opentelemetry/exporter-trace-otlp-grpc@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@grpc/grpc-js': 1.13.4 - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-grpc-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) - - '@opentelemetry/exporter-trace-otlp-http@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) - - '@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) - - '@opentelemetry/exporter-zipkin@2.0.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - - '@opentelemetry/id-generator-aws-xray@2.0.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) - - '@opentelemetry/instrumentation-amqplib@0.50.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-aws-lambda@0.54.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - '@types/aws-lambda': 8.10.152 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-aws-sdk@0.58.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-bunyan@0.49.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.203.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@types/bunyan': 1.8.11 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-cassandra-driver@0.49.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-connect@0.47.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - '@types/connect': 3.4.38 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-cucumber@0.19.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-dataloader@0.21.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-dns@0.47.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-express@0.52.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-fastify@0.48.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-fs@0.23.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-generic-pool@0.47.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-graphql@0.51.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-grpc@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-hapi@0.50.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-http@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - forwarded-parse: 2.1.2 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-ioredis@0.51.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/redis-common': 0.38.0 - '@opentelemetry/semantic-conventions': 1.37.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-kafkajs@0.13.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-knex@0.48.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-koa@0.51.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-lru-memoizer@0.48.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-memcached@0.47.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - '@types/memcached': 2.2.10 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-mongodb@0.56.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-mongoose@0.50.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-mysql2@0.50.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - '@opentelemetry/sql-common': 0.41.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-mysql@0.49.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - '@types/mysql': 2.15.27 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-nestjs-core@0.49.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-net@0.47.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-oracledb@0.29.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - '@types/oracledb': 6.5.2 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-pg@0.56.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - '@opentelemetry/sql-common': 0.41.0(@opentelemetry/api@1.9.0) - '@types/pg': 8.15.5 - '@types/pg-pool': 2.0.6 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-pino@0.50.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.203.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-redis@0.52.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/redis-common': 0.38.0 - '@opentelemetry/semantic-conventions': 1.37.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-restify@0.49.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-router@0.48.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-runtime-node@0.17.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-socket.io@0.50.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-tedious@0.22.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - '@types/tedious': 4.0.14 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-undici@0.14.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-winston@0.48.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.203.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.203.0 - import-in-the-middle: 1.14.2 - require-in-the-middle: 7.5.2 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/otlp-exporter-base@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) - - '@opentelemetry/otlp-grpc-exporter-base@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@grpc/grpc-js': 1.13.4 - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) - - '@opentelemetry/otlp-transformer@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.203.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) - protobufjs: 7.5.4 - - '@opentelemetry/propagator-b3@2.0.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - - '@opentelemetry/propagator-jaeger@2.0.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - - '@opentelemetry/redis-common@0.38.0': {} - - '@opentelemetry/resource-detector-alibaba-cloud@0.31.3(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - - '@opentelemetry/resource-detector-aws@2.3.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - - '@opentelemetry/resource-detector-azure@0.10.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - - '@opentelemetry/resource-detector-container@0.7.3(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - - '@opentelemetry/resource-detector-gcp@0.37.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - gcp-metadata: 6.1.1 - transitivePeerDependencies: - - encoding - - supports-color - - '@opentelemetry/resources@2.0.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - - '@opentelemetry/resources@2.1.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - - '@opentelemetry/sdk-logs@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.203.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - - '@opentelemetry/sdk-metrics@2.0.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - - '@opentelemetry/sdk-metrics@2.1.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) - - '@opentelemetry/sdk-node@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.203.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-logs-otlp-grpc': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-logs-otlp-http': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-logs-otlp-proto': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-grpc': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-http': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-proto': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-prometheus': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-trace-otlp-grpc': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-trace-otlp-http': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-trace-otlp-proto': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-zipkin': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/propagator-b3': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/propagator-jaeger': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-node': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - - '@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - - '@opentelemetry/sdk-trace-node@2.0.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) - - '@opentelemetry/sdk-trace-node@2.1.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) - - '@opentelemetry/semantic-conventions@1.37.0': {} - - '@opentelemetry/sql-common@0.41.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@parcel/watcher-android-arm64@2.5.1': optional: true @@ -4846,29 +3279,6 @@ snapshots: '@parcel/watcher-win32-x64': 2.5.1 optional: true - '@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': - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/inquire': 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': {} - '@rtsao/scc@1.1.0': {} '@sinclair/typebox@0.27.8': {} @@ -4881,8 +3291,6 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 - '@types/aws-lambda@8.10.152': {} - '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.28.4 @@ -4904,14 +3312,6 @@ snapshots: dependencies: '@babel/types': 7.28.4 - '@types/bunyan@1.8.11': - dependencies: - '@types/node': 22.18.1 - - '@types/connect@3.4.38': - dependencies: - '@types/node': 22.18.1 - '@types/estree@1.0.8': {} '@types/graceful-fs@4.1.9': @@ -4937,42 +3337,16 @@ snapshots: '@types/json5@0.0.29': {} - '@types/memcached@2.2.10': - dependencies: - '@types/node': 22.18.1 - - '@types/mysql@2.15.27': - dependencies: - '@types/node': 22.18.1 - '@types/node@22.18.1': dependencies: undici-types: 6.21.0 - '@types/oracledb@6.5.2': - dependencies: - '@types/node': 22.18.1 - - '@types/pg-pool@2.0.6': - dependencies: - '@types/pg': 8.15.5 - - '@types/pg@8.15.5': - dependencies: - '@types/node': 22.18.1 - pg-protocol: 1.10.3 - pg-types: 2.2.0 - '@types/pug@2.0.10': {} '@types/semver@7.7.1': {} '@types/stack-utils@2.0.3': {} - '@types/tedious@4.0.14': - dependencies: - '@types/node': 22.18.1 - '@types/yargs-parser@21.0.3': {} '@types/yargs@17.0.33': @@ -5067,18 +3441,12 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - acorn-import-attributes@1.9.5(acorn@8.15.0): - dependencies: - acorn: 8.15.0 - acorn-jsx@5.3.2(acorn@8.15.0): dependencies: acorn: 8.15.0 acorn@8.15.0: {} - agent-base@7.1.4: {} - ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -5230,8 +3598,6 @@ snapshots: big.js@5.2.2: {} - bignumber.js@9.3.1: {} - binary-extensions@2.3.0: {} brace-expansion@1.1.12: @@ -5822,8 +4188,6 @@ snapshots: jest-message-util: 29.7.0 jest-util: 29.7.0 - extend@3.0.2: {} - fast-deep-equal@3.1.3: {} fast-glob@3.3.3: @@ -5876,8 +4240,6 @@ snapshots: dependencies: is-callable: 1.2.7 - forwarded-parse@2.1.2: {} - fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 @@ -5902,26 +4264,6 @@ snapshots: functions-have-names@1.2.3: {} - gaxios@6.7.1: - dependencies: - extend: 3.0.2 - https-proxy-agent: 7.0.6 - is-stream: 2.0.1 - node-fetch: 2.7.0 - uuid: 9.0.1 - transitivePeerDependencies: - - encoding - - supports-color - - gcp-metadata@6.1.1: - dependencies: - gaxios: 6.7.1 - google-logging-utils: 0.0.2 - json-bigint: 1.0.0 - transitivePeerDependencies: - - encoding - - supports-color - generator-function@2.0.1: {} gensync@1.0.0-beta.2: {} @@ -5991,8 +4333,6 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 - google-logging-utils@0.0.2: {} - gopd@1.2.0: {} graceful-fs@4.2.11: {} @@ -6032,13 +4372,6 @@ snapshots: html-escaper@2.0.2: {} - https-proxy-agent@7.0.6: - dependencies: - agent-base: 7.1.4 - debug: 4.4.1 - transitivePeerDependencies: - - supports-color - human-signals@2.1.0: {} ignore@5.3.2: {} @@ -6050,13 +4383,6 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 - import-in-the-middle@1.14.2: - dependencies: - acorn: 8.15.0 - acorn-import-attributes: 1.9.5(acorn@8.15.0) - cjs-module-lexer: 1.4.3 - module-details-from-path: 1.0.4 - import-local@3.2.0: dependencies: pkg-dir: 4.2.0 @@ -6569,10 +4895,6 @@ snapshots: jsesc@3.1.0: {} - json-bigint@1.0.0: - dependencies: - bignumber.js: 9.3.1 - json-buffer@3.0.1: {} json-parse-even-better-errors@2.3.1: {} @@ -6628,14 +4950,10 @@ snapshots: dependencies: p-locate: 5.0.0 - lodash.camelcase@4.3.0: {} - lodash.memoize@4.1.2: {} lodash.merge@4.6.2: {} - long@5.3.2: {} - lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -6685,8 +5003,6 @@ snapshots: dependencies: minimist: 1.2.8 - module-details-from-path@1.0.4: {} - ms@2.1.3: {} nanoid@3.3.11: {} @@ -6698,10 +5014,6 @@ snapshots: node-addon-api@7.1.1: optional: true - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - node-int64@0.4.0: {} node-releases@2.0.20: {} @@ -6813,18 +5125,6 @@ snapshots: estree-walker: 3.0.3 is-reference: 3.0.3 - pg-int8@1.0.1: {} - - pg-protocol@1.10.3: {} - - pg-types@2.2.0: - dependencies: - pg-int8: 1.0.1 - postgres-array: 2.0.0 - postgres-bytea: 1.0.0 - postgres-date: 1.0.7 - postgres-interval: 1.2.0 - picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -6863,18 +5163,6 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - postgres-array@2.0.0: {} - - postgres-bytea@1.0.0: {} - - postgres-date@1.0.7: {} - - postgres-interval@1.2.0: - dependencies: - xtend: 4.0.2 - - postgres@3.4.7: {} - prelude-ls@1.2.1: {} prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@4.2.20): @@ -6895,21 +5183,6 @@ snapshots: kleur: 3.0.3 sisteransi: 1.0.5 - protobufjs@7.5.4: - 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': 22.18.1 - long: 5.3.2 - punycode@2.3.1: {} pure-rand@6.1.0: {} @@ -6948,14 +5221,6 @@ snapshots: require-directory@2.1.1: {} - require-in-the-middle@7.5.2: - dependencies: - debug: 4.4.1 - module-details-from-path: 1.0.4 - resolve: 1.22.10 - transitivePeerDependencies: - - supports-color - resolve-cwd@3.0.0: dependencies: resolve-from: 5.0.0 @@ -7261,8 +5526,6 @@ snapshots: dependencies: is-number: 7.0.0 - tr46@0.0.3: {} - ts-api-utils@1.4.3(typescript@5.9.3): dependencies: typescript: 5.9.3 @@ -7367,8 +5630,6 @@ snapshots: util-deprecate@1.0.2: {} - uuid@9.0.1: {} - v8-to-istanbul@9.3.0: dependencies: '@jridgewell/trace-mapping': 0.3.30 @@ -7379,13 +5640,6 @@ snapshots: dependencies: makeerror: 1.0.12 - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 @@ -7448,8 +5702,6 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 3.0.7 - xtend@4.0.2: {} - y18n@5.0.8: {} yallist@3.1.1: {} diff --git a/packages/measurements-otlp/.eslintrc.js b/packages/measurements-otlp/.eslintrc.js deleted file mode 100644 index 72235dc283..0000000000 --- a/packages/measurements-otlp/.eslintrc.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = { - extends: ['./node_modules/@hcengineering/platform-rig/profiles/default/eslint.config.json'], - parserOptions: { - tsconfigRootDir: __dirname, - project: './tsconfig.json' - } -} diff --git a/packages/measurements-otlp/.npmignore b/packages/measurements-otlp/.npmignore deleted file mode 100644 index 9b083cb0c4..0000000000 --- a/packages/measurements-otlp/.npmignore +++ /dev/null @@ -1,8 +0,0 @@ -* -!/lib/** -!/types/** -!/src/** -!CHANGELOG.md -/lib/**/__test__/ -/types/**/__test__/ -/src/**/__test__/ \ No newline at end of file diff --git a/packages/measurements-otlp/CHANGELOG.json b/packages/measurements-otlp/CHANGELOG.json deleted file mode 100644 index 544027e975..0000000000 --- a/packages/measurements-otlp/CHANGELOG.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "name": "@hcengineering/measurements-otlp", - "entries": [ - { - "version": "0.7.12", - "tag": "@hcengineering/measurements-otlp_v0.7.12", - "date": "Sat, 11 Oct 2025 19:18:56 GMT", - "comments": { - "patch": [ - { - "comment": "rollback eslint" - } - ], - "dependency": [ - { - "comment": "Updating dependency \"@hcengineering/measurements\" from `^0.7.11` to `0.7.12`" - }, - { - "comment": "Updating dependency \"@hcengineering/platform-rig\" from `^0.7.14` to `0.7.15`" - } - ] - } - }, - { - "version": "0.7.11", - "tag": "@hcengineering/measurements-otlp_v0.7.11", - "date": "Sat, 11 Oct 2025 17:58:53 GMT", - "comments": { - "none": [ - { - "comment": "Add tests" - } - ], - "patch": [ - { - "comment": "Fix eslint deps" - } - ], - "dependency": [ - { - "comment": "Updating dependency \"@hcengineering/measurements\" from `^0.7.10` to `0.7.11`" - }, - { - "comment": "Updating dependency \"@hcengineering/platform-rig\" from `^0.7.12` to `0.7.13`" - } - ] - } - }, - { - "version": "0.7.10", - "tag": "@hcengineering/measurements-otlp_v0.7.10", - "date": "Fri, 10 Oct 2025 12:32:59 GMT", - "comments": { - "dependency": [ - { - "comment": "Updating dependency \"@hcengineering/platform-rig\" from `^0.7.10` to `0.7.11`" - } - ] - } - } - ] -} diff --git a/packages/measurements-otlp/CHANGELOG.md b/packages/measurements-otlp/CHANGELOG.md deleted file mode 100644 index 04a7b9b1eb..0000000000 --- a/packages/measurements-otlp/CHANGELOG.md +++ /dev/null @@ -1,23 +0,0 @@ -# Change Log - @hcengineering/measurements-otlp - -This log was last generated on Sat, 11 Oct 2025 19:18:56 GMT and should not be manually modified. - -## 0.7.12 -Sat, 11 Oct 2025 19:18:56 GMT - -### Patches - -- rollback eslint - -## 0.7.11 -Sat, 11 Oct 2025 17:58:53 GMT - -### Patches - -- Fix eslint deps - -## 0.7.10 -Fri, 10 Oct 2025 12:32:59 GMT - -_Initial release_ - diff --git a/packages/measurements-otlp/config/rig.json b/packages/measurements-otlp/config/rig.json deleted file mode 100644 index 0110930f55..0000000000 --- a/packages/measurements-otlp/config/rig.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "$schema": "https://developer.microsoft.com/json-schemas/rig-package/rig.schema.json", - "rigPackageName": "@hcengineering/platform-rig" -} diff --git a/packages/measurements-otlp/jest.config.js b/packages/measurements-otlp/jest.config.js deleted file mode 100644 index 2cfd408b67..0000000000 --- a/packages/measurements-otlp/jest.config.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = { - preset: 'ts-jest', - testEnvironment: 'node', - testMatch: ['**/?(*.)+(spec|test).[jt]s?(x)'], - roots: ["./src"], - coverageReporters: ["text-summary", "html"] -} diff --git a/packages/measurements-otlp/package.json b/packages/measurements-otlp/package.json deleted file mode 100644 index 6d22efb276..0000000000 --- a/packages/measurements-otlp/package.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "name": "@hcengineering/measurements-otlp", - "version": "0.7.12", - "main": "lib/index.js", - "svelte": "src/index.ts", - "types": "types/index.d.ts", - "files": [ - "lib/**/*", - "!lib/**/__test__/**", - "types/**/*", - "!types/**/__test__/**", - "src/**/*", - "!src/**/__test__/**", - "README.md", - "CHANGELOG.md" - ], - "author": "Anticrm Platform Contributors", - "license": "EPL-2.0", - "scripts": { - "build": "compile", - "build:watch": "compile", - "test": "jest --passWithNoTests --silent", - "format": "format src", - "_phase:build": "compile transpile src", - "_phase:test": "jest --passWithNoTests --silent", - "_phase:format": "format src", - "_phase:validate": "compile validate" - }, - "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.19", - "jest": "^29.7.0", - "ts-jest": "^29.1.1", - "@types/jest": "^29.5.5", - "@typescript-eslint/eslint-plugin": "^6.21.0", - "@typescript-eslint/parser": "^6.21.0", - "eslint": "^8.54.0", - "eslint-config-standard-with-typescript": "^40.0.0", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^6.1.1", - "eslint-plugin-n": "^15.4.0" - }, - "dependencies": { - "@hcengineering/measurements": "workspace:^0.7.13", - "@opentelemetry/sdk-node": "^0.203.0", - "@opentelemetry/sdk-logs": "^0.203.0", - "@opentelemetry/auto-instrumentations-node": "^0.62.0", - "@opentelemetry/resources": "^2.0.1", - "@opentelemetry/sdk-trace-node": "^2.0.1", - "@opentelemetry/api": "^1.9.0", - "@opentelemetry/core": "^2.0.1", - "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", - "@opentelemetry/exporter-logs-otlp-http": "^0.203.0", - "@opentelemetry/otlp-exporter-base": "^0.203.0", - "@opentelemetry/id-generator-aws-xray": "^2.0.0", - "@opentelemetry/exporter-metrics-otlp-http": "^0.203.0", - "@opentelemetry/api-logs": "^0.203.0", - "@opentelemetry/sdk-metrics": "^2.0.1" - }, - "repository": "https://github.com/hcengineering/huly.utils", - "exports": { - ".": { - "types": "./types/index.d.ts", - "require": "./lib/index.js", - "import": "./lib/index.js" - } - }, - "publishConfig": { - "access": "public" - } -} diff --git a/packages/measurements-otlp/src/__tests__/telemetry.test.ts b/packages/measurements-otlp/src/__tests__/telemetry.test.ts deleted file mode 100644 index 660147942f..0000000000 --- a/packages/measurements-otlp/src/__tests__/telemetry.test.ts +++ /dev/null @@ -1,451 +0,0 @@ -import { newMetrics, type MeasureLogger } from '@hcengineering/measurements' -import { context, trace } from '@opentelemetry/api' -import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node' -import { OpenTelemetryMetricsContext } from '../telemetry' - -describe('telemetry', () => { - let tracer: any - let provider: NodeTracerProvider - - beforeAll(() => { - provider = new NodeTracerProvider() - provider.register() - tracer = trace.getTracer('test-tracer') - }) - - afterAll(() => { - void provider.shutdown() - }) - - describe('OpenTelemetryMetricsContext', () => { - const mockLogger: MeasureLogger = { - info: jest.fn(), - error: jest.fn(), - warn: jest.fn(), - close: jest.fn(async () => {}), - logOperation: jest.fn() - } - - beforeEach(() => { - jest.clearAllMocks() - }) - - it('should create a new context with tracer', () => { - const metrics = newMetrics() - const ctx = new OpenTelemetryMetricsContext( - 'test', - tracer, - undefined, - undefined, - { op: 'create' }, - {}, - metrics, - mockLogger - ) - - expect(ctx).toBeDefined() - expect(ctx.metrics).toBe(metrics) - expect(ctx.logger).toBe(mockLogger) - }) - - it('should create child context with span', () => { - const metrics = newMetrics() - const ctx = new OpenTelemetryMetricsContext( - 'parent', - tracer, - context.active(), - undefined, - {}, - {}, - metrics, - mockLogger - ) - - const child = ctx.newChild('child', { op: 'child' }, { span: true }) - - expect(child).toBeDefined() - expect(child.parent).toBe(ctx) - }) - - it('should create child context without span when span is false', () => { - const metrics = newMetrics() - const ctx = new OpenTelemetryMetricsContext( - 'parent', - tracer, - context.active(), - undefined, - {}, - {}, - metrics, - mockLogger - ) - - const child = ctx.newChild('child', { op: 'child' }, { span: false }) - - expect(child).toBeDefined() - }) - - it('should execute async operation with context', async () => { - const metrics = newMetrics() - const ctx = new OpenTelemetryMetricsContext( - 'test', - tracer, - context.active(), - undefined, - {}, - {}, - metrics, - mockLogger - ) - - let executed = false - await ctx.with('operation', { op: 'test' }, async () => { - executed = true - await new Promise((resolve) => setTimeout(resolve, 10)) - }) - - expect(executed).toBe(true) - expect(metrics.measurements.operation).toBeDefined() - }) - - it('should execute sync operation with context', () => { - const metrics = newMetrics() - const ctx = new OpenTelemetryMetricsContext( - 'test', - tracer, - context.active(), - undefined, - {}, - {}, - metrics, - mockLogger - ) - - const result = ctx.withSync('operation', { op: 'test' }, () => { - return 42 - }) - - expect(result).toBe(42) - expect(metrics.measurements.operation).toBeDefined() - }) - - it('should handle errors in async operations', async () => { - const metrics = newMetrics() - const span = tracer.startSpan('test-span') - const ctx = new OpenTelemetryMetricsContext('test', tracer, context.active(), span, {}, {}, metrics, mockLogger) - - await expect( - ctx.with('operation', { op: 'test' }, async () => { - throw new Error('Test error') - }) - ).rejects.toThrow('Test error') - - expect(metrics.measurements.operation).toBeDefined() - }) - - it('should measure custom value with meter', () => { - const metrics = newMetrics() - const mockMeter = { - getCounter: jest.fn(() => ({ - counter: { record: jest.fn() }, - value: 0 - })) - } - - const ctx = new OpenTelemetryMetricsContext( - 'test', - tracer, - undefined, - undefined, - { op: 'test' }, - {}, - metrics, - mockLogger, - undefined, - undefined, - undefined, - mockMeter as any - ) - - ctx.measure('custom', 100) - - expect(mockMeter.getCounter).toHaveBeenCalledWith('custom') - }) - - it('should log info with OTLP logger', () => { - const metrics = newMetrics() - const mockOtlpLogger = { - emit: jest.fn() - } - - const ctx = new OpenTelemetryMetricsContext( - 'test', - tracer, - context.active(), - undefined, - { op: 'test' }, - {}, - metrics, - mockLogger, - undefined, - undefined, - mockOtlpLogger as any - ) - - ctx.info('Test message', { key: 'value' }) - - expect(mockOtlpLogger.emit).toHaveBeenCalled() - expect(mockLogger.info).toHaveBeenCalled() - }) - - it('should log error with OTLP logger', () => { - const metrics = newMetrics() - const mockOtlpLogger = { - emit: jest.fn() - } - - const ctx = new OpenTelemetryMetricsContext( - 'test', - tracer, - context.active(), - undefined, - { op: 'test' }, - {}, - metrics, - mockLogger, - undefined, - undefined, - mockOtlpLogger as any - ) - - ctx.error('Error message', { error: 'details' }) - - expect(mockOtlpLogger.emit).toHaveBeenCalled() - expect(mockLogger.error).toHaveBeenCalled() - }) - - it('should log warn with OTLP logger', () => { - const metrics = newMetrics() - const mockOtlpLogger = { - emit: jest.fn() - } - - const ctx = new OpenTelemetryMetricsContext( - 'test', - tracer, - context.active(), - undefined, - { op: 'test' }, - {}, - metrics, - mockLogger, - undefined, - undefined, - mockOtlpLogger as any - ) - - ctx.warn('Warning message', { warning: 'info' }) - - expect(mockOtlpLogger.emit).toHaveBeenCalled() - expect(mockLogger.warn).toHaveBeenCalled() - }) - - it('should extract metadata from context', () => { - const metrics = newMetrics() - const ctx = new OpenTelemetryMetricsContext( - 'test', - tracer, - context.active(), - undefined, - {}, - {}, - metrics, - mockLogger - ) - - const meta = ctx.extractMeta() - - expect(meta).toBeDefined() - expect(typeof meta).toBe('object') - }) - - it('should get params', () => { - const metrics = newMetrics() - const ctx = new OpenTelemetryMetricsContext( - 'test', - tracer, - undefined, - undefined, - { op: 'test', method: 'GET' }, - {}, - metrics, - mockLogger - ) - - const params = ctx.getParams() - - expect(params).toEqual({ op: 'test', method: 'GET' }) - }) - - it('should share contextData with children', () => { - const metrics = newMetrics() - const ctx = new OpenTelemetryMetricsContext( - 'parent', - tracer, - context.active(), - undefined, - {}, - {}, - metrics, - mockLogger - ) - ctx.contextData = { userId: '123' } - - const child = ctx.newChild('child', {}) - - expect(child.contextData).toBe(ctx.contextData) - }) - - it('should inherit params when inheritParams is true', async () => { - const metrics = newMetrics() - const ctx = new OpenTelemetryMetricsContext( - 'parent', - tracer, - context.active(), - undefined, - { parentKey: 'parentValue' }, - {}, - metrics, - mockLogger - ) - - await ctx.with( - 'child', - { childKey: 'childValue' }, - async (childCtx) => { - expect(childCtx.getParams()).toEqual({ childKey: 'childValue' }) - }, - {}, - { inheritParams: false } - ) - - await ctx.with( - 'child', - { childKey: 'childValue' }, - async (childCtx) => { - expect(childCtx.getParams()).toEqual({ - parentKey: 'parentValue', - childKey: 'childValue' - }) - }, - {}, - { inheritParams: true } - ) - }) - - it('should not call end() twice', () => { - const metrics = newMetrics() - const span = tracer.startSpan('test-span') - const spanEndSpy = jest.spyOn(span, 'end') - - const ctx = new OpenTelemetryMetricsContext('test', tracer, context.active(), span, {}, {}, metrics, mockLogger) - - ctx.end() - ctx.end() // Second call should be no-op - - expect(spanEndSpy).toHaveBeenCalledTimes(1) - }) - - it('should handle null return value', async () => { - const metrics = newMetrics() - const ctx = new OpenTelemetryMetricsContext( - 'test', - tracer, - context.active(), - undefined, - {}, - {}, - metrics, - mockLogger - ) - - const result = await ctx.with('operation', {}, () => null) - - expect(result).toBeUndefined() - }) - - it('should log operation when log option is true', async () => { - const metrics = newMetrics() - const ctx = new OpenTelemetryMetricsContext( - 'test', - tracer, - context.active(), - undefined, - {}, - {}, - metrics, - mockLogger - ) - - await ctx.with( - 'operation', - { op: 'test' }, - async () => { - await new Promise((resolve) => setTimeout(resolve, 10)) - }, - {}, - { log: true } - ) - - expect(mockLogger.logOperation).toHaveBeenCalledWith( - 'operation', - expect.any(Number), - expect.objectContaining({ op: 'test' }) - ) - }) - - it('should suppress tracing when span is disable', () => { - const metrics = newMetrics() - const ctx = new OpenTelemetryMetricsContext( - 'parent', - tracer, - context.active(), - undefined, - {}, - {}, - metrics, - mockLogger - ) - - const child = ctx.newChild('child', {}, { span: 'disable' }) - - expect(child).toBeDefined() - }) - - it('should set span attributes from params', () => { - const metrics = newMetrics() - - const ctx = new OpenTelemetryMetricsContext( - 'parent', - tracer, - context.active(), - undefined, - {}, - {}, - metrics, - mockLogger - ) - - // When creating a child with span: true, attributes are set on the child's span - const child = ctx.newChild( - 'child', - { key1: 'value1', key2: 'value2' }, - { span: true } - ) as OpenTelemetryMetricsContext - - // The child should have been created successfully - expect(child).toBeDefined() - expect(child.parent).toBe(ctx) - }) - }) -}) diff --git a/packages/measurements-otlp/src/index.ts b/packages/measurements-otlp/src/index.ts deleted file mode 100644 index 8b5ba81c39..0000000000 --- a/packages/measurements-otlp/src/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './telemetry' diff --git a/packages/measurements-otlp/src/telemetry.ts b/packages/measurements-otlp/src/telemetry.ts deleted file mode 100644 index da1a492250..0000000000 --- a/packages/measurements-otlp/src/telemetry.ts +++ /dev/null @@ -1,632 +0,0 @@ -import { - childMetrics, - consoleLogger, - MeasureContext, - MeasureMetricsContext, - newMetrics, - noParamsLogger, - nullPromise, - platformNow, - platformNowDiff, - updateMeasure, - type FullParamsType, - type MeasureLogger, - type Metrics, - type ParamsType, - type WithOptions -} from '@hcengineering/measurements' -import { - context, - metrics as otelMetrics, - propagation, - Span, - SpanStatusCode, - trace, - type Context, - type Gauge, - type Meter, - type Tracer -} from '@opentelemetry/api' -import { Logger, SeverityNumber } from '@opentelemetry/api-logs' -import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node' -import { suppressTracing } from '@opentelemetry/core' -import { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http' -import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http' -import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http' -import { AWSXRayIdGenerator } from '@opentelemetry/id-generator-aws-xray' -import { CompressionAlgorithm } from '@opentelemetry/otlp-exporter-base' -import { resourceFromAttributes } from '@opentelemetry/resources' -import { BatchLogRecordProcessor, LoggerProvider } from '@opentelemetry/sdk-logs' -import { PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics' -import { NodeSDK } from '@opentelemetry/sdk-node' -import { BatchSpanProcessor } from '@opentelemetry/sdk-trace-node' - -class MetricsContext { - counters = new Map() - constructor (readonly meter?: Meter) {} - - getCounter (name: string): { counter: Gauge, value: number } | undefined { - if (this.meter === undefined) { - return undefined - } - let counter = this.counters.get(name) - if (counter === undefined) { - counter = { counter: this.meter.createGauge(name), value: 0 } - this.counters.set(name, counter) - } - return counter - } -} - -/** - * @public - */ -export class OpenTelemetryMetricsContext implements MeasureContext { - private readonly name: string - private readonly params: ParamsType - - private readonly fullParams: FullParamsType | (() => FullParamsType) = {} - logger: MeasureLogger - metrics: Metrics - id?: string - - st = platformNow() - contextData: object = {} - isDone = false - doneTrace: string = '' - - private done (value?: number, override?: boolean): void { - if (!this.isDone) { - this.doneTrace = new Error().stack ?? '' - this.isDone = true - updateMeasure(this.metrics, this.st, this.params, this.fullParams, (spend) => {}, value, override) - this.span?.end() - } - } - - constructor ( - name: string, - readonly tracer: Tracer, - readonly context: Context | undefined, - readonly span: Span | undefined, - params: ParamsType, - fullParams: FullParamsType | (() => FullParamsType) = {}, - metrics: Metrics = newMetrics(), - logger?: MeasureLogger, - readonly parent?: MeasureContext, - readonly logParams?: ParamsType, - - readonly otlpLogger?: Logger, - readonly meter?: MetricsContext - ) { - this.name = name - this.params = params - this.fullParams = fullParams - this.metrics = metrics - this.metrics.namedParams = this.metrics.namedParams ?? {} - for (const [k, v] of Object.entries(params)) { - if (this.metrics.namedParams[k] !== v) { - this.metrics.namedParams[k] = v - } else { - this.metrics.namedParams[k] = '*' - } - } - - this.logger = logger ?? (this.logParams != null ? consoleLogger(this.logParams ?? {}) : noParamsLogger) - } - - measure (name: string, value: number, override?: boolean): void { - const cnt = this.meter?.getCounter(name) - if (cnt !== undefined) { - if (cnt.value !== value) { - cnt.counter.record(value, this.params) - cnt.value = value - } - } - } - - newChild ( - name: string, - params: ParamsType, - opt?: { - fullParams?: FullParamsType - logger?: MeasureLogger - span?: WithOptions['span'] // By default true - meta?: Record - } - ): MeasureContext { - let _span: Span | undefined - let childContext: Context | undefined - if (opt?.span === true || opt?.span === 'inherit') { - childContext = opt?.span === 'inherit' ? context.active() : (this.context ?? context.active()) - - if (opt.meta !== undefined && Object.keys(opt.meta).length > 0) { - // We need to set meta params - childContext = propagation.extract(childContext ?? context.active(), opt.meta) - } - _span = this.tracer.startSpan(name, undefined, childContext) - - const spanParams = [...Object.entries(params)] - for (const [k, v] of spanParams) { - _span?.setAttribute(k, v as any) - } - } - if (opt?.span === 'disable') { - childContext = suppressTracing(childContext ?? context.active()) - } - if (childContext !== undefined && _span !== undefined) { - childContext = trace.setSpan(childContext, _span) - } - - const result = new OpenTelemetryMetricsContext( - name, - this.tracer, - childContext, - _span, - params, - opt?.fullParams ?? {}, - childMetrics(this.metrics, [name]), - opt?.logger ?? this.logger, - this, - this.logParams, - this.otlpLogger, - this.meter - ) - result.id = this.id - result.contextData = this.contextData - return result - } - - extractMeta (): Record { - const headers: Record = {} - if (this.context !== undefined) { - propagation.inject(this.context, headers) - } - return headers - } - - with( - name: string, - params: ParamsType, - op: (ctx: MeasureContext) => T | Promise, - fullParams?: ParamsType | (() => FullParamsType), - opt?: WithOptions - ): Promise { - const c = this.newChild(name, opt?.inheritParams === true ? { ...this.params, ...params } : params, { - fullParams, - logger: this.logger, - span: opt?.span ?? true, - meta: opt?.meta - }) - let needFinally = true - try { - const _context = (c as OpenTelemetryMetricsContext).context - - const span = (c as OpenTelemetryMetricsContext).span - - const value = _context !== undefined ? context.with(_context, () => op(c)) : op(c) - if (value instanceof Promise) { - needFinally = false - if (span !== undefined) { - void value.catch((err) => { - span?.recordException(err) - span?.setStatus({ - code: SpanStatusCode.ERROR, - message: err.message - }) - }) - } - return value.finally(() => { - if (span !== undefined) { - const fParams = typeof fullParams === 'function' ? fullParams() : fullParams - const spanParams = [...Object.entries(params), ...Object.entries(fParams ?? {})] - for (const [k, v] of spanParams) { - span?.setAttribute(k, typeof v === 'object' ? JSON.stringify(v) : v) - } - } - c.end() - if (opt?.log === true) { - this.logger.logOperation(name, platformNowDiff((c as OpenTelemetryMetricsContext).st), { - ...params, - ...fullParams - }) - } - }) - } else { - if (value == null) { - return nullPromise as Promise - } - return Promise.resolve(value) - } - } finally { - if (needFinally) { - c.end() - } - } - } - - withSync( - name: string, - params: ParamsType, - op: (ctx: MeasureContext) => T, - fullParams?: ParamsType | (() => FullParamsType), - opt?: WithOptions - ): T { - const c = this.newChild(name, params, { fullParams, logger: this.logger, span: opt?.span ?? true }) - const _context = (c as OpenTelemetryMetricsContext).context - try { - return _context !== undefined ? context.with(_context, () => op(c)) : op(c) - } finally { - c.end() - } - } - - error (message: string, args?: Record): void { - if (this.otlpLogger !== undefined) { - this.otlpLogger.emit({ - severityNumber: SeverityNumber.ERROR, - severityText: 'error', - context: this.context, - body: message, - attributes: { - 'service.name': sdkServiceName, - ...(args ?? {}) - } - }) - } - this.logger.error(message, { ...this.params, ...args, ...(this.logParams ?? {}) }) - } - - info (message: string, args?: Record): void { - if (this.otlpLogger !== undefined) { - this.otlpLogger.emit({ - context: this.context, - severityNumber: SeverityNumber.INFO, - severityText: 'info', - body: message, - attributes: { - 'service.name': sdkServiceName, - ...(args ?? {}) - } - }) - } - this.logger.info(message, { ...this.params, ...args, ...(this.logParams ?? {}) }) - } - - warn (message: string, args?: Record): void { - if (this.otlpLogger !== undefined) { - this.otlpLogger.emit({ - severityNumber: SeverityNumber.WARN, - severityText: 'warn', - context: this.context, - body: message, - attributes: { - 'service.name': sdkServiceName, - ...(args ?? {}) - } - }) - } - this.logger.warn(message, { ...this.params, ...args, ...(this.logParams ?? {}) }) - } - - end (): void { - this.done() - } - - getParams (): ParamsType { - return this.params - } -} - -/** - * Parse W3C baggage header format to Record - * - * W3C baggage format: "key1=value1,key2=value2;property=value,key3=value3" - * Returns only the key-value pairs, ignoring properties - */ -function parseBaggage (baggageHeader?: string): Record { - if (baggageHeader == null || typeof baggageHeader !== 'string') { - return {} - } - - const result: Record = {} - - // Split by comma to get individual baggage members - const members = baggageHeader.split(',') - - for (const member of members) { - const trimmedMember = member.trim() - if (trimmedMember === '') continue - - // Split by semicolon to separate key=value from properties - const parts = trimmedMember.split(';') - const keyValuePart = parts[0]?.trim() - - if (keyValuePart == null) continue - - // Split by equals to get key and value - const equalIndex = keyValuePart.indexOf('=') - if (equalIndex === -1) continue - - const key = keyValuePart.substring(0, equalIndex).trim() - const value = keyValuePart.substring(equalIndex + 1).trim() - - if (key != null) { - // URL decode the key and value - try { - const decodedKey = decodeURIComponent(key) - const decodedValue = decodeURIComponent(value) - result[decodedKey] = decodedValue - } catch (error) { - // If decoding fails, use the original values - result[key] = value - } - } - } - - return result -} - -let sdk: NodeSDK | undefined -let sdkServiceName: string | undefined -let sdkServiceVersion: string | undefined -let loggerProvider: LoggerProvider | undefined - -export function initOpenTelemetrySDK (serviceName: string, version: string): boolean { - if (sdk !== undefined) { - return true - } - process.env.OTEL_SERVICE_NAME = serviceName - process.env.OTEL_SERVICE_VERSION = version - - sdkServiceName = serviceName - sdkServiceVersion = version - const tracesUrl = getTracesUrl() - - if (tracesUrl === undefined) { - return false - } - - const traceHeaders = parseTraceExporterHeaders() - - const exporter = new OTLPTraceExporter({ - url: tracesUrl, - headers: traceHeaders, - compression: - (process.env.OTEL_EXPORTER_OTLP_COMPRESSION as CompressionAlgorithm) ?? - (process.env.OTEL_EXPORTER_OTLP_TRACES_COMPRESSION as CompressionAlgorithm) ?? - CompressionAlgorithm.GZIP, - keepAlive: true - }) - - const batchSpanProcessor = new BatchSpanProcessor(exporter, { - maxExportBatchSize: parseInt(process.env.OTEL_EXPORTER_OTLP_TRACES_MAX_EXPORT_BATCH_SIZE ?? '1000'), - maxQueueSize: parseInt(process.env.OTEL_EXPORTER_OTLP_TRACES_MAX_QUEUE_SIZE ?? '1000') - }) - - // Logs - const logsEndpoint = getLogsUrl() - const logHeaders = parseLogsExporterHeaders() - const logExporter = new OTLPLogExporter({ - url: logsEndpoint, - headers: logHeaders, - compression: - (process.env.OTEL_EXPORTER_OTLP_COMPRESSION as CompressionAlgorithm) ?? - (process.env.OTEL_EXPORTER_OTLP_LOGS_COMPRESSION as CompressionAlgorithm) ?? - CompressionAlgorithm.GZIP, - keepAlive: true - }) - - const batchLogProcessor = new BatchLogRecordProcessor(logExporter, { - maxExportBatchSize: parseInt(process.env.OTEL_EXPORTER_OTLP_LOGS_MAX_EXPORT_BATCH_SIZE ?? '1000'), - maxQueueSize: parseInt(process.env.OTEL_EXPORTER_OTLP_LOGS_MAX_QUEUE_SIZE ?? '1000') - }) - - // Metrics - - const metricsUrl = getMetricsUrl() - const metricsHeaders = parseMetricsExporterHeaders() - const metricsExporter = new OTLPMetricExporter({ - url: metricsUrl, - headers: metricsHeaders - }) - const metricReader = new PeriodicExportingMetricReader({ - exporter: metricsExporter, - exportIntervalMillis: 15000 - }) - - // SDK - - sdk = new NodeSDK({ - spanProcessors: [batchSpanProcessor], - serviceName, - traceExporter: exporter, - resource: resourceFromAttributes({ - 'service-name': serviceName, - 'service-version': version ?? '0.7', - 'deployment-environment': process.env.OTEL_ENVIRONMENT - }), - instrumentations: [getNodeAutoInstrumentations()], - idGenerator: new AWSXRayIdGenerator(), - logRecordProcessors: [batchLogProcessor], - metricReader - }) - - sdk.start() - - loggerProvider = new LoggerProvider({ - processors: [batchLogProcessor] - }) - - // Graceful shutdown - process.on('SIGTERM', () => { - sdk - ?.shutdown() - .then(() => { - console.log('Tracing terminated') - }) - .catch((error) => { - console.log('Error terminating tracing', error) - }) - .finally(() => process.exit(0)) - }) - console.log('Using open telemetry metrics context', { - traceEndpoint: tracesUrl, - tracerHeadersSet: Array.from(Object.keys(traceHeaders)), - logsEndpoint, - logHeadersSet: Array.from(Object.keys(logHeaders)) - }) - return true -} - -export function reportOTELError (error: Error, attributes?: Record): void { - if (sdkServiceName !== undefined && sdkServiceVersion !== undefined && loggerProvider !== undefined) { - const otlpLogger = loggerProvider?.getLogger(sdkServiceName, sdkServiceVersion) - otlpLogger?.emit({ - severityNumber: SeverityNumber.ERROR, - severityText: 'error', - body: error.message, - context: context.active(), - attributes: { - ...attributes, - 'service.name': sdkServiceName, - 'service.version': sdkServiceVersion, - 'error.stack': error.stack - } - }) - } -} - -export function reportOTEL ( - severity: 'info' | 'warning', - message: string, - time: number, - attributes?: Record -): void { - if (sdkServiceName !== undefined && sdkServiceVersion !== undefined && loggerProvider !== undefined) { - const otlpLogger = loggerProvider?.getLogger(sdkServiceName, sdkServiceVersion) - otlpLogger?.emit({ - severityNumber: severity === 'info' ? SeverityNumber.INFO : SeverityNumber.WARN, - body: message, - severityText: severity, - timestamp: time, - context: context.active(), - attributes: { - ...attributes, - 'service.name': sdkServiceName, - 'service.version': sdkServiceVersion - } - }) - } -} - -export function createOpenTelemetryMetricsContext ( - name: string, - params: ParamsType, - fullParams: FullParamsType | (() => FullParamsType) = {}, - metrics: Metrics = newMetrics(), - logger?: MeasureLogger, - version?: string -): MeasureContext { - if (!initOpenTelemetrySDK(name, version ?? '')) { - console.warn('OTEL_EXPORTER_OTLP_TRACES_ENDPOINT is not set, OpenTelemetry metrics will not be sent') - return new MeasureMetricsContext(name, params, fullParams, metrics, logger) - } - - // Traces - - const tracer = trace.getTracer(name) - - const otlpLogger = - process.env.OTEL_LOGGER_ENABLED === 'true' ? loggerProvider?.getLogger(sdkServiceName ?? name, version) : undefined - - const meter = otelMetrics.getMeter(name, version) - - const ctx = new OpenTelemetryMetricsContext( - name, - tracer, - undefined, - undefined, - params, - fullParams, - metrics, - logger, - undefined, - undefined, - otlpLogger, - new MetricsContext(meter) - ) - return ctx -} -function parseTraceExporterHeaders (): Record { - const headers: Record = parseBaggage(process.env.OTEL_EXPORTER_OTLP_HEADERS) ?? {} - - if (process.env.OTEL_EXPORTER_OTLP_TRACES_HEADERS !== undefined) { - const extraHeaders = parseBaggage(process.env.OTEL_EXPORTER_OTLP_TRACES_HEADERS) - for (const [key, value] of Object.entries(extraHeaders)) { - headers[key] = value - } - } - return headers -} - -function getTracesUrl (): string | undefined { - let tracesUrl = process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT ?? process.env.OTEL_EXPORTER_OTLP_ENDPOINT - - if (tracesUrl !== undefined && !tracesUrl.endsWith('/v1/traces')) { - if (tracesUrl.endsWith('/')) { - tracesUrl += 'v1/traces' - } else { - tracesUrl += '/v1/traces' - } - } - return tracesUrl -} - -function getLogsUrl (): string | undefined { - let logsUrl = process.env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT ?? process.env.OTEL_EXPORTER_OTLP_ENDPOINT - - if (logsUrl !== undefined && !logsUrl.endsWith('/v1/logs')) { - if (logsUrl.endsWith('/')) { - logsUrl += 'v1/logs' - } else { - logsUrl += '/v1/logs' - } - } - return logsUrl -} -function parseLogsExporterHeaders (): Record { - const headers: Record = parseBaggage(process.env.OTEL_EXPORTER_OTLP_HEADERS) ?? {} - - if (process.env.OTEL_EXPORTER_OTLP_LOGS_HEADERS !== undefined) { - const extraHeaders = parseBaggage(process.env.OTEL_EXPORTER_OTLP_LOGS_HEADERS) - for (const [key, value] of Object.entries(extraHeaders)) { - headers[key] = value - } - } - return headers -} - -function getMetricsUrl (): string | undefined { - let metricsUrl = process.env.OTEL_EXPORTER_OTLP_METRICS_ENDPOINT ?? process.env.OTEL_EXPORTER_OTLP_ENDPOINT - - if (metricsUrl !== undefined && !metricsUrl.endsWith('/v1/metrics')) { - if (metricsUrl.endsWith('/')) { - metricsUrl += 'v1/metrics' - } else { - metricsUrl += '/v1/metrics' - } - } - return metricsUrl -} -function parseMetricsExporterHeaders (): Record { - const headers: Record = parseBaggage(process.env.OTEL_EXPORTER_OTLP_HEADERS) ?? {} - - if (process.env.OTEL_EXPORTER_OTLP_METRICS_HEADERS !== undefined) { - const extraHeaders = parseBaggage(process.env.OTEL_EXPORTER_OTLP_METRICS_HEADERS) - for (const [key, value] of Object.entries(extraHeaders)) { - headers[key] = value - } - } - return headers -} diff --git a/packages/measurements-otlp/tsconfig.json b/packages/measurements-otlp/tsconfig.json deleted file mode 100644 index b5ae22f6e4..0000000000 --- a/packages/measurements-otlp/tsconfig.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "./node_modules/@hcengineering/platform-rig/profiles/default/tsconfig.json", - - "compilerOptions": { - "rootDir": "./src", - "outDir": "./lib", - "declarationDir": "./types", - "tsBuildInfoFile": ".build/build.tsbuildinfo" - }, - "include": ["src/**/*"], - "exclude": ["node_modules", "lib", "dist", "types", "bundle"] -} \ No newline at end of file diff --git a/packages/measurements/.eslintrc.js b/packages/measurements/.eslintrc.js deleted file mode 100644 index 72235dc283..0000000000 --- a/packages/measurements/.eslintrc.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = { - extends: ['./node_modules/@hcengineering/platform-rig/profiles/default/eslint.config.json'], - parserOptions: { - tsconfigRootDir: __dirname, - project: './tsconfig.json' - } -} diff --git a/packages/measurements/.npmignore b/packages/measurements/.npmignore deleted file mode 100644 index 9b083cb0c4..0000000000 --- a/packages/measurements/.npmignore +++ /dev/null @@ -1,8 +0,0 @@ -* -!/lib/** -!/types/** -!/src/** -!CHANGELOG.md -/lib/**/__test__/ -/types/**/__test__/ -/src/**/__test__/ \ No newline at end of file diff --git a/packages/measurements/CHANGELOG.json b/packages/measurements/CHANGELOG.json deleted file mode 100644 index 5204586b73..0000000000 --- a/packages/measurements/CHANGELOG.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "name": "@hcengineering/measurements", - "entries": [ - { - "version": "0.7.13", - "tag": "@hcengineering/measurements_v0.7.13", - "date": "Tue, 14 Oct 2025 03:02:36 GMT", - "comments": { - "patch": [ - { - "comment": "Remove zero value measure with override values" - } - ], - "dependency": [ - { - "comment": "Updating dependency \"@hcengineering/platform-rig\" from `^0.7.18` to `0.7.19`" - } - ] - } - }, - { - "version": "0.7.12", - "tag": "@hcengineering/measurements_v0.7.12", - "date": "Sat, 11 Oct 2025 19:18:56 GMT", - "comments": { - "patch": [ - { - "comment": "rollback eslint" - } - ], - "dependency": [ - { - "comment": "Updating dependency \"@hcengineering/platform-rig\" from `^0.7.14` to `0.7.15`" - } - ] - } - }, - { - "version": "0.7.11", - "tag": "@hcengineering/measurements_v0.7.11", - "date": "Sat, 11 Oct 2025 17:58:53 GMT", - "comments": { - "none": [ - { - "comment": "Add tests" - } - ], - "patch": [ - { - "comment": "Fix eslint deps" - } - ], - "dependency": [ - { - "comment": "Updating dependency \"@hcengineering/platform-rig\" from `^0.7.12` to `0.7.13`" - } - ] - } - }, - { - "version": "0.7.10", - "tag": "@hcengineering/measurements_v0.7.10", - "date": "Fri, 10 Oct 2025 12:32:59 GMT", - "comments": { - "dependency": [ - { - "comment": "Updating dependency \"@hcengineering/platform-rig\" from `^0.7.10` to `0.7.11`" - } - ] - } - } - ] -} diff --git a/packages/measurements/CHANGELOG.md b/packages/measurements/CHANGELOG.md deleted file mode 100644 index f3e8679861..0000000000 --- a/packages/measurements/CHANGELOG.md +++ /dev/null @@ -1,30 +0,0 @@ -# Change Log - @hcengineering/measurements - -This log was last generated on Tue, 14 Oct 2025 03:02:36 GMT and should not be manually modified. - -## 0.7.13 -Tue, 14 Oct 2025 03:02:36 GMT - -### Patches - -- Remove zero value measure with override values - -## 0.7.12 -Sat, 11 Oct 2025 19:18:56 GMT - -### Patches - -- rollback eslint - -## 0.7.11 -Sat, 11 Oct 2025 17:58:53 GMT - -### Patches - -- Fix eslint deps - -## 0.7.10 -Fri, 10 Oct 2025 12:32:59 GMT - -_Initial release_ - diff --git a/packages/measurements/config/rig.json b/packages/measurements/config/rig.json deleted file mode 100644 index 0110930f55..0000000000 --- a/packages/measurements/config/rig.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "$schema": "https://developer.microsoft.com/json-schemas/rig-package/rig.schema.json", - "rigPackageName": "@hcengineering/platform-rig" -} diff --git a/packages/measurements/jest.config.js b/packages/measurements/jest.config.js deleted file mode 100644 index 2cfd408b67..0000000000 --- a/packages/measurements/jest.config.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = { - preset: 'ts-jest', - testEnvironment: 'node', - testMatch: ['**/?(*.)+(spec|test).[jt]s?(x)'], - roots: ["./src"], - coverageReporters: ["text-summary", "html"] -} diff --git a/packages/measurements/package.json b/packages/measurements/package.json deleted file mode 100644 index 12d858a48d..0000000000 --- a/packages/measurements/package.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "name": "@hcengineering/measurements", - "version": "0.7.13", - "main": "lib/index.js", - "svelte": "src/index.ts", - "types": "types/index.d.ts", - "files": [ - "lib/**/*", - "!lib/**/__test__/**", - "types/**/*", - "!types/**/__test__/**", - "src/**/*", - "!src/**/__test__/**", - "README.md", - "CHANGELOG.md" - ], - "author": "Anticrm Platform Contributors", - "license": "EPL-2.0", - "scripts": { - "build": "compile", - "build:watch": "compile", - "test": "jest --passWithNoTests --silent", - "format": "format src", - "_phase:build": "compile transpile src", - "_phase:test": "jest --passWithNoTests --silent", - "_phase:format": "format src", - "_phase:validate": "compile validate" - }, - "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.19", - "jest": "^29.7.0", - "ts-jest": "^29.1.1", - "@types/jest": "^29.5.5", - "@typescript-eslint/eslint-plugin": "^6.21.0", - "@typescript-eslint/parser": "^6.21.0", - "eslint": "^8.54.0", - "eslint-config-standard-with-typescript": "^40.0.0", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^6.1.1", - "eslint-plugin-n": "^15.4.0" - }, - "repository": "https://github.com/hcengineering/platform", - "exports": { - ".": { - "types": "./types/index.d.ts", - "require": "./lib/index.js", - "import": "./lib/index.js" - } - }, - "publishConfig": { - "access": "public" - } -} diff --git a/packages/measurements/src/__tests__/context.test.ts b/packages/measurements/src/__tests__/context.test.ts deleted file mode 100644 index d59d0a4945..0000000000 --- a/packages/measurements/src/__tests__/context.test.ts +++ /dev/null @@ -1,467 +0,0 @@ -import { - MeasureMetricsContext, - NoMetricsContext, - consoleLogger, - noParamsLogger, - withContext, - setOperationLogProfiling, - registerOperationLog, - updateOperationLog, - addOperation -} from '../context' -import { newMetrics } from '../metrics' -import type { MeasureLogger, MeasureContext } from '../types' - -describe('context', () => { - describe('consoleLogger', () => { - it('should create a logger with params', () => { - const logger = consoleLogger({ service: 'test' }) - - expect(logger).toBeDefined() - expect(typeof logger.info).toBe('function') - expect(typeof logger.error).toBe('function') - expect(typeof logger.warn).toBe('function') - expect(typeof logger.close).toBe('function') - }) - - it('should log info messages', () => { - const consoleSpy = jest.spyOn(console, 'info').mockImplementation() - const logger = consoleLogger({ service: 'test' }) - - logger.info('Test message', { key: 'value' }) - - expect(consoleSpy).toHaveBeenCalled() - consoleSpy.mockRestore() - }) - - it('should log error messages', () => { - const consoleSpy = jest.spyOn(console, 'error').mockImplementation() - const logger = consoleLogger({ service: 'test' }) - - logger.error('Error message', { error: 'details' }) - - expect(consoleSpy).toHaveBeenCalled() - consoleSpy.mockRestore() - }) - - it('should log warn messages', () => { - const consoleSpy = jest.spyOn(console, 'warn').mockImplementation() - const logger = consoleLogger({ service: 'test' }) - - logger.warn('Warning message', { warning: 'info' }) - - expect(consoleSpy).toHaveBeenCalled() - consoleSpy.mockRestore() - }) - - it('should handle errors in params', () => { - const consoleSpy = jest.spyOn(console, 'error').mockImplementation() - const logger = consoleLogger({}) - const error = new Error('Test error') - - logger.error('Error occurred', { error }) - - expect(consoleSpy).toHaveBeenCalled() - const call = consoleSpy.mock.calls[0] - expect(call[0]).toBe('Error occurred') - consoleSpy.mockRestore() - }) - }) - - describe('MeasureMetricsContext', () => { - let logger: MeasureLogger - - beforeEach(() => { - logger = noParamsLogger - }) - - it('should create a new context', () => { - const metrics = newMetrics() - const ctx = new MeasureMetricsContext('test', { op: 'create' }, {}, metrics, logger) - - expect(ctx).toBeDefined() - expect(ctx.metrics).toBe(metrics) - expect(ctx.logger).toBe(logger) - }) - - it('should measure operation duration', async () => { - const metrics = newMetrics() - const ctx = new MeasureMetricsContext('test', { op: 'create' }, {}, metrics, logger) - - await new Promise((resolve) => setTimeout(resolve, 50)) - ctx.end() - - expect(metrics.operations).toBe(1) - expect(metrics.value).toBeGreaterThan(40) - }) - - it('should create child context', () => { - const metrics = newMetrics() - const ctx = new MeasureMetricsContext('parent', { op: 'parent' }, {}, metrics, logger) - const child = ctx.newChild('child', { op: 'child' }) - - expect(child).toBeDefined() - expect(child.parent).toBe(ctx) - }) - - it('should execute async operation with context', async () => { - const metrics = newMetrics() - const ctx = new MeasureMetricsContext('test', {}, {}, metrics, logger) - - let executed = false - await ctx.with('operation', { op: 'test' }, async () => { - executed = true - await new Promise((resolve) => setTimeout(resolve, 10)) - }) - - expect(executed).toBe(true) - expect(metrics.measurements.operation).toBeDefined() - }) - - it('should execute sync operation with context', () => { - const metrics = newMetrics() - const ctx = new MeasureMetricsContext('test', {}, {}, metrics, logger) - - const result = ctx.withSync('operation', { op: 'test' }, () => { - return 42 - }) - - expect(result).toBe(42) - expect(metrics.measurements.operation).toBeDefined() - }) - - it('should measure custom value', () => { - const metrics = newMetrics() - const ctx = new MeasureMetricsContext('test', {}, {}, metrics, logger) - - ctx.measure('custom', 100) - - expect(metrics.measurements['#custom']).toBeDefined() - expect(metrics.measurements['#custom'].value).toBe(100) - }) - - it('should log info messages', () => { - const mockLogger: MeasureLogger = { - info: jest.fn(), - error: jest.fn(), - warn: jest.fn(), - close: jest.fn(async () => {}), - logOperation: jest.fn() - } - - const ctx = new MeasureMetricsContext('test', { op: 'test' }, {}, newMetrics(), mockLogger) - ctx.info('Test message', { key: 'value' }) - - expect(mockLogger.info).toHaveBeenCalledWith( - 'Test message', - expect.objectContaining({ key: 'value', op: 'test' }) - ) - }) - - it('should log error messages', () => { - const mockLogger: MeasureLogger = { - info: jest.fn(), - error: jest.fn(), - warn: jest.fn(), - close: jest.fn(async () => {}), - logOperation: jest.fn() - } - - const ctx = new MeasureMetricsContext('test', { op: 'test' }, {}, newMetrics(), mockLogger) - ctx.error('Error message', { error: 'details' }) - - expect(mockLogger.error).toHaveBeenCalledWith( - 'Error message', - expect.objectContaining({ error: 'details', op: 'test' }) - ) - }) - - it('should log warn messages', () => { - const mockLogger: MeasureLogger = { - info: jest.fn(), - error: jest.fn(), - warn: jest.fn(), - close: jest.fn(async () => {}), - logOperation: jest.fn() - } - - const ctx = new MeasureMetricsContext('test', { op: 'test' }, {}, newMetrics(), mockLogger) - ctx.warn('Warning message', { warning: 'info' }) - - expect(mockLogger.warn).toHaveBeenCalledWith( - 'Warning message', - expect.objectContaining({ warning: 'info', op: 'test' }) - ) - }) - - it('should get params', () => { - const ctx = new MeasureMetricsContext('test', { op: 'test', method: 'GET' }, {}, newMetrics(), logger) - const params = ctx.getParams() - - expect(params).toEqual({ op: 'test', method: 'GET' }) - }) - - it('should share contextData with children', () => { - const metrics = newMetrics() - const ctx = new MeasureMetricsContext('parent', {}, {}, metrics, logger) - ctx.contextData = { userId: '123' } - - const child = ctx.newChild('child', {}) - - expect(child.contextData).toBe(ctx.contextData) - }) - - it('should handle named parameters', () => { - const metrics = newMetrics() - const r = new MeasureMetricsContext('test', { method: 'GET' }, {}, metrics, logger) - expect(r).toBeDefined() - expect(metrics.namedParams.method).toBe('GET') - }) - - it('should update named parameters on multiple contexts', () => { - const metrics = newMetrics() - const ctx1 = new MeasureMetricsContext('test1', { method: 'GET' }, {}, metrics, logger) - expect(ctx1).toBeDefined() - expect(metrics.namedParams.method).toBe('GET') - - // Create another context with different value for same param - const ctx2 = new MeasureMetricsContext('test2', { method: 'POST' }, {}, metrics, logger) - expect(ctx2).toBeDefined() - - // The second context will see existing value is different, so it will update to '*' - // But this happens within the constructor logic - expect(metrics.namedParams.method).toBe('POST') - }) - }) - - describe('NoMetricsContext', () => { - it('should create a no-op context', () => { - const ctx = new NoMetricsContext() - - expect(ctx).toBeDefined() - expect(ctx.logger).toBeDefined() - }) - - it('should execute operations without measuring', async () => { - const ctx = new NoMetricsContext() - - let executed = false - await ctx.with('operation', {}, async () => { - executed = true - }) - - expect(executed).toBe(true) - }) - - it('should create child contexts', () => { - const ctx = new NoMetricsContext() - const child = ctx.newChild('child', {}) - - expect(child).toBeDefined() - expect(child).toBeInstanceOf(NoMetricsContext) - }) - - it('should handle measure calls without error', () => { - const ctx = new NoMetricsContext() - - expect(() => { - ctx.measure('test', 100) - }).not.toThrow() - }) - - it('should handle end calls without error', () => { - const ctx = new NoMetricsContext() - - expect(() => { - ctx.end() - }).not.toThrow() - }) - - it('should return empty params', () => { - const ctx = new NoMetricsContext() - const params = ctx.getParams() - - expect(params).toEqual({}) - }) - }) - - describe('withContext decorator', () => { - it('should wrap method with context', async () => { - class TestClass { - @withContext('testOperation', { service: 'test' }) - async testMethod (ctx: MeasureContext, value: number): Promise { - return value * 2 - } - } - - const instance = new TestClass() - const metrics = newMetrics() - const ctx = new MeasureMetricsContext('root', {}, {}, metrics, noParamsLogger) - - const result = await instance.testMethod(ctx, 21) - - expect(result).toBe(42) - expect(metrics.measurements.testOperation).toBeDefined() - }) - }) - - describe('operation log profiling', () => { - beforeEach(() => { - setOperationLogProfiling(false) - }) - - afterEach(() => { - setOperationLogProfiling(false) - }) - - it('should register operation log when profiling enabled', () => { - setOperationLogProfiling(true) - const metrics = newMetrics() - const ctx = new MeasureMetricsContext('test', {}, {}, metrics, noParamsLogger) - - const { opLogMetrics, op } = registerOperationLog(ctx) - - expect(opLogMetrics).toBe(metrics) - expect(op).toBeDefined() - expect(ctx.id).toBeDefined() - }) - - it('should not register operation log when profiling disabled', () => { - setOperationLogProfiling(false) - const metrics = newMetrics() - const ctx = new MeasureMetricsContext('test', {}, {}, metrics, noParamsLogger) - - const { opLogMetrics, op } = registerOperationLog(ctx) - - expect(opLogMetrics).toBeUndefined() - expect(op).toBeUndefined() - }) - - it('should update operation log', () => { - setOperationLogProfiling(true) - const metrics = newMetrics() - const ctx = new MeasureMetricsContext('test', {}, {}, metrics, noParamsLogger) - - const { opLogMetrics, op } = registerOperationLog(ctx) - updateOperationLog(opLogMetrics, op) - - expect(op?.end).toBeGreaterThan(0) - }) - - it('should add operation to log', async () => { - setOperationLogProfiling(true) - const metrics = newMetrics() - const ctx = new MeasureMetricsContext('test', {}, {}, metrics, noParamsLogger) - - registerOperationLog(ctx) - - let executed = false - await addOperation(ctx, 'asyncOp', { op: 'test' }, async () => { - executed = true - }) - - expect(executed).toBe(true) - expect(metrics.opLog).toBeDefined() - }) - - it('should limit operation log entries', () => { - setOperationLogProfiling(true) - const metrics = newMetrics() - const ctx = new MeasureMetricsContext('test', {}, {}, metrics, noParamsLogger) - - registerOperationLog(ctx) - - // Create many operation log entries - if (metrics.opLog != null && ctx.id != null) { - for (let i = 0; i < 50; i++) { - metrics.opLog[ctx.id].ops.push({ - op: `test${i}`, - start: i, - end: i + 1, - params: {} - }) - } - - const op = metrics.opLog[ctx.id] - updateOperationLog(metrics, op) - - expect(Object.keys(metrics.opLog).length).toBeLessThanOrEqual(31) - } - }) - }) - - describe('extractMeta', () => { - it('should return empty metadata', () => { - const ctx = new MeasureMetricsContext('test', {}, {}, newMetrics(), noParamsLogger) - const meta = ctx.extractMeta() - - expect(meta).toEqual({}) - }) - }) - - describe('async operations', () => { - it('should handle promise rejection', async () => { - const metrics = newMetrics() - const ctx = new MeasureMetricsContext('test', {}, {}, metrics, noParamsLogger) - - await expect( - ctx.with('operation', { op: 'test' }, async () => { - throw new Error('Test error') - }) - ).rejects.toThrow('Test error') - - expect(metrics.measurements.operation).toBeDefined() - }) - - it('should return null promise for null sync result', async () => { - const metrics = newMetrics() - const ctx = new MeasureMetricsContext('test', {}, {}, metrics, noParamsLogger) - - const result = await ctx.with('operation', { op: 'test' }, () => { - return null - }) - - expect(result).toBeUndefined() - }) - - it('should handle sync return value', async () => { - const metrics = newMetrics() - const ctx = new MeasureMetricsContext('test', {}, {}, metrics, noParamsLogger) - - const result = await ctx.with('operation', { op: 'test' }, () => { - return 42 - }) - - expect(result).toBe(42) - }) - - it('should log operation when log option is true', async () => { - const mockLogger: MeasureLogger = { - info: jest.fn(), - error: jest.fn(), - warn: jest.fn(), - close: jest.fn(async () => {}), - logOperation: jest.fn() - } - - const metrics = newMetrics() - const ctx = new MeasureMetricsContext('test', {}, {}, metrics, mockLogger) - - await ctx.with( - 'operation', - { op: 'test' }, - async () => { - await new Promise((resolve) => setTimeout(resolve, 10)) - }, - {}, - { log: true } - ) - - expect(mockLogger.logOperation).toHaveBeenCalledWith( - 'operation', - expect.any(Number), - expect.objectContaining({ op: 'test' }) - ) - }) - }) -}) diff --git a/packages/measurements/src/__tests__/index.test.ts b/packages/measurements/src/__tests__/index.test.ts deleted file mode 100644 index d701edd4e2..0000000000 --- a/packages/measurements/src/__tests__/index.test.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { platformNow, platformNowDiff } from '../index' - -describe('index', () => { - describe('platformNow', () => { - it('should return a positive number', () => { - const now = platformNow() - expect(typeof now).toBe('number') - expect(now).toBeGreaterThan(0) - }) - - it('should return increasing values over time', async () => { - const first = platformNow() - await new Promise((resolve) => setTimeout(resolve, 10)) - const second = platformNow() - expect(second).toBeGreaterThan(first) - }) - }) - - describe('platformNowDiff', () => { - it('should calculate the difference between timestamps', async () => { - const start = platformNow() - await new Promise((resolve) => setTimeout(resolve, 50)) - const diff = platformNowDiff(start) - - expect(diff).toBeGreaterThan(40) - expect(diff).toBeLessThan(100) - }) - - it('should round to 2 decimal places', async () => { - const start = platformNow() - await new Promise((resolve) => setTimeout(resolve, 10)) - const diff = platformNowDiff(start) - - // Check that it has at most 2 decimal places - const decimalPlaces = (diff.toString().split('.')[1] ?? '').length - expect(decimalPlaces).toBeLessThanOrEqual(2) - }) - - it('should handle very small differences', () => { - const start = platformNow() - const diff = platformNowDiff(start) - - expect(diff).toBeGreaterThanOrEqual(0) - expect(typeof diff).toBe('number') - }) - }) -}) diff --git a/packages/measurements/src/__tests__/metrics.test.ts b/packages/measurements/src/__tests__/metrics.test.ts deleted file mode 100644 index e10136fa72..0000000000 --- a/packages/measurements/src/__tests__/metrics.test.ts +++ /dev/null @@ -1,297 +0,0 @@ -import { - newMetrics, - measure, - childMetrics, - metricsAggregate, - metricsToString, - metricsToJson, - metricsToRows, - updateMeasure -} from '../metrics' -import { platformNow } from '../index' - -describe('metrics', () => { - describe('newMetrics', () => { - it('should create a new metrics object with default values', () => { - const metrics = newMetrics() - - expect(metrics.operations).toBe(0) - expect(metrics.value).toBe(0) - expect(metrics.measurements).toEqual({}) - expect(metrics.params).toEqual({}) - expect(metrics.namedParams).toEqual({}) - }) - }) - - describe('measure', () => { - it('should measure operation duration', async () => { - const metrics = newMetrics() - const done = measure(metrics, { operation: 'test' }) - - await new Promise((resolve) => setTimeout(resolve, 50)) - done() - - expect(metrics.operations).toBe(1) - expect(metrics.value).toBeGreaterThan(40) - }) - - it('should call endOp callback with duration', async () => { - const metrics = newMetrics() - let capturedSpend = 0 - const done = measure(metrics, { operation: 'test' }, {}, (spend) => { - capturedSpend = spend - }) - - await new Promise((resolve) => setTimeout(resolve, 50)) - done() - - expect(capturedSpend).toBeGreaterThan(40) - }) - - it('should handle multiple operations', async () => { - const metrics = newMetrics() - - const done1 = measure(metrics, { operation: 'test' }) - await new Promise((resolve) => setTimeout(resolve, 20)) - done1() - - const done2 = measure(metrics, { operation: 'test' }) - await new Promise((resolve) => setTimeout(resolve, 20)) - done2() - - expect(metrics.operations).toBe(2) - expect(metrics.value).toBeGreaterThan(30) - }) - }) - - describe('updateMeasure', () => { - it('should update metrics with custom value', () => { - const metrics = newMetrics() - const st = platformNow() - - updateMeasure(metrics, st, { op: 'test' }, {}, undefined, 100) - - expect(metrics.operations).toBe(1) - expect(metrics.value).toBe(100) - }) - - it('should override operations when override is true', () => { - const metrics = newMetrics() - const st = platformNow() - - // First call without override - accumulates value and increments operations - updateMeasure(metrics, st, { op: 'test' }, {}, undefined, 50, false) - expect(metrics.value).toBe(50) - expect(metrics.operations).toBe(1) - - // Second call with override - sets operations, doesn't add to value - updateMeasure(metrics, st, { op: 'test' }, {}, undefined, 100, true) - - expect(metrics.operations).toBe(100) // overridden - expect(metrics.value).toBe(50) // not changed when override=true - }) - - it('should track parameters', () => { - const metrics = newMetrics() - const st = platformNow() - - updateMeasure(metrics, st, { method: 'GET' }, {}, undefined, 100) - updateMeasure(metrics, st, { method: 'POST' }, {}, undefined, 200) - - expect(metrics.params.method).toBeDefined() - expect(metrics.params.method.GET).toBeDefined() - expect(metrics.params.method.POST).toBeDefined() - expect(metrics.params.method.GET.value).toBe(100) - expect(metrics.params.method.POST.value).toBe(200) - }) - - it('should handle multiple parameters as counters', () => { - const metrics = newMetrics() - const st = platformNow() - - updateMeasure(metrics, st, { method: 'GET', status: '200' }, {}, undefined, 100) - updateMeasure(metrics, st, { method: 'GET', status: '404' }, {}, undefined, 50) - - expect(metrics.params.method.GET).toBeDefined() - expect(metrics.params.method.GET.topResult).toBeDefined() - expect(metrics.params.method.GET.topResult?.length).toBeGreaterThan(0) - }) - - it('should update top results', () => { - const metrics = newMetrics() - const st = platformNow() - - updateMeasure(metrics, st, {}, { request: 'slow' }, undefined, 100) - updateMeasure(metrics, st, {}, { request: 'fast' }, undefined, 10) - - expect(metrics.topResult).toBeDefined() - expect(metrics.topResult?.length).toBeGreaterThan(0) - }) - }) - - describe('childMetrics', () => { - it('should create child metrics in hierarchy', () => { - const root = newMetrics() - const child = childMetrics(root, ['level1', 'level2']) - - expect(root.measurements.level1).toBeDefined() - expect(root.measurements.level1.measurements.level2).toBeDefined() - expect(child).toBe(root.measurements.level1.measurements.level2) - }) - - it('should reuse existing child metrics', () => { - const root = newMetrics() - const child1 = childMetrics(root, ['level1']) - const child2 = childMetrics(root, ['level1']) - - expect(child1).toBe(child2) - }) - - it('should create nested paths', () => { - const root = newMetrics() - childMetrics(root, ['api', 'users', 'create']) - - expect(root.measurements.api).toBeDefined() - expect(root.measurements.api.measurements.users).toBeDefined() - expect(root.measurements.api.measurements.users.measurements.create).toBeDefined() - }) - }) - - describe('metricsAggregate', () => { - it('should aggregate metrics', () => { - const metrics = newMetrics() - metrics.value = 100 - metrics.operations = 10 - - const child1 = childMetrics(metrics, ['child1']) - child1.value = 50 - child1.operations = 5 - - const child2 = childMetrics(metrics, ['child2']) - child2.value = 30 - child2.operations = 3 - - const aggregated = metricsAggregate(metrics) - - expect(aggregated.value).toBe(80) // child1 + child2 - expect(aggregated.operations).toBe(10) - }) - - it('should limit number of child metrics', () => { - const metrics = newMetrics() - - for (let i = 0; i < 10; i++) { - const child = childMetrics(metrics, [`child${i}`]) - child.value = i * 10 - } - - const aggregated = metricsAggregate(metrics, 3) - - expect(Object.keys(aggregated.measurements).length).toBe(3) - }) - - it('should filter out metrics starting with #', () => { - const metrics = newMetrics() - - const child1 = childMetrics(metrics, ['normal']) - child1.value = 50 - - const child2 = childMetrics(metrics, ['#internal']) - child2.value = 30 - - const aggregated = metricsAggregate(metrics) - - expect(aggregated.value).toBe(50) // only 'normal' counted - }) - }) - - describe('metricsToString', () => { - it('should convert metrics to string', () => { - const metrics = newMetrics() - metrics.value = 100 - metrics.operations = 10 - - const str = metricsToString(metrics, 'TestMetrics', 50) - - expect(str).toContain('TestMetrics') - expect(str).toContain('100') - expect(str).toContain('10') - }) - - it('should include child metrics in string', () => { - const metrics = newMetrics() - const child = childMetrics(metrics, ['operation']) - child.value = 50 - child.operations = 5 - - const str = metricsToString(metrics, 'TestMetrics', 50) - - expect(str).toContain('operation') - }) - }) - - describe('metricsToJson', () => { - it('should convert metrics to JSON', () => { - const metrics = newMetrics() - metrics.value = 100 - metrics.operations = 10 - - const json = metricsToJson(metrics) - - // aggregated value is the total value when no children - expect(json.$total).toBe(100) - expect(json.$ops).toBe(10) - }) - - it('should include child metrics in JSON', () => { - const metrics = newMetrics() - const child = childMetrics(metrics, ['operation']) - child.value = 50 - child.operations = 5 - - const json = metricsToJson(metrics) - - expect(json).toBeDefined() - const keys = Object.keys(json) - expect(keys.some((k) => k.includes('operation'))).toBe(true) - }) - }) - - describe('metricsToRows', () => { - it('should convert metrics to rows', () => { - const metrics = newMetrics() - metrics.value = 100 - metrics.operations = 10 - - const rows = metricsToRows(metrics, 'TestMetrics') - - expect(Array.isArray(rows)).toBe(true) - expect(rows.length).toBeGreaterThan(0) - expect(rows[0]).toContain('TestMetrics') - }) - - it('should include child metrics in rows', () => { - const metrics = newMetrics() - const child = childMetrics(metrics, ['operation']) - child.value = 50 - child.operations = 5 - - const rows = metricsToRows(metrics, 'TestMetrics') - - expect(rows.length).toBeGreaterThan(1) - expect(rows.some((row) => row.includes('operation'))).toBe(true) - }) - - it('should properly format row values', () => { - const metrics = newMetrics() - metrics.value = 100 - metrics.operations = 10 - - const rows = metricsToRows(metrics, 'TestMetrics') - - expect(rows[0]).toHaveLength(5) // offset, name, avg, total, ops - expect(typeof rows[0][0]).toBe('number') // offset - expect(typeof rows[0][1]).toBe('string') // name - }) - }) -}) diff --git a/packages/measurements/src/__tests__/performance.test.ts b/packages/measurements/src/__tests__/performance.test.ts deleted file mode 100644 index 14f0ff3e35..0000000000 --- a/packages/measurements/src/__tests__/performance.test.ts +++ /dev/null @@ -1,260 +0,0 @@ -import { MeasureMetricsContext, NoMetricsContext, noParamsLogger } from '../context' -import { newMetrics, metricsAggregate } from '../metrics' -import type { MeasureContext } from '../types' - -describe('performance', () => { - describe('overhead measurement', () => { - // Reduced iterations to fit within 10 seconds total test time - const iterations = 100 - const depth = 5 - - it('should measure overhead of with() vs raw execution', async () => { - // Baseline: raw execution without measurement - const baselineStart = performance.now() - for (let i = 0; i < iterations; i++) { - await simulateWork(1) - } - const baselineTime = performance.now() - baselineStart - - // With measurement context - const metrics = newMetrics() - const ctx = new MeasureMetricsContext('root', {}, {}, metrics, noParamsLogger) - - const measuredStart = performance.now() - for (let i = 0; i < iterations; i++) { - await ctx.with('operation', { iteration: i }, async () => { - await simulateWork(1) - }) - } - const measuredTime = performance.now() - measuredStart - - const overhead = measuredTime - baselineTime - const overheadPercentage = (overhead / baselineTime) * 100 - - console.log(`\nšŸ“Š Overhead Analysis (${iterations} iterations):`) - console.log(` Baseline time: ${baselineTime.toFixed(2)}ms`) - console.log(` Measured time: ${measuredTime.toFixed(2)}ms`) - console.log(` Overhead: ${overhead.toFixed(2)}ms (${overheadPercentage.toFixed(2)}%)`) - console.log(` Per operation: ${(overhead / iterations).toFixed(4)}ms`) - - expect(metrics.measurements.operation).toBeDefined() - expect(metrics.measurements.operation.operations).toBe(iterations) - - // Overhead should be reasonable (typically < 50% for simple operations) - // This is informational rather than a strict assertion - expect(overheadPercentage).toBeLessThan(200) - }) - - it('should measure overhead with deep nested contexts', async () => { - const metrics = newMetrics() - const ctx = new MeasureMetricsContext('root', {}, {}, metrics, noParamsLogger) - - // Baseline: single level - const singleLevelStart = performance.now() - for (let i = 0; i < iterations; i++) { - await ctx.with('shallow', {}, async () => { - await simulateWork(1) - }) - } - const singleLevelTime = performance.now() - singleLevelStart - - // Deep nesting - const deepStart = performance.now() - for (let i = 0; i < iterations; i++) { - await deepNestedExecution(ctx, depth, 1) - } - const deepTime = performance.now() - deepStart - - const nestingOverhead = deepTime - singleLevelTime - const overheadPerLevel = nestingOverhead / (iterations * depth) - - console.log(`\nšŸ“Š Deep Nesting Overhead (${iterations} iterations, depth=${depth}):`) - console.log(` Single level: ${singleLevelTime.toFixed(2)}ms`) - console.log(` Deep nested: ${deepTime.toFixed(2)}ms`) - console.log(` Nesting overhead: ${nestingOverhead.toFixed(2)}ms`) - console.log(` Per level: ${overheadPerLevel.toFixed(4)}ms`) - - expect(metrics.measurements.shallow).toBeDefined() - expect(metrics.measurements.level0).toBeDefined() - }) - - it('should measure overhead with complex parameter tracking', async () => { - const metrics = newMetrics() - const ctx = new MeasureMetricsContext('root', {}, {}, metrics, noParamsLogger) - - // Simple params - const simpleStart = performance.now() - for (let i = 0; i < iterations; i++) { - await ctx.with('simple', { id: i }, async () => { - await simulateWork(1) - }) - } - const simpleTime = performance.now() - simpleStart - - // Complex params with multiple tracked values - const complexStart = performance.now() - for (let i = 0; i < iterations; i++) { - await ctx.with( - 'complex', - { - method: i % 3 === 0 ? 'GET' : i % 3 === 1 ? 'POST' : 'PUT', - status: i % 2 === 0 ? 200 : 404, - cached: i % 4 === 0 - }, - async () => { - await simulateWork(1) - }, - { - userId: `user_${i % 10}`, - endpoint: `/api/v1/resource/${i % 5}`, - timestamp: Date.now() - } - ) - } - const complexTime = performance.now() - complexStart - - const paramOverhead = complexTime - simpleTime - - console.log(`\nšŸ“Š Parameter Tracking Overhead (${iterations} iterations):`) - console.log(` Simple params: ${simpleTime.toFixed(2)}ms`) - console.log(` Complex params: ${complexTime.toFixed(2)}ms`) - console.log(` Param overhead: ${paramOverhead.toFixed(2)}ms`) - console.log(` Per operation: ${(paramOverhead / iterations).toFixed(4)}ms`) - - expect(metrics.measurements.simple).toBeDefined() - expect(metrics.measurements.complex).toBeDefined() - expect(Object.keys(metrics.measurements.complex.params).length).toBeGreaterThan(0) - }) - - it('should measure overhead with NoMetricsContext', async () => { - // NoMetricsContext should have minimal overhead - const noMetricsCtx = new NoMetricsContext(noParamsLogger) - - const start = performance.now() - for (let i = 0; i < iterations; i++) { - await noMetricsCtx.with('operation', { iteration: i }, async () => { - await simulateWork(1) - }) - } - const noMetricsTime = performance.now() - start - - // Compare with raw execution - const rawStart = performance.now() - for (let i = 0; i < iterations; i++) { - await simulateWork(1) - } - const rawTime = performance.now() - rawStart - - const overhead = noMetricsTime - rawTime - const overheadPercentage = (overhead / rawTime) * 100 - - console.log(`\nšŸ“Š NoMetricsContext Overhead (${iterations} iterations):`) - console.log(` Raw time: ${rawTime.toFixed(2)}ms`) - console.log(` NoMetrics time: ${noMetricsTime.toFixed(2)}ms`) - console.log(` Overhead: ${overhead.toFixed(2)}ms (${overheadPercentage.toFixed(2)}%)`) - - // NoMetricsContext should have very low overhead - expect(overheadPercentage).toBeLessThan(50) - }) - }) - - describe('realistic workload simulation', () => { - it('should measure overhead in complex realistic scenario', async () => { - const metrics = newMetrics() - const ctx = new MeasureMetricsContext('app', { service: 'api' }, {}, metrics, noParamsLogger) - - const requests = 50 - const baselineStart = performance.now() - - // Simulate without metrics - for (let i = 0; i < requests; i++) { - await simulateAPIRequest(null, i) - } - const baselineTime = performance.now() - baselineStart - - // Reset for measured run - const measuredStart = performance.now() - - // Simulate with metrics - for (let i = 0; i < requests; i++) { - await simulateAPIRequest(ctx, i) - } - const measuredTime = performance.now() - measuredStart - - const overhead = measuredTime - baselineTime - const overheadPercentage = (overhead / baselineTime) * 100 - - console.log(`\nšŸ“Š Realistic Workload Analysis (${requests} API requests):`) - console.log(` Baseline: ${baselineTime.toFixed(2)}ms`) - console.log(` With metrics: ${measuredTime.toFixed(2)}ms`) - console.log(` Overhead: ${overhead.toFixed(2)}ms (${overheadPercentage.toFixed(2)}%)`) - console.log(` Per request: ${(overhead / requests).toFixed(4)}ms`) - - // Check metrics structure - const aggregated = metricsAggregate(metrics, 10) - console.log(` Collected operations: ${aggregated.measurements.request?.operations ?? 0}`) - - expect(aggregated.measurements.request).toBeDefined() - expect(overheadPercentage).toBeLessThan(100) // Should be less than 100% overhead - }) - }) -}) - -// Helper functions - -async function simulateWork (durationMs: number): Promise { - const end = performance.now() + durationMs - while (performance.now() < end) { - // Busy wait to simulate work - const r = Math.random() * Math.random() - expect(r).toBeGreaterThanOrEqual(0) - } -} - -async function deepNestedExecution ( - ctx: MeasureContext, - depth: number, - workMs: number, - currentLevel: number = 0 -): Promise { - if (currentLevel >= depth) { - await simulateWork(workMs) - return - } - - await ctx.with(`level${currentLevel}`, { level: currentLevel }, async (childCtx) => { - await deepNestedExecution(childCtx, depth, workMs, currentLevel + 1) - }) -} - -async function simulateAPIRequest (ctx: MeasureContext | null, requestId: number): Promise { - const method = ['GET', 'POST', 'PUT'][requestId % 3] - const endpoint = `/api/resource/${requestId % 10}` - - if (ctx === null) { - // No metrics version - await simulateWork(1) - // Simulate DB query - await simulateWork(2) - // Simulate processing - await simulateWork(1) - return - } - - // With metrics version - await ctx.with('request', { method, endpoint }, async (reqCtx) => { - await reqCtx.with('auth', { userId: `user_${requestId % 50}` }, async () => { - await simulateWork(1) - }) - - await reqCtx.with('database', { query: 'SELECT' }, async (dbCtx) => { - await dbCtx.with('query_execution', {}, async () => { - await simulateWork(2) - }) - }) - - await reqCtx.with('processing', { items: requestId % 20 }, async () => { - await simulateWork(1) - }) - }) -} diff --git a/packages/measurements/src/context.ts b/packages/measurements/src/context.ts deleted file mode 100644 index 5080866518..0000000000 --- a/packages/measurements/src/context.ts +++ /dev/null @@ -1,386 +0,0 @@ -// Basic performance metrics suite. - -import { platformNow, platformNowDiff } from '.' -import { childMetrics, newMetrics, updateMeasure } from './metrics' -import { - type FullParamsType, - type MeasureContext, - type MeasureLogger, - type Metrics, - type ParamsType, - type OperationLog, - type OperationLogEntry, - type WithOptions -} from './types' - -const errorPrinter = ({ message, stack, ...rest }: Error): object => ({ - message, - stack, - ...rest -}) -function replacer (value: any): any { - return value instanceof Error ? errorPrinter(value) : value -} - -export const consoleLogger = (logParams: Record): MeasureLogger => ({ - info: (msg, args) => { - console.info( - msg, - ...Object.entries({ ...(args ?? {}), ...(logParams ?? {}) }).map( - (it) => `${it[0]}=${JSON.stringify(replacer(it[1]))}` - ) - ) - }, - error: (msg, args) => { - console.error( - msg, - ...Object.entries({ ...(args ?? {}), ...(logParams ?? {}) }).map( - (it) => `${it[0]}=${JSON.stringify(replacer(it[1]))}` - ) - ) - }, - warn: (msg, args) => { - console.warn(msg, ...Object.entries(args ?? {}).map((it) => `${it[0]}=${JSON.stringify(replacer(it[1]))}`)) - }, - close: async () => {}, - logOperation: (operation, time, params) => {} -}) - -export const noParamsLogger = consoleLogger({}) - -export const nullPromise = Promise.resolve() - -/** - * @public - */ -export class MeasureMetricsContext implements MeasureContext { - private readonly name: string - private readonly params: ParamsType - - private readonly fullParams: FullParamsType | (() => FullParamsType) = {} - logger: MeasureLogger - metrics: Metrics - id?: string - - st = platformNow() - contextData: object = {} - private done (value?: number, override?: boolean): void { - updateMeasure(this.metrics, this.st, this.params, this.fullParams, (spend) => {}, value, override) - } - - constructor ( - name: string, - params: ParamsType, - fullParams: FullParamsType | (() => FullParamsType) = {}, - metrics: Metrics = newMetrics(), - logger?: MeasureLogger, - readonly parent?: MeasureContext, - readonly logParams?: ParamsType - ) { - this.name = name - this.params = params - this.fullParams = fullParams - this.metrics = metrics - this.metrics.namedParams = this.metrics.namedParams ?? {} - for (const [k, v] of Object.entries(params)) { - if (this.metrics.namedParams[k] !== v) { - this.metrics.namedParams[k] = v - } else { - this.metrics.namedParams[k] = '*' - } - } - - this.logger = logger ?? (this.logParams != null ? consoleLogger(this.logParams ?? {}) : noParamsLogger) - } - - measure (name: string, value: number, override?: boolean): void { - const c = new MeasureMetricsContext('#' + name, {}, {}, childMetrics(this.metrics, ['#' + name]), this.logger, this) - c.contextData = this.contextData - c.done(value, override) - } - - newChild ( - name: string, - params: ParamsType, - opt?: { - fullParams?: FullParamsType - logger?: MeasureLogger - span?: WithOptions['span'] // By default true - } - ): MeasureContext { - const result = new MeasureMetricsContext( - name, - params, - opt?.fullParams ?? {}, - childMetrics(this.metrics, [name]), - opt?.logger ?? this.logger, - this, - this.logParams - ) - result.id = this.id - result.contextData = this.contextData - return result - } - - with( - name: string, - params: ParamsType, - op: (ctx: MeasureContext) => T | Promise, - fullParams?: ParamsType | (() => FullParamsType), - opt?: WithOptions - ): Promise { - const c = this.newChild(name, params, { fullParams, logger: this.logger }) - let needFinally = true - try { - const value = op(c) - if (value instanceof Promise) { - needFinally = false - return value.finally(() => { - c.end() - if (opt?.log === true) { - this.logger.logOperation(name, platformNowDiff((c as MeasureMetricsContext).st), { - ...params, - ...fullParams - }) - } - }) - } else { - if (value == null) { - return nullPromise as Promise - } - return Promise.resolve(value) - } - } finally { - if (needFinally) { - c.end() - } - } - } - - extractMeta (): Record { - return {} - } - - withSync( - name: string, - params: ParamsType, - op: (ctx: MeasureContext) => T, - fullParams?: ParamsType | (() => FullParamsType) - ): T { - const c = this.newChild(name, params, { fullParams, logger: this.logger }) - try { - return op(c) - } finally { - c.end() - } - } - - error (message: string, args?: Record): void { - this.logger.error(message, { ...this.params, ...args, ...(this.logParams ?? {}) }) - } - - info (message: string, args?: Record): void { - this.logger.info(message, { ...this.params, ...args, ...(this.logParams ?? {}) }) - } - - warn (message: string, args?: Record): void { - this.logger.warn(message, { ...this.params, ...args, ...(this.logParams ?? {}) }) - } - - end (): void { - this.done() - } - - getParams (): ParamsType { - return this.params - } -} - -export class NoMetricsContext implements MeasureContext { - logger: MeasureLogger - id?: string - - contextData: object = {} - - constructor (logger?: MeasureLogger) { - this.logger = logger ?? consoleLogger({}) - } - - measure (name: string, value: number, override?: boolean): void {} - - newChild ( - name: string, - params: ParamsType, - fullParams?: FullParamsType | (() => FullParamsType), - logger?: MeasureLogger - ): MeasureContext { - const result = new NoMetricsContext(logger ?? this.logger) - result.id = this.id - result.contextData = this.contextData - return result - } - - with( - name: string, - params: ParamsType, - op: (ctx: MeasureContext) => T | Promise, - fullParams?: ParamsType | (() => FullParamsType) - ): Promise { - const r = op(this.newChild(name, params, fullParams, this.logger)) - return r instanceof Promise ? r : Promise.resolve(r) - } - - extractMeta (): Record { - return {} - } - - withSync( - name: string, - params: ParamsType, - op: (ctx: MeasureContext) => T, - fullParams?: ParamsType | (() => FullParamsType) - ): T { - const c = this.newChild(name, params, fullParams, this.logger) - return op(c) - } - - withLog( - name: string, - params: ParamsType, - op: (ctx: MeasureContext) => T | Promise, - fullParams?: ParamsType - ): Promise { - const r = op(this.newChild(name, params, fullParams, this.logger)) - return r instanceof Promise ? r : Promise.resolve(r) - } - - error (message: string, args?: Record): void { - this.logger.error(message, { ...args }) - } - - info (message: string, args?: Record): void { - this.logger.info(message, { ...args }) - } - - warn (message: string, args?: Record): void { - this.logger.warn(message, { ...args }) - } - - end (): void {} - - getParams (): ParamsType { - return {} - } -} - -/** - * Allow to use decorator for context enabled functions - */ -export function withContext (name: string, params: ParamsType = {}): any { - return (target: any, propertyKey: string, descriptor: PropertyDescriptor): PropertyDescriptor => { - const originalMethod = descriptor.value - descriptor.value = function (...args: any[]): Promise { - const ctx = args[0] as MeasureContext - return ctx.with(name, params, (ctx) => originalMethod.apply(this, [ctx, ...args.slice(1)]) as Promise) - } - return descriptor - } -} - -let operationProfiling = false - -export function setOperationLogProfiling (value: boolean): void { - operationProfiling = value -} - -let globalId: number = 0 - -export function registerOperationLog (ctx: MeasureContext): { opLogMetrics?: Metrics, op?: OperationLog } { - if (!operationProfiling) { - return {} - } - const op: OperationLog = { start: platformNow(), ops: [], end: -1 } - let opLogMetrics: Metrics | undefined - - if (ctx.id === undefined) { - ctx.id = 'op_' + (++globalId).toString(16) - } - if (ctx.metrics !== undefined) { - if (ctx.metrics.opLog === undefined) { - ctx.metrics.opLog = {} - } - ctx.metrics.opLog[ctx.id] = op - opLogMetrics = ctx.metrics - } - return { opLogMetrics, op } -} - -export function updateOperationLog (opLogMetrics: Metrics | undefined, op: OperationLog | undefined): void { - if (!operationProfiling) { - return - } - if (op !== undefined) { - op.end = platformNow() - } - // We should keep only longest one entry - if (opLogMetrics?.opLog !== undefined) { - const entries = Object.entries(opLogMetrics.opLog) - - const incomplete = entries.filter((it) => it[1].end === -1) - const complete = entries.filter((it) => it[1].end !== -1) - complete.sort((a, b) => a[1].start - b[1].start) - if (complete.length > 30) { - complete.splice(0, complete.length - 30) - } - - opLogMetrics.opLog = Object.fromEntries(incomplete.concat(complete)) - } -} - -export function addOperation ( - ctx: MeasureContext, - name: string, - params: ParamsType, - op: (ctx: MeasureContext) => Promise, - fullParams?: FullParamsType -): Promise { - if (!operationProfiling) { - return op(ctx) - } - let opEntry: OperationLogEntry | undefined - - let p: MeasureContext | undefined = ctx - let opLogMetrics: Metrics | undefined - let id: string | undefined - - while (p !== undefined) { - if (p.metrics?.opLog !== undefined) { - opLogMetrics = p.metrics - } - if (id === undefined && p.id !== undefined) { - id = p.id - } - p = p.parent - } - const opLog = id !== undefined ? opLogMetrics?.opLog?.[id] : undefined - - if (opLog !== undefined) { - opEntry = { - op: name, - start: performance.now(), - params: {}, - end: -1 - } - } - const result = op(ctx) - if (opEntry !== undefined && opLog !== undefined) { - void result.finally(() => { - if (opEntry !== undefined && opLog !== undefined) { - opEntry.end = performance.now() - opEntry.params = { ...params, ...(typeof fullParams === 'function' ? fullParams() : fullParams) } - opLog.ops.push(opEntry) - } - }) - } - return result -} diff --git a/packages/measurements/src/index.ts b/packages/measurements/src/index.ts deleted file mode 100644 index 16e4d95df6..0000000000 --- a/packages/measurements/src/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -export * from './context' -export * from './metrics' -export type * from './types' - -/** - * Return a current performance timestamp - */ -export const platformNow: () => number = () => performance.now() - -/** - * Return a diff with previous performance snapshot with 2 digits after . max. - */ -export const platformNowDiff = (old: number): number => Math.round((performance.now() - old) * 100) / 100 diff --git a/packages/measurements/src/metrics.ts b/packages/measurements/src/metrics.ts deleted file mode 100644 index 695dc0372a..0000000000 --- a/packages/measurements/src/metrics.ts +++ /dev/null @@ -1,343 +0,0 @@ -// Basic performance metrics suite. - -import { platformNow, type MetricsData } from '.' -import { type FullParamsType, type Metrics, type ParamsType } from './types' - -/** - * @public - */ -export const globals: Metrics = newMetrics() - -/** - * @public - * @returns - */ -export function newMetrics (): Metrics { - return { - operations: 0, - value: 0, - measurements: {}, - params: {}, - namedParams: {} - } -} - -function getUpdatedTopResult ( - current: Metrics['topResult'], - time: number, - params: FullParamsType -): Metrics['topResult'] { - if (time === 0) { - return current - } - const result: Metrics['topResult'] = current ?? [] - - const newValue = { - value: time, - params - } - - if (result.length > 6) { - if (result[0].value < newValue.value) { - result[0] = newValue - return result - } - if (result[result.length - 1].value > newValue.value) { - result[result.length - 1] = newValue - return result - } - - // Shift the middle - return [result[0], newValue, ...result.slice(1, 3), result[5]] - } else { - result.push(newValue) - return result - } -} - -/** - * Measure with tree expansion. Operation counter will be added only to leaf's. - * @public - */ -export function measure ( - metrics: Metrics, - params: ParamsType, - fullParams: FullParamsType | (() => FullParamsType) = {}, - endOp?: (spend: number) => void -): () => void { - const st = platformNow() - return () => { - updateMeasure(metrics, st, params, fullParams, endOp) - } -} -export function updateMeasure ( - metrics: Metrics, - st: number, - params: ParamsType, - fullParams: FullParamsType | (() => FullParamsType), - endOp?: (spend: number) => void, - value?: number, - override?: boolean -): void { - const ed = platformNow() - - const fParams = typeof fullParams === 'function' ? fullParams() : fullParams - // Update params if required - const pparams = Object.entries(params) - if (pparams.length > 0) { - const [k, v] = pparams[0] - let params = metrics.params[k] - if (params === undefined) { - params = {} - metrics.params[k] = params - } - const vKey = `${v?.toString() ?? ''}` - let param = params[vKey] - if (param === undefined) { - param = { - operations: 0, - value: 0 - } - params[vKey] = param - } - if (override === true) { - if (value === 0) { - // We need to delete value, to preserve sending zero values. - // eslint-disable-next-line @typescript-eslint/no-dynamic-delete - delete params[vKey] - } else { - param.operations = value ?? ed - st - } - } else { - param.value += value ?? ed - st - param.operations++ - } - // Do not update top results for params. - if (pparams.length > 1) { - // We need to update all other params as counters. - if (param.topResult === undefined) { - param.topResult = [] - } - for (const [, v] of pparams.slice(1)) { - const r = (param.topResult ?? []).find((it) => it.params[`${v}`] === true) - if (r !== undefined) { - r.value += 1 // Counter of operations - r.time = (r.time ?? 0) + (value ?? ed - st) - } else { - param.topResult.push({ params: { [`${v}`]: true }, value: 1, time: value ?? ed - st }) - } - } - param.topResult.sort((a, b) => b.value - a.value) - } - } - // Update leaf data - if (override === true) { - metrics.operations = value ?? ed - st - } else { - metrics.value += value ?? ed - st - metrics.operations++ - } - - metrics.topResult = getUpdatedTopResult(metrics.topResult, ed - st, fParams) - endOp?.(ed - st) -} - -/** - * @public - */ -export function childMetrics (root: Metrics, path: string[]): Metrics { - const segments = path - let oop = root - for (const p of segments) { - const v = oop.measurements[p] ?? { operations: 0, value: 0, measurements: {}, params: {} } - oop.measurements[p] = v - oop = v - } - return oop -} - -/** - * @public - */ -export function metricsAggregate (m: Metrics, limit: number = -1, roundMath: boolean = false): Metrics { - let ms = aggregateMetrics(m.measurements, limit) - - // Use child overage, if there is no top level value specified. - const me = Object.entries(ms) - const sumVal: number = - (me.length === 0 ? m.value : 0) + - me - .filter((it) => !it[0].startsWith('#')) - .map((it) => it[1]) - .reduce((p, v) => { - return p + v.value - }, 0) - - if (limit !== -1) { - // We need to keep only top limit items in ms - if (Object.keys(ms).length > 0) { - const newMs: typeof ms = {} - let added = 0 - for (const [k, v] of Object.entries(ms)) { - newMs[k] = v - added++ - if (added >= limit) { - break - } - } - ms = newMs - } - } - - return { - operations: m.operations, - measurements: ms, - params: m.params, - value: sumVal, - topResult: m.topResult, - namedParams: m.namedParams, - opLog: m.opLog - } -} - -function aggregateMetrics (m: Record, limit: number = -1): Record { - const result: Record = {} - for (const [k, v] of Object.entries(m).sort((a, b) => b[1].value - a[1].value)) { - result[k] = metricsAggregate(v, limit) - } - return result -} - -function toLen (val: string, sep: string, len: number): string { - while (val.length < len) { - val += sep - } - return val -} - -function printMetricsChildren (params: Record, offset: number, length: number): string { - let r = '' - if (Object.keys(params).length > 0) { - r += '\n' + toLen('', ' ', offset) - r += Object.entries(params) - .filter((it) => it[1].value > 0.1) - .map(([k, vv]) => toString(k, vv, offset, length)) - .join('\n' + toLen('', ' ', offset)) - } - return r -} - -function printMetricsParams ( - params: Record>, - offset: number, - length: number -): string { - let r = '' - const joinP = (key: string, data: Record): string[] => { - return Object.entries(data) - .filter((it) => it[1].value >= 0.1) - .map(([k, vv]) => - `${toLen('', ' ', offset)}${toLen(key + '=' + k, '-', length - offset)}: avg ${ - Math.round((vv.value / (vv.operations > 0 ? vv.operations : 1)) * 100) / 100 - } total: ${Math.round(vv.value * 100) / 100} ops: ${vv.operations}`.trim() - ) - } - const joinParams = Object.entries(params).reduce((p, c) => [...p, ...joinP(c[0], c[1])], []) - if (Object.keys(joinParams).length > 0) { - r += '\n' + toLen('', ' ', offset) - r += joinParams.join('\n' + toLen('', ' ', offset)) - } - return r -} - -function toString (name: string, m: Metrics, offset: number, length: number): string { - let r = `${toLen('', ' ', offset)}${toLen(name, '-', length - offset)}: avg ${ - Math.round((m.value / (m.operations > 0 ? m.operations : 1)) * 100) / 100 - } total: ${Math.round(m.value * 100) / 100} ops: ${m.operations}`.trim() - r += printMetricsParams(m.params, offset + 4, length) - r += printMetricsChildren(m.measurements, offset + 4, length) - return r -} - -function toJson (m: Metrics): any { - const obj: any = { - $total: m.value, - $ops: m.operations - } - if (m.operations > 1) { - obj.avg = Math.round((m.value / (m.operations > 0 ? m.operations : 1)) * 100) / 100 - } - if (Object.keys(m.params).length > 0) { - obj.params = m.params - } - for (const [k, v] of Object.entries(m.measurements ?? {})) { - obj[ - `${k} ${v.value} ${v.operations} ${ - v.operations > 1 ? Math.round((v.value / (v.operations > 0 ? m.operations : 1)) * 100) / 100 : '' - }` - ] = toJson(v) - } - - return obj -} - -/** - * @public - */ -export function metricsToString (metrics: Metrics, name = 'System', length: number): string { - return toString(name, metricsAggregate(metrics, 50, true), 0, length) -} - -export function metricsToJson (metrics: Metrics): any { - return toJson(metricsAggregate(metrics)) -} - -function printMetricsParamsRows ( - params: Record>, - offset: number -): (string | number)[][] { - const r: (string | number)[][] = [] - function joinP (key: string, data: Record): (string | number)[][] { - return Object.entries(data).map(([k, vv]) => [ - offset, - `${key}=${k}`, - Math.round((vv.value / (vv.operations > 0 ? vv.operations : 1)) * 100) / 100, - Math.round(vv.value * 100) / 100, - vv.operations - ]) - } - for (const [k, v] of Object.entries(params)) { - r.push(...joinP(k, v)) - } - return r -} - -function printMetricsChildrenRows (params: Record, offset: number): (string | number)[][] { - const r: (string | number)[][] = [] - if (Object.keys(params).length > 0) { - Object.entries(params).forEach(([k, vv]) => r.push(...toStringRows(k, vv, offset))) - } - return r -} - -function toStringRows (name: string, m: Metrics, offset: number): (number | string)[][] { - const r: (number | string)[][] = [ - [ - offset, - name, - Math.round((m.value / (m.operations > 0 ? m.operations : 1)) * 100) / 100, - Math.round(m.value * 100) / 100, - m.operations - ] - ] - r.push(...printMetricsParamsRows(m.params, offset + 1)) - r.push(...printMetricsChildrenRows(m.measurements, offset + 1)) - return r -} - -/** - * @public - */ -export function metricsToRows (metrics: Metrics, name = 'System'): (number | string)[][] { - return toStringRows(name, metricsAggregate(metrics, 50, true), 0) -} diff --git a/packages/measurements/src/types.ts b/packages/measurements/src/types.ts deleted file mode 100644 index 18db172604..0000000000 --- a/packages/measurements/src/types.ts +++ /dev/null @@ -1,132 +0,0 @@ -/** - * @public - */ -export type ParamType = string | number | boolean | undefined - -/** - * @public - */ -export type ParamsType = Record - -/** - * @public - */ -export type FullParamsType = Record - -/** - * @public - */ -export interface MetricsData { - operations: number - value: number - topResult?: { - value: number - time?: number - params: FullParamsType - }[] -} - -export interface OperationLogEntry { - op: string - params: ParamsType - start: number - end: number -} -export interface OperationLog { - ops: OperationLogEntry[] - start: number - end: number -} - -/** - * @public - */ -export interface Metrics extends MetricsData { - namedParams: ParamsType - params: Record> - measurements: Record - - opLog?: Record -} - -/** - * @public - */ -export interface MeasureLogger { - info: (message: string, obj?: Record) => void - error: (message: string, obj?: Record) => void - - warn: (message: string, obj?: Record) => void - - logOperation: (operation: string, time: number, params: ParamsType) => void - - childLogger?: (name: string, params: Record) => MeasureLogger - - close: () => Promise -} - -export interface WithOptions { - span?: true | false | 'disable' | 'skip' | 'inherit' // 'none' means no span will be created, 'disable' means context will be tracing disabled - log?: boolean - inheritParams?: boolean - - // Passed context metadata - meta?: Record -} - -/** - * @public - */ -export interface MeasureContext { - id?: string - - // Context data will be copied referenced for all child contexts. - contextData: Q - // Create a child metrics context - newChild: ( - name: string, - params: ParamsType, - opt?: { - fullParams?: FullParamsType - logger?: MeasureLogger - span?: WithOptions['span'] // By default true - meta?: Record - } - ) => MeasureContext - - metrics?: Metrics - - with: ( - name: string, - params: ParamsType, - op: (ctx: MeasureContext) => T | Promise, - fullParams?: FullParamsType | (() => FullParamsType), - opt?: WithOptions - ) => Promise - - withSync: ( - name: string, - params: ParamsType, - op: (ctx: MeasureContext) => T, - fullParams?: FullParamsType | (() => FullParamsType), - opt?: WithOptions - ) => T - - extractMeta: () => Record - - logger: MeasureLogger - - parent?: MeasureContext - getParams: () => ParamsType - - measure: (name: string, value: number, override?: boolean) => void - - // Capture error - error: (message: string, obj?: Record) => void - info: (message: string, obj?: Record) => void - warn: (message: string, obj?: Record) => void - - // Mark current context as complete - // If no value is passed, time difference will be used. - end: (value?: number) => void -} diff --git a/packages/measurements/tsconfig.json b/packages/measurements/tsconfig.json deleted file mode 100644 index b5ae22f6e4..0000000000 --- a/packages/measurements/tsconfig.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "./node_modules/@hcengineering/platform-rig/profiles/default/tsconfig.json", - - "compilerOptions": { - "rootDir": "./src", - "outDir": "./lib", - "declarationDir": "./types", - "tsBuildInfoFile": ".build/build.tsbuildinfo" - }, - "include": ["src/**/*"], - "exclude": ["node_modules", "lib", "dist", "types", "bundle"] -} \ No newline at end of file diff --git a/packages/postgres-base/.eslintrc.js b/packages/postgres-base/.eslintrc.js deleted file mode 100644 index ce90fb9646..0000000000 --- a/packages/postgres-base/.eslintrc.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = { - extends: ['./node_modules/@hcengineering/platform-rig/profiles/node/eslint.config.json'], - parserOptions: { - tsconfigRootDir: __dirname, - project: './tsconfig.json' - } -} diff --git a/packages/postgres-base/.npmignore b/packages/postgres-base/.npmignore deleted file mode 100644 index 9b083cb0c4..0000000000 --- a/packages/postgres-base/.npmignore +++ /dev/null @@ -1,8 +0,0 @@ -* -!/lib/** -!/types/** -!/src/** -!CHANGELOG.md -/lib/**/__test__/ -/types/**/__test__/ -/src/**/__test__/ \ No newline at end of file diff --git a/packages/postgres-base/CHANGELOG.json b/packages/postgres-base/CHANGELOG.json deleted file mode 100644 index 3f964c9c17..0000000000 --- a/packages/postgres-base/CHANGELOG.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "name": "@hcengineering/postgres-base", - "entries": [ - { - "version": "0.7.12", - "tag": "@hcengineering/postgres-base_v0.7.12", - "date": "Sat, 11 Oct 2025 19:18:56 GMT", - "comments": { - "patch": [ - { - "comment": "rollback eslint" - } - ], - "dependency": [ - { - "comment": "Updating dependency \"@hcengineering/platform-rig\" from `^0.7.14` to `0.7.15`" - } - ] - } - }, - { - "version": "0.7.11", - "tag": "@hcengineering/postgres-base_v0.7.11", - "date": "Sat, 11 Oct 2025 17:58:53 GMT", - "comments": { - "patch": [ - { - "comment": "Fix eslint deps" - } - ], - "dependency": [ - { - "comment": "Updating dependency \"@hcengineering/platform-rig\" from `^0.7.12` to `0.7.13`" - } - ] - } - }, - { - "version": "0.7.10", - "tag": "@hcengineering/postgres-base_v0.7.10", - "date": "Fri, 10 Oct 2025 12:32:59 GMT", - "comments": { - "dependency": [ - { - "comment": "Updating dependency \"@hcengineering/platform-rig\" from `^0.7.10` to `0.7.11`" - } - ] - } - } - ] -} diff --git a/packages/postgres-base/CHANGELOG.md b/packages/postgres-base/CHANGELOG.md deleted file mode 100644 index f81c959a6a..0000000000 --- a/packages/postgres-base/CHANGELOG.md +++ /dev/null @@ -1,23 +0,0 @@ -# Change Log - @hcengineering/postgres-base - -This log was last generated on Sat, 11 Oct 2025 19:18:56 GMT and should not be manually modified. - -## 0.7.12 -Sat, 11 Oct 2025 19:18:56 GMT - -### Patches - -- rollback eslint - -## 0.7.11 -Sat, 11 Oct 2025 17:58:53 GMT - -### Patches - -- Fix eslint deps - -## 0.7.10 -Fri, 10 Oct 2025 12:32:59 GMT - -_Initial release_ - diff --git a/packages/postgres-base/config/rig.json b/packages/postgres-base/config/rig.json deleted file mode 100644 index 78cc5a1733..0000000000 --- a/packages/postgres-base/config/rig.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "$schema": "https://developer.microsoft.com/json-schemas/rig-package/rig.schema.json", - "rigPackageName": "@hcengineering/platform-rig", - "rigProfile": "node" -} diff --git a/packages/postgres-base/jest.config.js b/packages/postgres-base/jest.config.js deleted file mode 100644 index 2cfd408b67..0000000000 --- a/packages/postgres-base/jest.config.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = { - preset: 'ts-jest', - testEnvironment: 'node', - testMatch: ['**/?(*.)+(spec|test).[jt]s?(x)'], - roots: ["./src"], - coverageReporters: ["text-summary", "html"] -} diff --git a/packages/postgres-base/package.json b/packages/postgres-base/package.json deleted file mode 100644 index 0ea5a2602a..0000000000 --- a/packages/postgres-base/package.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "name": "@hcengineering/postgres-base", - "version": "0.7.12", - "main": "lib/index.js", - "svelte": "src/index.ts", - "types": "types/index.d.ts", - "author": "Copyright Ā© Hardcore Engineering Inc.", - "template": "@hcengineering/node-package", - "license": "EPL-2.0", - "files": [ - "lib/**/*", - "!lib/**/__test__/**", - "types/**/*", - "!types/**/__test__/**", - "src/**/*", - "!src/**/__test__/**", - "README.md", - "CHANGELOG.md" - ], - "scripts": { - "build": "compile", - "build:watch": "compile", - "test": "jest --passWithNoTests --silent --forceExit", - "format": "format src", - "_phase:build": "compile transpile src", - "_phase:test": "jest --passWithNoTests --silent --forceExit", - "_phase:format": "format src", - "_phase:validate": "compile validate" - }, - "devDependencies": { - "@hcengineering/platform-rig": "workspace:^0.7.19", - "jest": "^29.7.0", - "ts-jest": "^29.1.1", - "@types/jest": "^29.5.5", - "@types/node": "^22.15.29", - "@typescript-eslint/eslint-plugin": "^6.21.0", - "@typescript-eslint/parser": "^6.21.0", - "eslint": "^8.54.0", - "eslint-config-standard-with-typescript": "^40.0.0", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^6.1.1", - "eslint-plugin-n": "^15.4.0" - }, - "dependencies": { - "postgres": "^3.4.7" - }, - "repository": "https://github.com/hcengineering/huly.utils", - "exports": { - ".": { - "types": "./types/index.d.ts", - "require": "./lib/index.js", - "import": "./lib/index.js" - } - }, - "publishConfig": { - "access": "public" - } -} diff --git a/packages/postgres-base/src/index.ts b/packages/postgres-base/src/index.ts deleted file mode 100644 index 4f820c16be..0000000000 --- a/packages/postgres-base/src/index.ts +++ /dev/null @@ -1,439 +0,0 @@ -// -// Copyright Ā© 2025 Hardcore Engineering Inc. -// -// Licensed under the Eclipse Public License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. You may -// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// -// See the License for the specific language governing permissions and -// limitations under the License. -// - -import postgres, { type Options, type ParameterOrJSON } from 'postgres' - -const clientRefs = new Map() - -let clId = 0 - -export type DBResult = any[] & { count: number } -export interface DBClient { - execute: (query: string, parameters?: ParameterOrJSON[] | undefined) => Promise - - release: () => void - - reserve: () => Promise - - raw: () => postgres.Sql -} - -export function createDBClient (client: postgres.Sql, release: () => void = () => {}): DBClient { - return { - execute: (query, parameters) => - client.unsafe(query, doFetchTypes ? parameters : convertArrayParams(parameters), getPrepare()), - release, - reserve: async () => { - const reserved = await client.reserve() - return createDBClient(reserved, () => { - reserved.release() - }) - }, - raw: () => client - } -} - -export function convertArrayParams (params?: unknown[]): any[] | undefined { - if (params === undefined) return undefined - - return params.map((param) => { - if (!Array.isArray(param)) return param - - if (param.length === 0) return '{}' - - const sanitized = param.map((item) => { - if (item === null || item === undefined) return 'NULL' - - if (typeof item === 'number' || typeof item === 'boolean') { - return String(item) - } - - if (typeof item === 'string') { - const escaped = item.replace(/\\/g, '\\\\').replace(/"/g, '\\"') - return `"${escaped}"` - } - - const json = JSON.stringify(item) - const escapedJson = json.replace(/\\/g, '\\\\').replace(/"/g, '\\"') - return `"${escapedJson}"` - }) - - return `{${sanitized.join(',')}}` - }) -} - -export async function retryTxn ( - pool: postgres.Sql, - operation: (client: postgres.TransactionSql) => Promise -): Promise { - await pool.begin(async (client) => { - const result = await operation(client) - return result - }) -} - -/** - * @public - */ -export async function shutdownPostgres (): Promise { - for (const c of connections.values()) { - c.close(true) - } - connections.clear() -} - -export interface PostgresClientReference { - getClient: () => Promise - - mgr: ConnectionMgr - close: () => void - url: () => string -} - -class PostgresClientReferenceImpl { - count: number - client: postgres.Sql - - mgr: ConnectionMgr - - constructor ( - readonly connectionString: string, - client: postgres.Sql, - readonly onclose: () => void - ) { - this.count = 0 - this.client = client - this.mgr = new ConnectionMgr(createDBClient(this.client)) - } - - url (): string { - return this.connectionString - } - - getClient (): postgres.Sql { - return this.client - } - - close (force: boolean = false): void { - this.count-- - if (this.count === 0 || force) { - if (force) { - this.count = 0 - } - void (async () => { - this.mgr.close() - this.onclose() - const cl = this.client - await cl.end({ timeout: 1 }) - })() - } - } - - addRef (): void { - this.count++ - } -} -export class ClientRef implements PostgresClientReference { - id = ++clId - constructor ( - readonly client: PostgresClientReferenceImpl, - readonly mgr: ConnectionMgr - ) { - clientRefs.set(this.id, this) - } - - url (): string { - return this.client.url() - } - - closed = false - async getClient (): Promise { - if (!this.closed) { - return this.client.getClient() - } else { - throw Error('DB client is already closed') - } - } - - close (): void { - // Do not allow double close of mongo connection client - if (!this.closed) { - clientRefs.delete(this.id) - this.closed = true - this.client.close() - } - } -} - -export let dbExtraOptions: Partial> = {} -export function setDBExtraOptions (options: Partial>): void { - dbExtraOptions = options -} - -export function getPrepare (): { prepare: boolean } { - return { prepare: dbExtraOptions.prepare ?? false } -} - -export const doFetchTypes = true - -const connections = new Map() - -/** - * Initialize a connection to DB - * @public - */ -export function getDBClient ( - connectionString: string, - database?: string, - serviceName: string = 'transactor' -): PostgresClientReference { - const extraOptions = JSON.parse(process.env.POSTGRES_OPTIONS ?? '{}') - const key = `${connectionString}${extraOptions}` - - let existing = connections.get(key) - - if (existing === undefined) { - const sql = postgres(connectionString, { - connection: { - application_name: serviceName - }, - database, - max: 10, - min: 2, - connect_timeout: 30, - idle_timeout: 0, - transform: { - undefined: null - }, - debug: false, - notice: false, - onnotice (notice) {}, - onparameter (key, value) {}, - ...dbExtraOptions, - ...extraOptions, - fetch_types: doFetchTypes - }) - - existing = new PostgresClientReferenceImpl(connectionString, sql, () => { - connections.delete(key) - }) - connections.set(key, existing) - } - // Add reference and return once closable - existing.addRef() - return new ClientRef(existing, existing.mgr) -} - -class ConnectionInfo { - // It should preserve at least one available connection in pool, other connection should be closed - available: DBClient[] = [] - - released: boolean = false - - constructor ( - readonly connectionId: string, - protected readonly client: DBClient, - readonly managed: boolean, - readonly mgrId: string - ) {} - - async withReserve (action: (reservedClient: DBClient) => Promise, forced: boolean = false): Promise { - let reserved: DBClient | undefined - - // Check if we have at least one available connection and reserve one more if required. - if (this.available.length === 0) { - if (this.managed || forced) { - reserved = await this.client.reserve() - } - } else { - reserved = this.available.shift() as DBClient - } - - try { - // Use reserved or pool - return await action(reserved ?? this.client) - } catch (err: any) { - console.error(err) - throw err - } finally { - if (this.released) { - try { - reserved?.release() - } catch (err: any) { - console.error('failed to release', err) - } - } else if (reserved !== undefined) { - if (this.available.length > 0) { - reserved?.release() - } else { - this.available.push(reserved) - } - } - } - } - - release (): void { - for (const c of [...this.available]) { - c.release() - } - this.available = [] - } -} - -export class ConnectionMgr { - private readonly connections = new Map() - constructor (protected readonly client: DBClient) {} - - async write (id: string | undefined, mgrId: string, fn: (client: DBClient) => Promise): Promise { - const backoffInterval = 25 // millis - const maxTries = 5 - let tries = 0 - - const realId = id ?? `${++clId}` - - const connection = this.getConnection(realId, mgrId, false) - - try { - while (true) { - const retry: boolean | Error = await connection.withReserve(async (client) => { - tries++ - try { - await client.execute('BEGIN;') - await fn(client) - await client.execute('COMMIT;') - return true - } catch (err: any) { - await client.execute('ROLLBACK;') - console.error({ message: 'failed to process tx', error: err.message, cause: err }) - - if (!this.isRetryableError(err) || tries === maxTries) { - return err - } else { - console.log('Transaction failed. Retrying.') - console.log(err.message) - return false - } - } - }, true) - if (retry === true) { - break - } - if (retry instanceof Error) { - // Pass it to exit - throw retry - } - // Retry for a timeout - await new Promise((resolve) => setTimeout(resolve, backoffInterval)) - } - } finally { - if (!connection.managed) { - // We need to relase in case it temporaty connection was used - connection.release() - } - } - } - - async retry (id: string | undefined, mgrId: string, fn: (client: DBClient) => Promise): Promise { - const backoffInterval = 25 // millis - const maxTries = 5 - let tries = 0 - - const realId = id ?? `${++clId}` - // Will reuse reserved if had and use new one if not - const connection = this.getConnection(realId, mgrId, false) - - try { - while (true) { - const retry: false | { result: any } | Error = await connection.withReserve(async (client) => { - tries++ - try { - return { result: await fn(client) } - } catch (err: any) { - console.error({ message: 'failed to process sql', error: err.message, cause: err }) - if (!this.isRetryableError(err) || tries === maxTries) { - return err - } else { - console.log('Read Transaction failed. Retrying.') - console.log(err.message) - return false - } - } - }) - if (retry instanceof Error) { - // Pass it to exit - throw retry - } - if (retry === false) { - // Retry for a timeout - await new Promise((resolve) => setTimeout(resolve, backoffInterval)) - continue - } - return retry.result - } - } finally { - if (!connection.managed) { - // We need to relase in case it temporaty connection was used - connection.release() - } - } - } - - release (id: string): void { - const conn = this.connections.get(id) - if (conn !== undefined) { - conn.released = true - this.connections.delete(id) // We need to delete first - conn.release() - } - } - - close (mgrId?: string): void { - const cnts = this.connections - for (const [k, conn] of Array.from(cnts.entries())) { - if (mgrId !== undefined && conn.mgrId !== mgrId) { - continue - } - cnts.delete(k) - try { - conn.release() - } catch (err: any) { - console.error('failed to release connection') - } - } - } - - getConnection (id: string, mgrId: string, managed: boolean = true): ConnectionInfo { - let conn = this.connections.get(id) - if (conn === undefined) { - conn = new ConnectionInfo(id, this.client, managed, mgrId) - } - if (managed) { - this.connections.set(id, conn) - } - return conn - } - - private isRetryableError (err: any): boolean { - const msg: string = err?.message ?? '' - - return ( - err.code === '40001' || // Retry transaction - err.code === '55P03' || // Lock not available - err.code === 'CONNECTION_CLOSED' || // This error is thrown if the connection was closed without an error. - err.code === 'CONNECTION_DESTROYED' || // This error is thrown for any queries that were pending when the timeout to sql.end({ timeout: X }) was reached. If the DB client is being closed completely retry will result in CONNECTION_ENDED which is not retried so should be fine. - msg.includes('RETRY_SERIALIZABLE') - ) - } -} diff --git a/packages/postgres-base/tsconfig.json b/packages/postgres-base/tsconfig.json deleted file mode 100644 index c6a877cf6c..0000000000 --- a/packages/postgres-base/tsconfig.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "./node_modules/@hcengineering/platform-rig/profiles/node/tsconfig.json", - - "compilerOptions": { - "rootDir": "./src", - "outDir": "./lib", - "declarationDir": "./types", - "tsBuildInfoFile": ".build/build.tsbuildinfo" - }, - "include": ["src/**/*"], - "exclude": ["node_modules", "lib", "dist", "types", "bundle"] -} \ No newline at end of file diff --git a/rush.json b/rush.json index 4142d81375..cd32bc43ce 100644 --- a/rush.json +++ b/rush.json @@ -341,21 +341,6 @@ "reviewCategory": "tools", "shouldPublish": true }, - { - "packageName": "@hcengineering/measurements", - "projectFolder": "packages/measurements", - "shouldPublish": true - }, - { - "packageName": "@hcengineering/measurements-otlp", - "projectFolder": "packages/measurements-otlp", - "shouldPublish": true - }, - { - "packageName": "@hcengineering/postgres-base", - "projectFolder": "packages/postgres-base", - "shouldPublish": true - }, { "packageName": "@hcengineering/ui-test", "projectFolder": "packages/ui-test",