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",